MNIST在TensorFlow中的实现及解释摘要

交叉熵及其在TensorFlow中的表示

回归问题一般用均方误差作成本函数,

而对于分类问题,常用的成本函数是交叉熵(cross-entropy),定义为

其中y是我们预测的概率分布,y’是实际的分布。

交叉熵可以看做反映预测不匹配的指标,或者说该指标反映实际情况出乎预料的程度。注意交叉熵是非对称的。在TensorFlow中,交叉熵表示为下面的代码:

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

因为交叉熵一般会与Softmax回归一起使用,所以TensorFlow对这两个功能进行了统一封装,并提供了tf.nn.softmax_cross_entropy_with_logits函数。可以直接通过下面的代码来实现使用了Softmax回归之后的交叉熵函数。注意与公式中的y不同,代码中的y是Softmax函数调用前的值。最后调用tf.reduce_mean函数取平均值,因为图片是批量传入的,针对每张图片会计算出一个交叉熵。

y = tf.matmul (x, W) + b

cross_entropy = tf.reduce_mean (tf.nn.softmax_cross_entropy_with_logits (labels = y_, logits = y))

 

优化器及训练

TensorFlow支持多种不同的优化器,比较常用的优化方法有三种:

tf.train.GradientDescentOptimizer

tf.train.AdamOptimizer

tf.train.MomentumOptimizer

如:

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

现在我们开始训练模型,迭代1000次。注意会话对象执行的不是W、b也不是y,而是train_step。

for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run (train_step, feed_dict = {x: batch_xs, y_: batch_ys})

该循环的每个步骤中,我们都会随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step操作。

 

argmax

在Numpy中有个非常有用的函数argmax,它能给出数组中最大元素所在的索引值。TensorFlow中也有类似的argmax函数。

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

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

print (sess.run (accuracy, feed_dict = {x: mnist.test.images, y_: mnist.test.labels}))

 

conv2d说明

TensorFlow中,tf.nn.conv2d函数实现卷积层前向传播的算法。这个函数的前两个参数分别表示输入数据x和权重W,均为4个维度的张量,如前所述。权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度,这里我们用tf.truncated_normal函数生成的随机量填充。函数的随后两个参数定义卷积的方式,包括过滤器在图像上滑动时移动的步长及填充方式。

x = tf.placeholder (tf.float32, [None, 784])

# 这里使用tf.reshape函数校正张量的维度,-1表示自适应

x_image = tf.reshape (x, [-1, 28, 28, 1])

W_conv1 = tf.Variable (tf.truncated_normal ([5, 5, 1, 32], stddev = 0.1))

h_conv1 = tf.nn.relu (tf.nn.conv2d(x_image, W_conv1, strides = [1, 1, 1, 1], padding = 'SAME') + b_conv1)

conv2d的第一个参数是我们的样本,一般是[batch, height, width, channels]这样的格式,batch是我们的样本数量,也是我们训练mini batch的时候的block size。 height和width是图片的长和宽,channels是颜色通道的数量。

第二个参数是参数矩阵(在dnn中也就是参数W),这是一个4维矩阵,前两个维度是过滤器的大小,上面我们使用5*5的过滤器,第三个维度是我们的样本数据一共有多少个颜色通道,因为我们用的mnist数据是灰度图片而非是RGB, 所以只有一个颜色通道,第三个维度是1。 最后一个维度是我们要使用多少个过滤器,这里我们使用的是32个过滤器。 所以在这里我们的参数是5*5*1*32个参数。

 

input_data中的read_data_sets方法

input_data 就是tf为mnist封装的库,read_data_sets方法的第一个参数是读取数据的路径, 如果这个路径下没有数据,它会自动下载下来。input_data.py是个源代码文件。

样本数量过大,一次性读入内存是不行的。所以引入mini batch,一次只训练batch size个样本。

2000轮训练的cnn使用GPU只用了11秒。 速度快的飞起

 

详见:《一文读懂TensorFlow基础 》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值