mnist deep convolutional cetwork源码说明

来源:互联网 发布:百度云盘加载数据失败 编辑:程序博客网 时间:2024/06/05 03:29

主要对mnist_deep代码中的conv2d,max_pool,dropout进行说明

代码来源:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_deep.py

说明参考:http://www.cnblogs.com/hellocwh/p/5564568.html

http://blog.csdn.net/mao_xiao_feng/article/details/53444333

http://blog.csdn.net/mao_xiao_feng/article/details/53453926

http://blog.csdn.net/lujiandong1/article/details/53223630

http://www.cnblogs.com/wuzhitj/p/6297992.html


# Copyright 2015 The TensorFlow Authors. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##     http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# =============================================================================="""A deep MNIST classifier using convolutional layers.See extensive documentation athttps://www.tensorflow.org/get_started/mnist/pros"""# Disable linter warnings to maintain consistency with tutorial.# pylint: disable=invalid-name# pylint: disable=g-bad-import-orderfrom __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport argparseimport sysfrom tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfFLAGS = Nonedef deepnn(x):  """deepnn builds the graph for a deep net for classifying digits.  Args:    x: an input tensor with the dimensions (N_examples, 784), where 784 is the    number of pixels in a standard MNIST image.  Returns:    A tuple (y, keep_prob). y is a tensor of shape (N_examples, 10), with values    equal to the logits of classifying the digit into one of 10 classes (the    digits 0-9). keep_prob is a scalar placeholder for the probability of    dropout.  """  # Reshape to use within a convolutional neural net.  # Last dimension is for "features" - there is only one here, since images are  # grayscale -- it would be 3 for an RGB image, 4 for RGBA, etc.  x_image = tf.reshape(x, [-1, 28, 28, 1])  # First convolutional layer - maps one grayscale image to 32 feature maps.  W_conv1 = weight_variable([5, 5, 1, 32])  b_conv1 = bias_variable([32])  h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)  # Pooling layer - downsamples by 2X.  h_pool1 = max_pool_2x2(h_conv1)  # Second convolutional layer -- maps 32 feature maps to 64.  W_conv2 = weight_variable([5, 5, 32, 64])  b_conv2 = bias_variable([64])  h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)  # Second pooling layer.  h_pool2 = max_pool_2x2(h_conv2)  # Fully connected layer 1 -- after 2 round of downsampling, our 28x28 image  # is down to 7x7x64 feature maps -- maps this to 1024 features.  W_fc1 = weight_variable([7 * 7 * 64, 1024])  b_fc1 = bias_variable([1024])  h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])  h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)  # Dropout - controls the complexity of the model, prevents co-adaptation of features.  # dropout一般用在全连接层后面,其作用就是在每批数据输入时,让神经网络中的每个神经元以1-keep_prob的概率不工作,以此来防止过拟合.    keep_prob = tf.placeholder(tf.float32)  h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)  # Map the 1024 features to 10 classes, one for each digit  W_fc2 = weight_variable([1024, 10])  b_fc2 = bias_variable([10])  y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2  return y_conv, keep_probdef conv2d(x, W):  """conv2d returns a 2d convolution layer with full stride.     input x: [batch, in_height, in_width, in_channels]     filter W: [filter_height, filter_width, in_channels, out_channels]     strides: [batch, in_height, in_width, in_channels], corresponding to the input x     return: output[b, i, j, k] = sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] * filter[di, dj, q, k]     that is, the shape of output is the same as input, [batch, in_height, in_width, in_channels]. In fact, strides[1] and strides[2] is working     usually, strides[0] = strides[3] = 1, and filter[2] = x[3]  """  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')def max_pool_2x2(x):  """max_pool_2x2 downsamples a feature map by 2X.     input x: [batch, in_height, in_width, in_channels]     ksize: usually [1, height, width, 1]     strides: strides[1] and strides[2] is working, strides[0] = strides[3] = 1  """  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],                        strides=[1, 2, 2, 1], padding='SAME')def weight_variable(shape):  """weight_variable generates a weight variable of a given shape."""  initial = tf.truncated_normal(shape, stddev=0.1)  return tf.Variable(initial)def bias_variable(shape):  """bias_variable generates a bias variable of a given shape."""  initial = tf.constant(0.1, shape=shape)  return tf.Variable(initial)def main(_):  # Import data  mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)  # Create the model  x = tf.placeholder(tf.float32, [None, 784])  # Define loss and optimizer  y_ = tf.placeholder(tf.float32, [None, 10])  # Build the graph for the deep net  y_conv, keep_prob = deepnn(x)  cross_entropy = tf.reduce_mean(      tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))  train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)  correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    for i in range(20000):      batch = mnist.train.next_batch(50)      if i % 100 == 0:              #here keep_prob=1.0, that is, dropout is not working        train_accuracy = accuracy.eval(feed_dict={            x: batch[0], y_: batch[1], keep_prob: 1.0})        print('step %d, training accuracy %g' % (i, train_accuracy))              #here keep_prob=0.5, that is, dropout is working during training      train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})    #here keep_prob=1.0, dropout is not working during testing    print('test accuracy %g' % accuracy.eval(feed_dict={        x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))if __name__ == '__main__':  parser = argparse.ArgumentParser()  parser.add_argument('--data_dir', type=str,                      default='/tmp/tensorflow/mnist/input_data',                      help='Directory for storing input data')  FLAGS, unparsed = parser.parse_known_args()  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)


                                             
0 0
原创粉丝点击