The construction process is also to load the data first, then build the grid model, and finally train and evaluate the model
Download Data
- 1) Define the input data and preprocess the data. Here, we first read the data MNIST, and get the image and label matrix of the training set, and the
image and label matrix of the test set, respectively
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets('./MNIST_data', one_hot=True)
- 2) Next, the input data needs to be processed, and the shapes of the above trX and teX are changed to [-1, 28, 28, 1], -1 means
the , and 28×28 is the long sum of the pictures The number of pixels wide, 1 is the number of channels, because the MNIST
image is black and white, so the channel is 1, if it is an RGB color image, the channel is 3
trX = trX.reshape(-1,28,28,1) # 28*28*1 input img
teX = teX.reshape(-1,28,28,1) # 28*28*1 input img
X = tf.placeholder("float",[None,28,28,1])
Y = tf.placeholder("float",[None,10])
Build the model
- Initialize the weights and define the lattice network structure. Here, we are going to build a convolutional neural network with 3 convolutional layers and 3 pooling layers, followed by 1 fully connected layer and 1 output layer. First define the function to initialize the weights
def init_weights(shape):
return tf.Variable(tf.random_normal(shape,stddev=0.01))
- The weight grid is initialized as follows, and we set the size of the convolution kernel to be 3×3:
w = init_weights([3,3,1,32])
w2 = init_weights([3,3,32,64])
w3 = init_weights([3,3,64,128])
w4 = init_weights([128*4*4,625])
w_o = init_weights([625,10])
- Then, define a model function:
def model(X,w,w2,w3,w4,w_o,p_keep_conv,p_keep_hidden):
l1a = tf.nn.relu(tf.nn.conv2d(X,w,strides= [1,1,1,1],padding = 'SAME'))
l1 = tf.nn.max_pool(l1a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
l1 = tf.nn.dropout(l1,p_keep_conv)
l2a = tf.nn.relu(tf.nn.conv2d(l1,w2,strides=[1,1,1,1],padding='SAME'))
l2 = tf.nn.max_pool(l2a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
l2 = tf.nn.dropout(l2,p_keep_conv)
l3a = tf.nn.relu(tf.nn.conv2d(l2,w3,strides=[1,1,1,1],padding='SAME'))
l3 = tf.nn.max_pool(l3a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
l3 = tf.reshape(l3,[-1,w4.get_shape().as_list()[0]])
l3 = tf.nn.dropout(l3,p_keep_conv)
l4 = tf.nn.relu(tf.matmul(l3,w4))
l4 = tf.nn.dropout(l4,p_keep_hidden)
pyx = tf.matmul(l4,w_o)
return pyx
- We define a dropout placeholder—keep_conv, which represents how many neurons in a layer are kept. Generate the lattice network model and get the predicted value, as follows:
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) # 得到预测值
- Next, define the loss function, here we use tf.nn.softmax_cross_entropy_with_logits to compare the difference between the predicted value and the true value, and perform mean processing; define the training operation (train_op), using the optimizer tf.train.RMSPropOptimizer that implements the RMSProp algorithm , the learning rate is 0.001, and the decay value is 0.9 to minimize the loss
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)
Train the model and evaluate the model
- First define the batch size at training time and the batch size at evaluation time
batch_size = 64
test_size = 256
with tf.Session() as sess:
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))
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})))