LetNet_inference.py:实现LeNet-5网络结构
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/17 11:24 # @Author : HJH # @Site : # @File : LetNet_inference.py # @Software: PyCharm import tensorflow as tf INPUT_NODE=784 OUTPUT_NODE=10 IMAGE_SIZE=28 NUM_CHANNELS=1 NUM_LABELS=10 CONV1_DEEP=32 CONV1_SIZE=5 CONV2_DEEP=64 CONV2_SIZE=5 FC_SIZE=512 #参数train用于区分训练过程还是测试过程 def inference(input_tensor,train,regularizer): # 声明第一层卷积层,输入28*28*1,输出28*28*32 with tf.variable_scope('layer1_conv1'): conv1_Weight=tf.get_variable('Weight',[CONV1_SIZE,CONV1_SIZE,NUM_CHANNELS,CONV1_DEEP], initializer=tf.truncated_normal_initializer(stddev=0.1)) conv1_biase=tf.get_variable('biase',[CONV1_DEEP],initializer=tf.constant_initializer(0.0)) conv1=tf.nn.conv2d(input_tensor,conv1_Weight,strides=[1,1,1,1],padding='SAME') relu1=tf.nn.relu(tf.nn.bias_add(conv1,conv1_biase)) # 声明第一层池化层,输入28*28*32,输出14*14*32 with tf.variable_scope('layer2_pool1'): pool1=tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') # 声明第三层卷积层,输入14*14*32,输出14*14*64 with tf.variable_scope('layer3_conv2'): conv2_Weight=tf.get_variable('Weight',[CONV2_SIZE,CONV2_SIZE,CONV1_DEEP,CONV2_DEEP], initializer=tf.truncated_normal_initializer(stddev=0.1)) conv2_biase=tf.get_variable('biase',[CONV2_DEEP],initializer=tf.constant_initializer(0.0)) conv2=tf.nn.conv2d(pool1,conv2_Weight,strides=[1,1,1,1],padding='SAME') relu2=tf.nn.relu(tf.nn.bias_add(conv2,conv2_biase)) # 声明第四层池化层,输入14*14*64,输出7*7*64 with tf.variable_scope('layer4_pool2'): pool2=tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') # 将第四层输出格式(7*7*64)转化为第五层的输入格式一个向 pool_shape=pool2.get_shape().as_list() #pool_shape[0]存储的是一个batch中的数据个数 nodes=pool_shape[1]*pool_shape[2]*pool_shape[3] reshaped=tf.reshape(pool2,[pool_shape[0],nodes]) # 声明第五层全连接层,输入7*7*64=3136长度的向量,输出512 with tf.variable_scope('layer5_fc1'): fc1_Weight=tf.get_variable('Weight',[nodes,FC_SIZE], initializer=tf.truncated_normal_initializer(stddev=0.1)) #只有全连接层的权重需要加入正则化 if regularizer!=None: tf.add_to_collection('losses',regularizer(fc1_Weight)) fc1_biase=tf.get_variable('biase',[FC_SIZE],initializer=tf.constant_initializer(0.1)) fc1=tf.nn.relu(tf.matmul(reshaped,fc1_Weight)+fc1_biase) if train: #用于防止过拟合,dropout随机将部分节点输出改为0,一般只在全连接层使用 fc1=tf.nn.dropout(fc1,0.5) # 声明第6层全连接层,输入512,输出10,通过softmax之后得到最后的分类结果 with tf.variable_scope('layer6_fc2'): fc2_Weight=tf.get_variable('Weight',[FC_SIZE,NUM_LABELS], initializer=tf.truncated_normal_initializer(stddev=0.1)) #只有全连接的权重需要加入正则化 if regularizer!=None: tf.add_to_collection('losses',regularizer(fc2_Weight)) fd2_biase=tf.get_variable('biase',[NUM_LABELS],initializer=tf.constant_initializer(0.1)) prediction=tf.nn.relu(tf.matmul(fc1,fc2_Weight)+fd2_biase) return prediction
LeNet-5_train.py:训练模型
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/17 10:15 # @Author : HJH # @Site : # @File : LeNet-5_train.py # @Software: PyCharm import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import os import numpy as np import LetNet_inference BATCH_SIZE=100 LAERNING_RATE_BASE=0.001 LEARNING_RATE_DECAY=0.99 TRAINING_STEPS=1000 MOVING_AVERAGE_DECAY=0.99 #描述模型复杂度的正则化项在损失函数中的系数 REGULARIZATION_RATE=0.0001 MODEL_SAVE_PATH='./path/model/' MODEL_NAME='model.ckpt' def train(mnist): #卷积神经网络的出入层为三层 X=tf.placeholder(tf.float32,[ BATCH_SIZE, #第一维表示一个batch中样例个数 LetNet_inference.IMAGE_SIZE, #第二维和第三维表示图像的尺寸 LetNet_inference.IMAGE_SIZE, LetNet_inference.NUM_CHANNELS #图像的深度 ],name='x_input') y=tf.placeholder(tf.float32,[None,LetNet_inference.OUTPUT_NODE],name='y_input') regularizer=tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE) pre_y=LetNet_inference.inference(X,False,regularizer) global_step=tf.Variable(0,trainable=False) variable_average=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step) variable_average_op=variable_average.apply(tf.trainable_variables()) cross_entrogy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pre_y,labels=tf.argmax(y,1)) cross_entrogy_mean=tf.reduce_mean(cross_entrogy) loss=cross_entrogy_mean+tf.add_n(tf.get_collection('losses')) learning_rate=tf.train.exponential_decay(LAERNING_RATE_BASE,global_step, mnist.train.num_examples/BATCH_SIZE,LEARNING_RATE_DECAY) train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step) with tf.control_dependencies([train_step,variable_average_op]): train_op=tf.no_op(name='train') saver=tf.train.Saver() with tf.Session() as sess: init=tf.global_variables_initializer() sess.run(init) for i in range(TRAINING_STEPS): Xs,ys=mnist.train.next_batch(BATCH_SIZE) reshape_xs=np.reshape(Xs, [BATCH_SIZE,LetNet_inference.IMAGE_SIZE,LetNet_inference.IMAGE_SIZE, LetNet_inference.NUM_CHANNELS]) _,loss_value,step=sess.run([train_op,loss,global_step],feed_dict={X:reshape_xs,y:ys}) if i%100==0: print('After %d training steps, loss on training batch is %g' % (step, loss_value)) saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step) def main(argv=None): mnist=input_data.read_data_sets('MNIST_data',one_hot=True) train(mnist) if __name__=='__main__': tf.app.run()