首页 > 代码库 > 『TensorFlow』常用函数实践笔记

『TensorFlow』常用函数实践笔记

查询列表:

『TensorFlow』函数查询列表_数值计算

『TensorFlow』函数查询列表_张量属性调整

『TensorFlow』函数查询列表_神经网络相关

经验之谈:

节点张量铺设好了之后,只要不加sess.run(),可以运行脚本检查张量节点是否匹配,无需传入实际数据流。

‘conv1‘指节点,‘conv1:0‘指节点输出的第一个张量。

sess上下文环境中的函数调用即使不传入sess句柄,函数体内也存在于默认的sess环境中,可以直接sess.run()。

image_holder = tf.placeholder(tf.float32,[None, None, None, 3]),使用None回避指定大小。

张量相关:

tf.cast():bool->数字

re = tf.cast([True,False],tf.float32)
sess = tf.Session()
sess.run(re)
# Out[6]: 
# array([ 1.,  0.], dtype=float32)

tf.argmax:(list,维度)

re = tf.argmax([[0,0.5]],1)
sess.run(re)
# Out[20]: 
# array([1])

 tf.reduce_mean():求均值,直接给源码定义中的注释

For example:
  ```python
  # ‘x‘ is [[1., 1.]
  #         [2., 2.]]
  tf.reduce_mean(x) ==> 1.5
  tf.reduce_mean(x, 0) ==> [1.5, 1.5]
  tf.reduce_mean(x, 1) ==> [1.,  2.]
  ```
reduction_indices: The old (deprecated) name for axis.

 tf.squeeze():数据降维,只裁剪等于1的维度

不指定维度则裁剪所有长度为1的维度

import tensorflow as tf

arr = tf.Variable(tf.truncated_normal([3,4,1,6,1], stddev=0.1))

sess = tf.Session()
sess.run(tf.global_variables_initializer())

sess.run(arr).shape
# Out[12]: 
# (3, 4, 1, 6, 1)
sess.run(tf.squeeze(arr,[2,])).shape
# Out[17]: 
# (3, 4, 6, 1)
sess.run(tf.squeeze(arr,[2,4])).shape
# Out[16]: 
# (3, 4, 6)
sess.run(tf.squeeze(arr)).shape
# Out[19]: 
# (3, 4, 6)

tf.nn.softmax()分类器:把数组最后一维转化为概率分布

import  tensorflow as tf  
sess.run(tf.nn.softmax([1.,2.,3.,4.]))
# Out[12]: 
# array([ 0.0320586 ,  0.08714432,  0.23688281,  0.64391422], dtype=float32)
sess.run(tf.nn.softmax([1.,1.,1.,1.]))
# Out[13]: 
# array([ 0.25,  0.25,  0.25,  0.25], dtype=float32)
sess.run(tf.nn.softmax([[1.,1.,1.,1.],[7.,1.,1.,1.]]))
# Out[16]: 
# array([[ 0.25      ,  0.25      ,  0.25      ,  0.25      ],
#        [ 0.99261862,  0.00246046,  0.00246046,  0.00246046]], dtype=float32)

 tf.concat([t1,t2,t3...],dim):矩阵拼接,注意在1.x版本之前和之后dim和[t]的顺序是改变了的

这个函数乍看之下不好理解合成方向,实际把合成张量转化为np数组查看shape后就很好理解了:

import tensorflow as tf
import numpy as np
t1 = np.asarray([[1, 2, 3], [4, 5, 6]])
t2 = np.asarray([[7, 8, 9], [10, 11, 12]])
print(t1.shape)
# (2, 3)
# 第零维度合成就是扩展数字2的大小
re = tf.concat([t1, t2],0) 
sess = tf.Session()
sess.run(re)
# array([[ 1,  2,  3],
#        [ 4,  5,  6],
#        [ 7,  8,  9],
#        [10, 11, 12]])

# 第一维度合成就是扩展数字3的大小
re = tf.concat([t1, t2],1) 
sess = tf.Session()
sess.run(re)
# array([[ 1,  2,  3,  7,  8,  9],
#        [ 4,  5,  6, 10, 11, 12]])

t1 = np.zeros([2,3,3])
t2 = np.ones([2,3,3])
print(t1,‘\n\n‘,t2)
re = tf.concat([t1, t2],2) 
sess = tf.Session()
sess.run(re)

# 第二维度合成就是扩展末尾的数字3的大小
# array([[[ 0.,  0.,  0.,  1.,  1.,  1.],
#         [ 0.,  0.,  0.,  1.,  1.,  1.],
#         [ 0.,  0.,  0.,  1.,  1.,  1.]],

