1、tf.shape(varA)和varA.get_shape()
这两个API都是返回varA的size大小,但是tf.shape(varA)中varA的数据类型可以是Tensor、list、Array;而varA.get_shape()中varA的数据类型只能是Tensor,返回的是一个元组tuple。
例如:
import tensorflow as tf
import numpy as np
varX=tf.constant([[1,2,3],[4,5,6],[7,8,9]])
varY=[[1,2,3],[4,5,6],[7,8,9]]
varZ=np.arange(9).reshape([1,3,3])
sess=tf.Session()
varX_shape=tf.shape(varX)
varY_shape=tf.shape(varY)
varZ_shape=tf.shape(varZ)
print sess.run(varX_shape)
print sess.run(varY_shape)
print sess.run(varZ_shape)
输出结果是:
[3 3]
[3 3]
[1 3 3]
而:
varX_shape=varX.get_shape()
返回varX_shape是元组TensorShape([Dimension(3), Dimension(3)]),所以不能用sess.run(varX_shape)输出结果,因为既不是Tensor,也不是string。但是可以用.as_list()得到size,即
varX_shape=varX.get_shape().as_list()返回varX_shape=[3, 3]
varY_shape=varY.get_shape()则会报错AttributeError: 'list' object has no attribute 'get_shape',因为varY不是Tensor,是list
varZ_shape=varZ.get_shape()也会报错AttributeError: 'numpy.ndarray' object has no attribute 'get_shape',因为varZ也不是Tensor,是Array。
所以,如果一个Tensor的静态shape未定义,则可用上述API来获得其动态shape。
PS: 看一个varX的维度数,可以看varX定义或者输出的最左边(或最右边)有几个[(或])。
2、tf.Tensor.set_shape()和tf.reshape()
tf.Tensor.set_shape的函数调用为tf.Tensor.set_shape(shape),参数shape为要调整为的形状(注意shape里最多只能有一个维度的值可以为-1,表示该维度自动计算得到),作用是更新一个Tensor对象的静态shape。如果该Tensor对象的静态shape信息不能够直接推导出来时,tf.Tensor.set_shape()设置该Tensor额外的shape信息,要注意的是该方法不改变Tensor的动态shape信息。
tf.reshape()的函数调用为tf.reshape(tensorVar, shape, name=None),参数tensorVar为被调整维度的张量,shape为要调整为的形状,作用为返回一个shape形状的新Tensor。
示例:
varA = [1, 2, 3, 4, 5, 6, 7, 8, 9]
tensorVarA = tf.constant(varA)
tensorVarB = tf.reshape(tensorVarA, [1, 3, 3])
with tf.Session() as sess:
print(sess.run(tensorVarB))
输出为:
[[[1 2 3]
[4 5 6]
[7 8 9]]]
3、tf.ConfigProto函数
该API用在创建session的时候,用于对session进行参数配置。调用过程为:
with tf.Session(config = tf.ConfigProto(), ...)
tf.ConfigProto()由以下两个参数:
log_device_placement = True/Flase,指示是否打印参数在设备上的分配信息
allow_soft_placement = True/Flase,指示如果指定的设备不存在是,是否允许TensorFlow自动分配其他设备。为了避免出现指定设备不存在而出错的情况,可以在创建session的时候将allow_soft_placement设置为True,这样TensorFlow会自动选择一个存在并且支持的设备来运行operation
gpu_options = ...,设置每个GPU应该使用的显存容量,由tf.GPUOptions(per_process_gpu_memory_fraction = 0.9)设置
tf.ConfigProto().gpu_options.allow_growth = True/False,指示使用的GPU容量,是否按需增加
所以,一个完整的tf.ConfigProto使用如下:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9)
config = tf.ConfigProto(log_device_placement = True, allow_soft_placement = True, gpu_options = gpu_options)
config.gpu_options.allow_growth = True
With tf.Session(config = config, ...) as sess:
...
PS: CUDA_VISIBLE_DEVICE=...,指示使用哪块GPU运行,如:
CUDA_VISIBLE_DEVICE=0 python a.py,在0号GPU上运行a.py
CUDA_VISIBLE_DEVICE=0,1 python b.py,在0、1号GPU上运行b.py
4、tf.where函数
tf.where的函数调用为tf.where(condition, x = None, y = None, name = None),根据condition判定返回。即condition是True,选择x;condition是False,选择y。
5、tf.nn.dropout函数
tf.nn.dropout的函数调用为tf.nn.dropout(tensorVar, keep_prob, noise_shape = None, seed = None, name = None),使tensor以一定的概率保留。tensorVar为输入tensor,keep_prob为神经元保留的概率。
典型用法如下:
tensorVarY =tf.matmul(tf.nn.dropout(tensorVarX, keep_prob = 0.5), W)
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob = 0.5)为RNN中dropout的用法
PS: 一般dropout在训练的时候用,test的时候就不需要dropout了。
6、Saver
Saver的函数调用为tf.train.Saver(),实现保存训练的结果,即保存模型的参数,以便下一次的迭代训练或用于预测。Saver类提供了以下三点功能:
1)提供了向checkpoint文件保存和从checkpoint文件中恢复变量的相关方法。checkpoint文件是一个二进制文件,它把变量名映射到对应的tensor值 。
2)只要提供一个计数器,当计数器触发时,Saver类可以自动的生成checkpoint文件。这让我们可以在训练过程中保存多个中间结果。例如,我们可以保存每一步训练的结果。
3)为了避免填满整个磁盘,Saver可以自动的管理checkpoint文件。例如,我们可以指定保存最近的N个checkpoint文件。checkpoint文件指明最新的模型,和模型的存储位置。restore时,也是查看checkpoint文件获取最新的模型。
典型用法如下:
import os
cwd = os.cwd()
saver = tf.train.Saver()
saver.save(sess, cwd + 'model.ckpt', global_step)
预测或载入模型:
ckpt = tf.train.get_checkpoint_state(cwd)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
print(sess.run(W))