tensorflow点滴笔记

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

posted @ 2018-07-02 20:00  chease  阅读(204)  评论(0编辑  收藏  举报