#        [[ 0.,  0.,  0.,  1.,  1.,  1.],
#         [ 0.,  0.,  0.,  1.,  1.,  1.],
#         [ 0.,  0.,  0.,  1.,  1.,  1.]]])

 顺便一提,或者说接下来的其实才是很重要,合成神经网络输出的时候在深度方向(inception_v3)是数字3,[batch,heigh,width,depth]。

 

文件读写:

tf.gfile.FastGFile():读写文件,句柄具有.read()方法,实测凡是使用FastGFile的地方换成open()并不会报错(包括读取普通文件和读取tf模型文件)

‘‘‘
本代码也是加载图pb文件并获取节点张量句柄的标准流程,feed_dict输入节点 & sess.run(输出节点)就可以使用模型了
‘‘‘

#with gfile.FastGFile(os.path.join(MODEL_DIR,MODEL_FILE),‘rb‘) as f:       # 阅读器上下文
with open(os.path.join(MODEL_DIR, MODEL_FILE), ‘rb‘) as f:                 # 阅读器上下文
    graph_def = tf.GraphDef()                                              # 生成图
    graph_def.ParseFromString(f.read())                                    # 图加载模型
bottleneck_tensor,jpeg_data_tensor = tf.import_graph_def(                  # 从图上读取张量,同时把图设为默认图
   graph_def,
   return_elements=[BOTTLENECK_TENSOR_NAME,JPEG_DATA_TENSOR_NAME])


print(gfile.FastGFile(image_path,‘rb‘).read()==open(image_path,‘rb‘).read()) 
# True

 图片操作:

『TensorFlow』迁移学习_他山之石,可以攻玉中有更为详细的介绍

import tensorflow as tf
import matplotlib.pyplot as plt

# 使用‘r‘会出错,无法解码,只能以2进制形式读取
# img_raw = tf.gfile.FastGFile(‘./123.png‘,‘rb‘).read()
img_raw = open(‘./123.png‘,‘rb‘).read()

# 把二进制文件解码为uint8
img_0 = tf.image.decode_png(img_raw) #<------
# img_1 = tf.image.convert_image_dtype(img_0,dtype=tf.float32) #<------
# 绘图不用这句,它转换格式后用于后续图片预处理

sess = tf.Session()
print(sess.run(img_0).shape)
plt.imshow(sess.run(img_0))
plt.show()

 

变量相关:

tf.Variable()                                                                         # 声明变量
tf.get_variable()                                                                     # 声明变量
tf.global_variables_initializer()                                                     # 激活变量

 

可视化相关:

命名空间设置好:添加记录节点 -> 汇总记录节点 -> run汇总节点 -> [书写器生成]书写入文件 [-> 刷新缓冲区]

tf.summary.FileWriter(‘./‘, sess.graph)                                               # 书写器生成,会自动记录指定图
tf.summary.histogram(layer_name+‘/weights‘,Weights)                                   # 张量记录
tf.summary.scalar = (‘loss‘,cross_entropy)                                            # 标量记录
merged = tf.summary.merge_all()                                                       # 记录激活
train_writer = tf.summary.FileWriter(‘logs/train‘,sess.graph)                         # 书写器生成
train_result = sess.run(merged, feed_dict={xs: X_train, ys: y_train, keep_prob:1})    # run记录
train_writer.add_summary(train_result,i)                                              # 书写记录
train_writer.flush()                                                                  # 刷新缓冲区,立即写入文件

 

 域:

上下文内,指定层参数一并赋予

with arg_scope(
          [layers.conv2d, layers_lib.max_pool2d, layers_lib.avg_pool2d],
          stride=1,
          padding=‘SAME‘):
    pass

集合:

集合转换为字典,{节点名:输出张量值}

end_points = slim.utils.convert_collection_to_dict(end_points_collection)

损失函数:

计算softmax之后的交叉熵,方法一只针对单分类问题,据介绍优化更好可加速计算,labels形式batch大小的[条目1类,条目2类...],logits形式为batch大小的[[0,1,0...],[1,0,1,0...]‘...]这样,一般需要tf.argmax()辅助;方法二范用,labels和logits和方法一的logits样式一致:

cross_entropy_mean = tf.reduce_mean(
    tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=tf.argmax(labels,1), logits=logits), name=‘cross_entropy‘)

cross_entropy_mean = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(
        logits=logits, labels=labels), name=‘cross_entropy‘)

 

『TensorFlow』常用函数实践笔记