TensorFlow 入门(MNIST数据集)(二)

A Guide to TF Layers: Building a Convolutional Neural Network

TensorFlow 中的layers 模块提供了高级API,使我们能轻易创建出神经网络。包括全连接层,卷积层,激活函数,dropout regularization。在本文中,将构建CNN网络来进行手写数字识别。

MNIST数据集包括60000个训练样本,10000个测试样本,每个样本为28*28像素的图片。

本例中使用的网络结构如下:

卷积层1:32个5*5 filter,激活函数为ReLU

池化层1:2*2,步长为2

卷积层2: 64个5*5 filter,激活函数为ReLU

池化层2: 2*2,步长为2

Dense Layer 1(全连接层):1024个neurons,dropout regularization rate 为 0.4

API中的三个函数(这三个函数的输入输出均为tensor):tf.layers.conv2d(), tf.layers.max_pooling2d(), tf.layers.dense()

首先给出定义模型的代码:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

下面对代码细节进行解释:

Input Layer:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

对于一个二维的图像,首先将数据转化为以下形式[batch_size,image_width,image_height,channels]

其中batch_size = -1,表示生成自适应大小的tensor。

Convolutional Layer:

《TensorFlow 入门(MNIST数据集)(二)》

此处值得注意的是,padding,padding有两个可选值 valid和same,默认为valid,当padding值为same值时,卷积是会在边缘处补0,使得输出tensor的width*height与输入相同。

Dense Layer:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

这里的全连接层包含1024个神经元,在连接至全连接层之前,我们首先将原有的tensor转换。由pool2输出的tensor([batch_size,image_width,image_height,channels])转换为二维的tensor([batch_size,features])。Features需要自己计算出来,因为pool2输出tensor的格式为[batch_size,7,7,64]。

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

为了防止过拟合,需要使用drop regularization,

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

这里的参数training是一个Boolean值,只有在训练阶段,才需要使用dropout。当training = true时,这一层才会运行。输出为[batch_size, 1024]

Logits Layer:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

这里使用了默认的激活函数linear activation

Generate Predictions:

Logits Layer输出一个tensor[batch_size,10](类似一个batch_size 行,10列的一个矩阵,对应每一张图片,都会产生一个向量,每个向量有10个值),在此,我们可以生成两种类型的返回值,(1)返回0,1,2,3,4,5,6,7,8,9中的一个数字(2)返回对应每个数字的概率,例如0的概率是0.2,1的概率是0.7等等。

在本例中,我们返回向量(10个值)中,最大值对应的类别。使用tf.argmax()获得对应的索引。

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

可以使用tf.nn.softmax()得到每个类别对应的概率:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

我们使用name参数来明确命名这个操作softmax_tensor,所以我们可以在稍后引用它.

将预测结果放入一个字典中,返回一个EstimatorSpec对象。

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

Calculate Loss:

对于多分类问题,多采用cross_entropy作为loss function。

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

首先,传入的labels尺寸为[batch_size,1],将其转化为与logits相同的尺寸[batch_size,10]。

tf.cast(x,dtype): Casts a tensor to a new type.

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

tf.estimator.EstimatorSpec 类

Ops and objects returned from a model_fn and passed to an Estimator.(从定义模型的函数中返回,并传递给Estimator的一个中间产物)

构造函数:

《TensorFlow 入门(MNIST数据集)(二)》

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

Training Op:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

Evaluation Op:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

代码:

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

《TensorFlow 入门(MNIST数据集)(二)》
《TensorFlow 入门(MNIST数据集)(二)》

    原文作者:motto
    原文地址: https://zhuanlan.zhihu.com/p/35186855
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