会话(Session)的作用
- 运行图的结构
- 分配资源计算
- 掌控资源(变量,队列,线程)
会话运行的过程:
sess = tf.session sess.run(…) sess.close()
张量的几种属性
gragh 张量所属的默认图
op 张量的操作名
name 张量的字符串描述
shape 张量的形状
静态形状:创建一个张量,初始状态的形状。
tf.Tensor.get_shape() 获取静态形状
tf.Tensor.set_shape() 更新Tensor对象的静态形状,设置之后不能再次设置
对于静态形状来说,不能跨维度修改
动态形状:一种描述原始张量字啊执行过程中的一种形状(动态变化)
tf.reshape: 创建一个具有不同动态形状的新张量
在动态形状改变的时候,需要注意元素数量(个数)要匹配,比如[3, 8] tf.reshape成[5,7]不可以 ,可以改成[4, 6] 或者[2,12]
张量的一些操作
-
固定值的张量生成:
tf.zeros(shape, dtype = tf.float32, name = None)
创建一个指定形状,且元素值都为0的张量 -
创建随机值张量:
tf.random_normal(shape, mean = 0.0, stddev=1.0, dtype=tf.float32.seed=None, name=None)
其中mean是平均值,stddev是标准差 -
张量变换:
tf.cast(x, dtype, name = None) ,将张量中的数值改变为指定类型 -
张量的切片和扩展:
tf.concat(values,axis, name=‘concat’)
values为多个张量的列表,比如要合并两个张量a和b, value=[a,b]
axis=0,表示按行合并,即行数增加, axis=1,表示按列合并,即列数增加 -
矩阵的乘法:tf.matmul(x,w)
矩阵平方:tf.square(error)
求均值:tf.reduce_mean(error)
所有对变量op的操作都要在会话中初始化且运行
with tf.Session as sess:
sess.run(op名称)
变量op是可以持久化保存的,而普通张量不行
使用tensorboard生成模型结构图
- 将事件文件写入到指定目录
tf.summary.fileWriter(“文件的目录”,gragh=图的描述符(指向图的一个变量op)) - tensorboard --lodir “/path/to/your/events/”
- 浏览器打开127.0.0.1:6006
定义模型并训练的过程
- 准别好特征和目标值(数据)
- 建立模型
- 定义损失函数
- 梯度下降优化损失(loss)过程,在tf已有的api中指定学习率即可
梯度下降API:
tf.train.GradientDescentOptimizer(learning_rate)
梯度下降优化
learning_rate:学习率
method:
return:梯度下降op
模型的参数必须要使用变量进行初始化(tf.variable)
********************
if name == main:
方法名
即运行主函数
********************
模型的保存与加载
tf.train.Saver(var_list=None,max_to_keep=5)
**var_list:**指定将要保存和还原的变量。它可以作为一个
dict或一个列表传递.
**max_to_keep:**指示要保留的最近检查点文件的最大数量。
创建新文件时,会删除较旧的文件。如果无或0,则保留所有
检查点文件。默认为5(即保留最新的5个检查点文件。)
例如:
saver.save(sess, '/tmp/ckpt/test/model')
saver.restore(sess, '/tmp/ckpt/test/model')
保存文件格式:checkpoint文件
保存模型的代码实现过程:
- 在会话前面定义一个模型保存器:
saver = tf.train.Saver() - 然后在会话中的程序想要保存模型的位置,增加下面的代码:
saver.save(sess, “/你想/保存/模型文件/的路径/”)
随后会生成相应的模型文件
加载模型的代码实现过程
- 在会话中,判断指定路径是否有模型,如果有就执行下列代码:
saver.restore(sess, “/模型保存的/路径/”)
其中saver是之前的定义的模型保存器
自定义命令行参数(比较重要)
需要在方法外部进行定义:
-
定义命令行参数,即有哪些参数需要在运行时候进行指定
tf.app.flags.DEFINE_integer(“参数名称”,默认值, “说明” ) -
然后定义获取命令行参数的名字
flags = tf.app.flags.FLAGS
其中flags是自己指定的,用于接收参数 -
然后在会话中,将指定的参数使用flags.参数名称进行替换
-
最后在命令行执行该pyhon文件的时候,使用–参数名=值,来指定参数数值即可运行。
e.g:FLAGS = tf.app.DEFINE_integer("is_train", 1, "指定程序训练还是预测") 在运行该程序时: python model.py --is_train=0 即手动给is_train参数传值
文件读取
-
通过API构造一个文件队列
-
构造文件阅读器,读取队列内容,并解码
对于不同文件有不同的读取方式:
1. csv文件:读取一行,
2. 二进制文件:指定一个样本的bytes读取;
3. 图片文件:一张一张读取 -
批处理
一些文件处理的API:
-
文件读取API—文件队列构造:
tf.train.string_input_producer(string_tensor, shuffle=True) 将输出字符串(例如文件名)输入到管道队列 string_tensor 含有文件名的1阶张量 num_epochs:过几遍数据,默认无限过数据 return:具有输出字符串的队列
图片批处理流程:
- 构造图片文件队列
- 构造图片阅读器
- 读取图片数据
- 处理图片数据
图片基本操作API
-
重置图片尺寸:
tf.image.resize_images(images, size)
images:4-D形状[batch, height, width, channels]或3-D形状的张
量[height, width, channels]的图片数据
size:1-D int32张量:new_height, new_width,图像的新尺寸
2. 图像读取器
tf.WholeFileReader
将文件的全部内容作为值输出的读取器
return:读取器实例
read(file_queue):输出将是一个文件名(key)和该文件的内容(值)
-
解码器
tf.image.decode_jpeg(contents)
将JPEG编码的图像解码为uint8张量
return:uint8张量,3-D形状[height, width, channels]tf.image.decode_png(contents)
将PNG编码的图像解码为uint8或uint16张量
return:张量类型,3-D形状[height, width, channels] -
定义数据占位符
-
建立模型
-
计算损失
-
梯度下降优化