tf.unstack与tf.stack
tf.stack是对两个矩阵进行拼接
tf.unstack是对两个矩阵进行分解
tf.trainable_variables(), tf.all_variables(), tf.global_variables()
变量越多的时候就需要查看管理变量的函数
trainable_variables():这个函数可以查看训练的变量,在我们生成变量的时候,无论是使用tf.variable()还是tf.get_variable()的生成变量,都会涉及到一个trainable,其默认为True
对于一些不需要训练的变量,比较典型比如学习率或者计步器等,需要设计为False,
global_variables(): 如果要查看所有变量,包括学习率即可以通过此函数实现
all_variables(): 与tf.global_variables()作用拥有相似的功能,只是版本问题
tf.get_shape()
一般张量用此API 获得shape
tf.train.exponential_decay
tf.train.inverse_time_decay
tf.train.natural_exp_decay
tf.train.piecewise_constant
tf.train.polynomial_decay
学习率指数衰减
tf.train.Saver
功能:保存和恢复变量,在checkpoints里的save和restore变量,还提供了运行这些操作的便捷方法
max_to_keep表示要保留的最近文件的最大数量,默认为5个
keep_checkpoint_every_n_hours: 保留最新的max_to_keep检查点文件之外,还可以希望每N个小时训练保留文件
方法:
save: 当定义好Saver类后仍然需要调用save()方法来保存模型,将这些参数传递到构造函数不会自动为您保存变量
saver.save(sess,'ckpt/mnist.ckpt',global_step=step)
restore()函数,需要两个参数 restore(sess,save_path),save_path指的是保存的模型路径,可以使用tf.train.latest_checkpoint()来自动获取最后一次保存的模型
model_file = tf.train.latest_checkpoint('ckpt/')
saver.restore(sess,model_file)
参考:https://www.cnblogs.com/denny402/p/6940134.html
tf.train.batch tf.train.shuffle_batch
tf.train.batch与tf.train.shuffle_batch的作用都是从队列中读取数据
tf.train.batch是读取有序队列
tf.train.shuffle_batch是将队列中数据打乱后,再读取出来,因此队列中剩下的数据也是乱序的,队头一直在补充,
capacity可以看作是局部数据的范围,读取的数据是基于这个范围的,在这个范围内,min_after_dequeue越大,数据越乱
参考:https://blog.youkuaiyun.com/ying86615791/article/details/73864381
tf的模型保存
tf.train.write_graph()默认情况下只导出了网络的定义,没有权重
tf.train.Saver().save导出了网络的定义与权重,但是是分离的
新版本tensorflow一般会包含四个文件meta, data, index checkpoint。其中data文件为模型中训练变量, meta为网络图,checkpoint是一个list,包含最近保存的模型,index没有什么作用(好像)
在保存模型的时候,计算图已经保存过一次了,并且随着训练的进行,计算图不会改变,因此以后的保存,就可以使用write_meta_graph = False,不保存计算图了
saver.save(sess, 'my-model', global_step=step,write_meta_graph=False)
tf.train.Saver()默认保存与加载计算图上的所有信息,但是有些时候只需要加载部分信息,比如在测试的时候,只需要知道如何从神经网络的输入层经过前向传播到输出层即可,不需要变量的初始化,模型保存等辅助节点,因此需要通过convert_variables_to_constants将计算图上所有的变量以及取值通过常量保存,这样计算图与权重会保存到一个文件中
参考:https://blog.youkuaiyun.com/lovelyaiq/article/details/78646401
Tensorflow 一边训练一边验证(training and validation)
1,首先可以知道采用placeholder()载入不同的数据来进行计算
2, 如果处理的数据量很大的时候,使用tf.placeholde()来载入数据会严重的拖慢训练的进度,因此,常用tfrecord文件来读取数据
但是会在原图上添加许多新的节点,这些节点的参数都需要重新初始化,也就是说,验证的时候并不是使用训练的权重
train_batch, label_batch = decode_train()
val_train_batch, val_label_batch = decode_validation()
train_result = inference(train_batch)
...
loss = ..
train_op = ...
...
if validation == True:
val_result = inference(val_train_batch)
val_loss = ..
with tf.Session() as sess:
sess.run([loss, train_op])
if validation == True:
sess.run([val_result, val_loss])
3,用一个tf.placeholder来控制是否训练,验证
def inference(input_):
...
...
...
return inference_result
train_batch, label_batch = decode_train()
val_batch, val_label = decode_validation()
is_training = tf.placeholder(tf.bool, shape=())
x = tf.cond(is_training, lambda: train_batch, lambda: val_batch)
y = tf.cond(is_training, lambda: train_label, lambda: val_label)
logits = inference(x)
loss = cal_loss(logits, y)
train_op = optimize(loss)
with tf.Session() as sess:
loss, _ = sess.run([loss, train_op], feed_dict={is_training: True})
if validation == True:
loss = sess.run(loss, feed_dict={is_training: False})
使用这种方式就可以在一个大图中创建一个分支条件,从而控制placeholder来控制是否验证。