2.5 tensorflow运作方式入门的笔记
输入与占位符:
定义传入图表的参数shape,后续训练过程中使用feed_dict参数,将数据传入session.run()函数
tf.placeholder(tf.int32, shape=(batch_size))
构建图表:推理、损失和训练
推理:尽可能地构建图表,做到返回包含了预测结果(output prediction)的Tensor
1.定义权重和偏差并初始化操作
2.定义模型层次构成
损失:函数通过添加所需的损失操作,进一步构建图表。
1.首先将标签转换为one-hot形式
batch_size = tf.size(labels) #返回tensor labels的形状
labels = tf.expand_dims(labels,1) #张量在1维上增加~ shape[n,1]
indices = tf.expand_dims(tf.range(0, batch_size,1),1) #与label一一对应的index
concated = tf.concat( [indices, labels],1) #数据组合
onehot_labels = tf.sparse_to_dense( concated, tf.pack([batch_size, NUM_CLASSES]),1.0,0.0) #就是讲矩阵concated变为一个batch_size*NUM_CLASSES的矩阵,其中concated中每一行有两列,第一个数表示行号,第二个数表示label的类别,变为稠密矩阵以后,设第i行中label值为3,则稠密矩阵的第i行中第3列为1,该行其他列数值为0
attension:!tensorflow后面版本把pack更新为stack()函数!
!!tf.concat函数版本不同参数设置不同,新版本的维度在后,value在前!!
!!!tensorflow中只有经过Session后才能看到运行的结果,不可以直接 print!!!
详解函数:
❤tf.concat(values,concat_dim ) 函数用来连接两个tensor.
参数:values:表示两个或者一组待连接的tensor.
concat_dim:表示在哪一维上连接,必须是一个数.如果concat_dim=0,表示在第一个维度上连,相当于叠放到列上;
如果concat_dim是1,表示在第二个维度上连
!如果要连接两个向量,必须要调用tf.expand_dims()函数来扩维,这就是在调用tf.concat()函数前先调用tf.expand_dims()函数的原因。
❤tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value)可以用来生成稀疏矩阵.
参数:sparse_indices:稀疏矩阵中那些个别元素对应的索引值。
有三种情况:
sparse_indices是个数,那么它只能指定一维矩阵的某一个元素.
sparse_indices是个向量,那么它可以指定一维矩阵的多个元素.
sparse_indices是个矩阵,那么它可以指定二维矩阵的多个元素.
output_shape:输出的稀疏矩阵的shape.
sparse_values:个别元素的值,即第一个参数选中的位置的值.
分为两种情况: sparse_values是个数,那么所有索引指定的位置都用这个数.
sparse_values是个向量,那么输出矩阵的某一行向量里某一行对应的数(因此这里向量的长度应该和输出矩阵的行数应该对应,不然会报错).
default_value:未指定元素的默认值,如果是稀疏矩阵,则应该为0.
❤tf.stack(values, axis=0)函数将一系列rank-R的tensor打包为一个rank-(R+1)的tensor
测试实验结果如下:
label = [3,5]
print (tf.shape(label))
index = tf.range(0,2)
print (tf.shape(index))
labels = tf.expand_dims(label,1)
indexs = tf.expand_dims(index,1)
print (tf.shape(labels))
print (tf.shape(indexs))
concated = tf.concat([indexs,labels],1)
one_hot = tf.sparse_to_dense(concated,tf.stack([2,10]),1.0,0.0)
with tf.Session() as sess:
result = sess.run(one_hot)
print (result)
结果如下:
2.计算交叉熵来比较inference()函数与所生成标签的输出logits tensor。
❤cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, onehot_labels, name='xentropy')
参数:
logits:神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes
labels:实际的标签,大小同上
返回值:一维向量,长度为batch_size.
然后计算batch维度下的交叉熵平均值为loss:
❤loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
训练:添加通过梯度下降(gradient descent)将损失最小化所需的操作
1.获取损失loss tensor
tf.scalar_summary(loss.op.name, loss)
2.实例化梯度下降器
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate)
3.生成一个保存全局训练步骤的数值,使用minimize()函数更新权重
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
状态可视化:
1.将所有即时数据在图表构建阶段合并至一个操作中
summary_op = tf.merge_all_summaries()
2.实例化事件文件
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir,graph_def=sess.graph_def)
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
保存检查点:用于恢复模型来进一步训练或评估
1.实例化tf.train.Saver
2.saver.save
3.saver.restore