mnist_inference.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # -*- coding: utf8 -*-
  2. import tensorflow as tf
  3. # define basic params
  4. INPUT_NODE = 784
  5. OUTPUT_NODE = 10
  6. IMAGE_SIZE = 28
  7. NUM_CHANNELS = 1
  8. NUM_LABELS = 10
  9. CONV1_DEPTH = 6
  10. CONV1_SIZE = 5
  11. CONV2_DEPTH = 16
  12. CONV2_SIZE = 5
  13. FC_SIZE = 84
  14. def variable_summaries(var, name):
  15. with tf.name_scope('summaries'):
  16. tf.summary.histogram(name, var)
  17. # calc mean
  18. mean = tf.reduce_mean(var)
  19. tf.summary.scalar('mean/' + name, mean)
  20. # calc standard deviation
  21. stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
  22. tf.summary.scalar('stddev/' + name, stddev)
  23. def inference(input_tensor, train, regularizer):
  24. # print(input_tensor.get_shape())
  25. # define layer1 forward propagation
  26. with tf.variable_scope('layer1-conv1'):
  27. conv1_weights = tf.get_variable(
  28. "weight", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEPTH],
  29. initializer=tf.truncated_normal_initializer(stddev=0.1)
  30. )
  31. conv1_biases = tf.get_variable("bias", [CONV1_DEPTH], initializer=tf.constant_initializer(0.0))
  32. # strides 中间两项表示长宽方向步长1
  33. conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
  34. relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
  35. variable_summaries(conv1_weights, 'layer1-conv1' + '/weights')
  36. variable_summaries(conv1_biases, 'layer1-conv1' + '/biases')
  37. # define layer2 forward propagation, max pooling, size 2*2, step 2*2, all 0 filling
  38. with tf.variable_scope('layer2-pool1'):
  39. pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  40. # print(pool1.get_shape())
  41. with tf.variable_scope('layer3-conv2'):
  42. conv2_weights = tf.get_variable(
  43. "weight", [CONV2_SIZE, CONV2_SIZE, CONV1_DEPTH, CONV2_DEPTH],
  44. initializer=tf.truncated_normal_initializer(stddev=0.1)
  45. )
  46. conv2_biases = tf.get_variable("bias", [CONV2_DEPTH], initializer=tf.constant_initializer(0.0))
  47. # size 5*5, depth 64, step 1, all 0 filling
  48. conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1, 1, 1, 1], padding='SAME')
  49. relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))
  50. variable_summaries(conv2_weights, 'layer3-conv2' + '/weights')
  51. variable_summaries(conv2_biases, 'layer3-conv2' + '/biases')
  52. with tf.variable_scope('layer4-poll2'):
  53. pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  54. # print(pool2.get_shape())
  55. # pool_shape[0] means the num of data from a batch, get_shape->[num, width, height, depth]
  56. pool_shape = pool2.get_shape().as_list()
  57. nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
  58. reshaped = tf.reshape(pool2, [tf.shape(pool2)[0], nodes])
  59. # print(reshaped.get_shape())
  60. with tf.variable_scope('layer5-fc1'):
  61. fc1_weights = tf.get_variable(
  62. 'weights',
  63. [nodes, FC_SIZE],
  64. initializer=tf.truncated_normal_initializer(stddev=0.1)
  65. )
  66. # fc layer regularize
  67. if regularizer is not None:
  68. tf.add_to_collection('losses', regularizer(fc1_weights))
  69. fc1_biases = tf.get_variable('bias', [FC_SIZE], initializer=tf.constant_initializer(0.1))
  70. fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_weights) + fc1_biases)
  71. if train:
  72. fc1 = tf.nn.dropout(fc1, 0.5)
  73. variable_summaries(fc1_weights, 'layer5-fc1' + '/weights')
  74. variable_summaries(fc1_biases, 'layer5-fc1' + '/biases')
  75. with tf.variable_scope('layer6-fc2'):
  76. fc2_weight = tf.get_variable(
  77. 'weight',
  78. [FC_SIZE, NUM_LABELS],
  79. initializer=tf.truncated_normal_initializer(stddev=0.1)
  80. )
  81. if regularizer is not None:
  82. tf.add_to_collection('losses', regularizer(fc2_weight))
  83. fc2_biases = tf.get_variable('bias', [NUM_LABELS], initializer=tf.constant_initializer(0.1))
  84. logit = tf.matmul(fc1, fc2_weight) + fc2_biases
  85. variable_summaries(fc2_weight, 'layer6-fc2' + '/weights')
  86. variable_summaries(fc2_biases, 'layer6-fc2' + '/biases')
  87. return logit