tensorflow 技巧API-不断更新(一)

本文深入探讨了TensorFlow中的关键API,包括变量管理、形状操作、学习率衰减策略、模型保存与恢复、数据读取以及训练与验证。详细介绍了tf.unstack与tf.stack、tf.trainable_variables()、tf.get_shape()、学习率衰减函数如exponential_decay,并讲解了tf.train.Saver如何保存和恢复模型。同时,提到了tf.train.batch与tf.train.shuffle_batch在数据读取中的区别,以及如何在训练过程中进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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来控制是否验证。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值