技术开发 频道

TensorFlow 入门(MNIST数据集)

  【IT168 技术】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()

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

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

  Input Layer:

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

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

  Convolutional Layer:

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

  Dense Layer:

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

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

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

  Logits Layer:

  这里使用了默认的激活函数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()获得对应的索引。

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

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

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

  Calculate Loss:

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

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

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

  tf.estimator.EstimatorSpec 类

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

  构造函数:

  Training Op:

  Evaluation Op:

  代码:

0
相关文章