0. 参考文章
1. MNIST机器学习入门
2. 基本使用
3. 张量的阶、形状、数据类型
4. 深入MNIST
5. TensorFlow运作方式入门
6. tensorboard官方参考文档
7. tensorflow机器学习模型上线
1. 基础篇(概念和卷积经典函数api)
tensorflow运行op的最最基础概念 :在TensorFlow中,所有的操作只有当你执行(run),或者另一个操作依赖于它的输出时才会运行
(这里可以参考这些文章)
1. MNIST机器学习入门
2. 基本使用
3. 张量的阶、形状、数据类型
- tensorlfow的计算图概念
- session概念
- TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.
- 一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法.
- feed和fetch
feed喂数据
fetch接受run某个op,这个op返回的数据
- tensorflow卷积函数
W = tf.truncated_normal([5, 5, 1, 32], stddev=0.1)
tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
1、shape= [5,5,1,32]
前面两个5,表示卷积核的长宽分别为5,1表示输入图像对应的通道数,比如输入的图像是单通道的则设置为1,如果是RGB三通道的,则设置为3. 32表示卷积核的个数,对应输出32张图
2、strides=[1, 2, 2, 1]
四个元素规定前后必须为1,中间两个数表示水平滑动和垂直滑动步长值
3、padding=‘SAME’
SAME表示在扫描的时候,如果遇到卷积核比剩下的元素要大时,这个时候需要补0进行最后一次的行扫描或者列扫描
- tensorflow池化函数
tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')
- tf.reshape函数
x_image = tf.reshape(x, [-1,28,28,1])
重塑张量,一般用于卷积和全连接层连接之间步骤,数据输入时也常见
- tf.nn.dropout
# 全连接层
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
# dropout
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
- 为了防止或减轻过拟合而使用的函数,它一般用在全连接层后
- dropout需要传入keep_porb,这个参数一般feed进入(当然,一般evaluation和预测时,此值传1,神经单元不失活)
- tf.equal
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
- tf.argmax返回对应数据最大的下坐标(矩阵)
- 比较两个张量,返回值为bool类型
- 通常用tf.cast将bool类型强转为float方便计算准确率
- 上述代码组合常见在分类模型最后
- tf.name_scope and tf.variable_scope
具体参考文章
(1) tf.variable_scope可以让变量有相同的命名,包括tf.get_variable得到的变量,还有tf.Variable的变量
(2) tf.name_scope可以让变量有相同的命名,只是限于tf.Variable的变量
(3) 解释一下: 使用命名空间的好处很多,比如你的代码会分块(如果你用tensorboard画图,这样分块也会体现在图上,更清晰),再比如你可以通过循环方式创建神经网络层(卷积层)而不用担心命名问题(name)等
-
tf.get_variable
- 文章推荐用tf.get_variable(原因见文章),个人赞同.
- 不过我看过很多代码,用的大多是tf.Variable(),只记得好像在embedding层时见过用tf.get_variable,还是因为需要xavier_initializer初始化
- 最后具体情况具体分析呗,也可能是我菜看得不够多.
-
global training step
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
- 就是一个全局计数器,记录你训练了多少轮,
- 在滑动平均、优化器、指数衰减学习率,画图等方面都有用到
- 损失函数优化器的minimize()中global_step=global_steps能够提供global_step自动加一的操作
2. 基础运行方式
- tensorflow编写代码基本模板
(1)== inference: 构建图表,就是搭建前向神经网络,到output or logits Tensor
(2) loss and optimi: 选择对应损失函数,根据label( y placeholder)以及第一步计算出的logits求损失值,并选择对应优化器.
(3) training and evaluation:
一般编码习惯:(1)(2)在model.py中建立一个model类,在其中搭建完成,(3)在train.py中搭建train类用于训练 + evaluation(没多少次在验证集上计算下loss),predict类一般也在此文件中
3. 状态可视化(tensorboard)
6. tensorboard官方中文介绍
7 . summary api介绍
- 建议先看[6]或者看下面对于声明周期的简单介绍,明白其过程,再去扣细节(经验之谈,以前学得时候只看代码…后悔没早看到这个生命周期)
TensorBoard 中汇总数据(Summary data)的大体生命周期:
- 创建你想汇总数据的 TensorFlow 图
- 选择你想在哪个节点进行汇总(summary)操作(具体介绍可见下面的详细代码)
- 为了生成汇总信息,我们需要运行所有这些节点。这样的手动工作是很乏味的,因此可以使用tf.merge_all_summaries来将他们合并为一个操作.
- run(执行合并后的summary),它会依据特点步骤将所有数据生成(返回)一个序列化的Summary protobuf对象
- 为了将汇总数据写入磁盘,需要将汇总的protobuf对象传递给tf.train.Summarywriter
- 写入磁盘后,可以通过tensorboard对应命令,读取在浏览器内查看.
- (下载tensorflow时会自动下载tensorboard,注意两者版本对应(这里指你乱下,乱删可能没弄干净),不然会报错(具体什么错忘了))
- 具体简单代码可见下:
''' tensorboard生命周期流程(后半段)'''
merged_summary_op = tf.merge_all_summaries()
summary_writer = tf.train.SummaryWriter('/tmp/mnist_logs', sess.graph)
total_step = 0
while training:
total_step += 1
session.run(training_op)
# 按照一定规律写入
if total_step % 100 == 0:
summary_str = session.run(merged_summary_op)
summary_writer.add_summary(summary_str, total_step)
- 详细例子代码可见此处,很不错的例子,可以备份以后参考当例子,当然这个作者举的例子没有分模块(文件),耦合性有点高,不过可以参考
4. checkpoint(检查点)
- 这里就不展开了,不然文章太长了,强推下面这篇文章(可以当作工具文),写的很清晰也全面
8. tensorflow中的检查点checkpoint详解