1、模型保存
模型保存需要使用函数 tf.train.Saver(),
a)创建saver时,可以指定需要存储的tensor,如果没有指定,则全部保存。
b) 创建saver时,可以指定保存的模型个数,利用max_to_keep=4,则最终会保存4个模型。
c) saver.save()函数里面可以设定global_step,说明是哪一步保存的模型。
d) 程序结束后,会生成四个文件:存储网络结构.meta、存储训练好的参数.data和.index、记录最新的模型checkpoint。
示例: saver.save(sess, "model_ame, global_step=epoch)
https://blog.csdn.net/liuxiao214/article/details/79048136
2、"Can not convert a ndarray into a Tensor or Operation"报错
https://blog.csdn.net/michael__corleone/article/details/79007425
test_fc1, test_fc2, Ys = sess.run([test_fc1, test_fc2, fc3],
feed_dict = {x1:xs1, x2:xs2, test_x1:test_img_raw, test_x2:test_img_raw1})
错误指示是run这里出了错,原因:接收的参数名和run()里面的参数名一样了,一般 第一次不会报错,下一次运行中,test_fc1,test_fc2变量名已有了,直接跑会和你前面定义的test_fc1,test_fc2相关运算冲突。 所以将接收的变量名改了就可以了。
3、tensorflow的axis理解
https://blog.csdn.net/m0_37041325/article/details/77155517
tensorFlow里的axis概念和numpy里是一样的,指tensor的某一维。举例:
import tensorflow as tf x=tf.constant([[1.,2.],[5.,2.]]) xShape=tf.shape(x) z1=tf.reduce_mean(x,axis=0)#沿axis=0操作 z2=tf.reduce_mean(x,axis=1)#沿axis=1操作 with tf.Session() as sess: xShapeValue,d1,d2=sess.run([xShape,z1,z2]) print('shape= %s'%(xShapeValue)) print(d1) print(d2) #输出: shape= [2 2] [3. 2.] [1.5 3.5]
程序里定义了一个常量tensor,这个tensor的shape是[2,2]即2行2列(x00=1,x01=2,x10=5,x11=2),在程序中,当指定x在axis=0进行求平均操作时,就是指定x00,x10进行求平均,x01,x11进行求平均的操作,当指定x在axis=1进行求平均操作时,就是指定x00,x10进行求平均,x01,x11进行求平均操作。
总结起来也就是说,当指定axis进行操作时,就使tensor就沿着这个axis变化,而其他的axis不变,按照这样的规则,遍历一次tensor,把得到的元素进行相应的操作。在上面的程序中,指定axis=0,操作,则axis=1这个轴上的数就不变。
下面以几个函数的使用来更进一步说明,
//1. tf.reduce_sum(input_tensor, axis) 沿着维度sxis计算和 x= [[1, 1, 1], [1, 1, 1]] //求和,在所有维度操作,也就相当于对所有元素求和 tf.reduce_sum(x) ==> 6 //在维度0上操作,在这个例子中实际就是按列(维度1)求和 tf.reduce_sum(x, 0) ==> [2, 2, 2] //在维度1上操作,在这个例子中实际就是按行(维度0)求和 tf.reduce_sum(x, 1) ==> [3, 3] //2. tf.concat(values, axis):Concatenates tensors along one dimension t1 = [[1, 2, 3], [4, 5, 6]] //2*3维 t2 = [[7, 8, 9], [10, 11, 12]] //2*3维 tf.concat([t1, t2], 0) == > [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] //在维度0上连接,那么第一个维度会增加,在这里就是行会增多,结果是4*3维矩阵. x=tf.ones((3,2,2)) //shape (3,2,2) C=[x,x,x] print(tf.concat(C,2).shape) == > (3,2,6) // 再看这个例子,三维矩阵的连接,在第3个维度上,也就是维度2, 结果第三个维度会增加,也就是(3,2,6)
4、 scope 命名方法
tf.name_scope()与tf.variable_scope()
代码示例(以卷积层为例): https://blog.csdn.net/Jerr__y/article/details/70809528
概念: https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-12-scope/
tf.name_scope() 主要是用来管理命名空间的,这样子让我们的整个模型更加有条理。而 tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 来完成变量共享的功能。
5、 获取变量维度信息
https://blog.csdn.net/shuzfan/article/details/79051042
6、 tf.estimator相关
6.1、tf.estimator.Estimator介绍
https://www.cnblogs.com/zongfa/p/10149483.html
https://www.cnblogs.com/wushangjue/p/8334539.html
6.2、tf.estimator.TrainSpec
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-s7gp2pdn.html
7、tf.data.Dataset.shuffle
7.1、bufer_size 理解
https://www.cnblogs.com/wisir/p/12932154.html
https://zhuanlan.zhihu.com/p/42417456
tensorflow中的数据集类Dataset有一个shuffle方法,用来打乱数据集中数据顺序,训练时非常常用。其中shuffle方法有一个参数buffer_size,很令人费解。
详细说明见上述链接。
也就是说,buffer_size的作用就是存放数据集中部分数据的缓冲区大小,每次取数据是从缓冲区中随机取出一个item,该item是一个batch(与batch_size的关系),取出后再拿数据集中未在缓冲区出现过的数据(依次)去填充该缓冲区的空缺位置。
附Tensorflow 基本操作链接: https://www.cnblogs.com/wuzhitj/p/6648585.html