Tensorflow学习笔记(三)

此文章摘抄自Tensorflow中文社区,外加自己学习理解http://www.tensorfly.cn/

在我看来,TensorFlow作为以个用于深度学习的计算库,已然是非常的强大,但是对于真正想去学习机器学习或者深度学习的人来说,反而成就了我们自己的懒惰,祝好,各位码农!

运行TensorFlow的IntertiveSession

TensorFlow依赖于一个高效的C++后端来进行计算。与后端的这个链接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。
这里,我们使用更加方便的InteractiveSession类。通过它,你可以更加灵活地构建你的代码。它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operation)构成的。这对于工作在交互环境中的人们来说非常便利,比如使用IPython。如果你没有使用InteractiveSession,那么你需要在启动session之前构建整个计算图,然后起订该计算图。

import tensorflow as tf
sess=tf.InteractiveSession()

计算图

为了在Python中进行高效的数值计算。我们通常会使用像NumPy一类的库,将一些诸如矩阵乘法的耗时操作在 Python环境的外部来计算,这些计算通常会通过其语言并用更为高效的代码实现。
因此Python代码的目的是用来构建这个可以在外部运行的计算图,以及安排计算图的哪一部分应该被运行。

构建Softmax回归模型

占位符
我们通过为输入图像和目标输出类别创建节点,来开始构建计算图。

x=tf.placeholder("float",shape=[None,784])
y_=tf.placeholder("float",shape=[None,10])

这里的x和y并不是特定的值,相反,他们都只是一个占位符,可以在Tensorflow运行某一计算时根据该占位符输入具体的值。
输入图片x是一个2维的浮点数张量。这里,分配给他的shape为[None,784],其中784是一张展平的MNIST图片的维度。None表示其值大小不定,在这里作为第一个维度值,用以指代batch的大小,意即x的数量不定。输出类别值y_也是一个2维张量,其中每一行为一个10维的one-hot向量,用来代表对应某一MNIST图片的类别。

变量
我们现在为模型定义权重w和偏置b。可以将他们当作额外的输入量,但是TensorFlow有一个更好的处理方式:变量。一个变量代表着TensorFlow计算图中的一个值,能够在计算过程中使用,甚至进行修改。在机器学习的应用过程中,模型参数一般用Variable来表示。

w=tf.Variable(tf.zreos([784,10]))
b=tf.Variable(tf.zeros([10]))

我们在调用tf.Variable的时候传入初始值。在这个例子里,我们把w和b都初始化零向量。w是一个784*10的矩阵(因为我们有784个特征和10个输出值)。b是一个10维的向量(因为我们有10个分类)。

变量需要通过session初始化后,才能在session中使用。这一初始化步骤为,为初始值指定具体值(本例当中全是零),并将其分配给每个变量,可以一次性为所有变量完成此操作。(也就说变量要经过两部的初始化,先用Variable进行初始化之后,再使用session初始化)

sess,run(tf.initialize_all_variables())

类别预测与损失函数

现在我们可以实现我们的回归模型了。我们把向量化后的图片x和权重矩阵w相乘,加上偏置b,然后计算每个分类的softmax概率值。

y=tf.nn.sofemax(tf.matmul(x,w)+b)

可以很容易的为训练过程指定最小化误差用的损失函数,我们的损失函数是目标类别和预测类别之间的交叉熵。

cross_entropy=-tf.reduce_sum(y_*tf.log(y))

训练模型

我们已经定义好模型和训练用的损失函数,那么用TensorFlow进行训练就很简单了。因为TensorFlow知道整个计算图,他可以使用自动微分法找到对于各个变量的损失的梯度值。TensorFlow有大量内置的优化算法。这个例子中,我们用最快速下降法让交叉熵下降,步长为0.01。

train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

这一行代码实际上是用来往计算图上添加一个新操作,其中包括计算梯度,计算每个参数的步长变化,并且计算出新的参数值。
返回的train_step操作对象,在运行时会使用梯度下降来更新参数,因此,整个模型的训练可以通过反复的运行train_step来完成。

for i in range(1000):
    batch=mnist.train.next_batch(50)
    train_step.run(feed_dict={x:batch[0],y_:batch[1]})

每一步迭代,我们都会加载50个训练样本,然后执行一次train_step,并通过feed_dict将x和y_张量占位符用训练数据代替。

评估模型

tf.argmax是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任意输入x预测到的标签值,而tf.argmax(y_,1)代表正确的标签,我们可以用tf.equal来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))

这里返回一个布尔值。为了计算我们分类的准确率,我们将布尔值转换为浮点数来代表对、错,然后取平均值。

accuracy=tf.reduce_mean(tf.reduce_mean(tf.cast(correct_prediction,"float"))

构建一个多卷积网络

权重初始化
为了创建这个模型,我们需要创建大量的权重和偏置项。这个模型中的权重在初始化时应该加入少量的噪声来打破对称性一级避免0梯度。由于我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为零的问题。为了不在建立模型的时候反复做初始化操作,我们定义两个函数用于初始化。

def weight_variable(shape):
     initial=tf.truncated_normal(shape,stddev=0.1)
     return tf.Variable(initial)

def bias

猜你喜欢

转载自blog.csdn.net/qq_41989587/article/details/83417155