import tensorflow as tf
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
# Change the shape of trX and teX into [-1,28,28,1], -1 means that the number of input images is not considered,28 ×28 is the number of pixels of the length and width of the image,
# 1 is the number of channels. Since MNIST images are black and white, the channel is 1. For RGB color images, the channel is 3.
trX = trX.reshape(-1.28.28.1)  # 28x28x1 input img
teX = teX.reshape(-1.28.28.1)  # 28x28x1 input img

X = tf.placeholder("float"[None.28.28.1])
Y = tf.placeholder("float"[None.10])
Initialize weights and define network structure.
# Here, we are going to build a convolutional neural network with three convolutional layers and three pooling layers, followed by a full connection layer and an output layer
def init_weights(shape) :
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

w = init_weights([3.3.1.32])            # Patch size is 3×3, input dimension is 1, output dimension is 32
w2 = init_weights([3.3.32.64])          # Patch size is 3×3, input dimension is 32, output dimension is 64
w3 = init_weights([3.3.64.128])         # Patch size is 3×3, input dimension is 64, output dimension is 128
w4 = init_weights([128 * 4 * 4.625])     The input dimension of the fully connected layer is 128 × 4 × 4, and the output data of the previous layer is converted from 3d to 1d, and the output dimension is 625
w_o = init_weights([625.10])   # output layer, input dimension 625, output dimension 10, represents 10 classes (labels)
# Neural network model builder function, passing in the following parameters
# X: Input data
# w: The weight of each layer
# P_keep_conv, P_keep_hidden: Dropout Ratio of neurons to keep

def model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden) :
    # First set of convolutional layers and pooling layers, and finally dropout some neurons
    l1a = tf.nn.relu(tf.nn.conv2d(X, w, strides=[1.1.1.1], padding='SAME'))
    # l1a shape=(? , 28, 28, 32)
    l1 = tf.nn.max_pool(l1a, ksize=[1.2.2.1], strides=[1.2.2.1], padding='SAME')
    # l1 shape=(? , 14, 14, 32)
    l1 = tf.nn.dropout(l1, p_keep_conv)

    # The second set of convolutional layers and pooling layers, and finally dropout some neurons
    l2a = tf.nn.relu(tf.nn.conv2d(l1, w2, strides=[1.1.1.1], padding='SAME'))
    # l2a shape=(? , 14, 14, 64)
    l2 = tf.nn.max_pool(l2a, ksize=[1.2.2.1], strides=[1.2.2.1], padding='SAME')
    # l2 shape=(? , 7, 7, 64)
    l2 = tf.nn.dropout(l2, p_keep_conv)
    # The third group of convolutional layers and pooling layers, and finally dropout some neurons
    l3a = tf.nn.relu(tf.nn.conv2d(l2, w3, strides=[1.1.1.1], padding='SAME'))
    # l3a shape=(? , 7, 7, 128)
    l3 = tf.nn.max_pool(l3a, ksize=[1.2.2.1], strides=[1.2.2.1], padding='SAME')
    # l3 shape=(? , 4, 4, 128)
    l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]])    # reshape to (? , 2048).
    l3 = tf.nn.dropout(l3, p_keep_conv)
    # Fully connect layers, and finally dropout some neurons
    l4 = tf.nn.relu(tf.matmul(l3, w4))
    l4 = tf.nn.dropout(l4, p_keep_hidden)
    # output layer
    pyx = tf.matmul(l4, w_o)
    return pyx  # return the predicted value

# We define the placeholder for dropout -- keep_conv, which indicates what percentage of neurons are retained in a layer. Generate the network model and get the predicted value
p_keep_conv = tf.placeholder("float")
p_keep_hidden = tf.placeholder("float")
py_x = model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden) # get the predicted value
Here we still use TF.nn.softMAX_cross_entropy_with_logits to compare the difference between the predicted value and the true value, and do the mean processing;
# define training operations (train_op), USES the implementation RMSProp algorithm optimizer tf. Train. RMSPropOptimizer, vector is 0.001, the attenuation value of 0.9, minimize the losses;
# define predict_op
cost = tf.reduce_mean(tf.nn. softmax_cross_entropy_with_logits(logits=py_x, labels=Y))
train_op = tf.train.RMSPropOptimizer(0.001.0.9).minimize(cost)
predict_op = tf.argmax(py_x, 1)
Define batch sizes for training and batch sizes for evaluation
batch_size = 128
test_size = 256
# Launch the diagram in a session to start training and evaluation
# Launch the graph in a session
with tf.Session() as sess:
    # you need to initialize all variables
    tf. global_variables_initializer().run()
    for i in range(100):
        training_batch = zip(range(0.len(trX), batch_size),
                             range(batch_size, len(trX)+1, batch_size))
        for start, end in training_batch:
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end],
                                          p_keep_conv: 0.8, p_keep_hidden: 0.5})

        test_indices = np.arange(len(teX))  # Get A Test Batch
        np.random.shuffle(test_indices)
        test_indices = test_indices[0:test_size]

        print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
                         sess.run(predict_op, feed_dict={X: teX[test_indices],
                                                         p_keep_conv: 1.0,
                                                         p_keep_hidden: 1.0})))
Copy the code

\