tensorflow中文社区学习笔记——2.5

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)

结果如下:

tensorflow中文社区学习笔记——2.5_第1张图片

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

你可能感兴趣的:(tensorflow中文社区学习笔记——2.5)