当前位置: 首页 > 后端技术 > Python

基于TensorFlow框架搭建最简单的CNN框架

时间:2023-03-25 21:36:22 Python

项目介绍本文将使用python,利用TensorFlow框架搭建最简单的CNN框架,实现手写数字识别。本文搭建的CNN框架结构[1]输入层(本文输入为28*28且单通道的图像,所以输入层有784个节点)[2]第一个卷积层(卷积层包含32个不同的55个卷积核,即卷积层提取32个不同的图形特征,[5,5,1,32]表示卷积核大小为55,1个颜色通道,32个不同的卷积核)[3]最大pooling层在第一个卷积层之后[4]是第二个卷积层(这个卷积层包含64个不同的55个卷积核,也就是卷积层提取了32个不同的图形特征,[5,5,32,64]表示卷积核大小为55,64个不同的卷积核)【5】第二个卷积层之后的最大池化层【6】】全连接层【7】一个dropout层(为了减少过拟合,我们在进行时随机丢弃一些节点数据减少过度拟合的训练ng,并保留所有数据进行预测,以追求最佳预测性能)【8】Softmax层得到最终的概率输出。[9]将损失函数定义为交叉熵(crossentropy),优化器使用Adam[10]得到模型的预测精度。将项目代码导入对应库fromtensorflow.examples.tutorials.mnistimportinput_dataimporttensorflowastf导入手写数字数据集mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)sess=tf.InteractiveSession()Define生成权重的函数defweight_variabel(shape):initial=tf.truncated_normal(shape,stddev=0.1)returntf.Variable(initial)定义生成偏差的函数defbias_variable(shape):initial=tf.constant(0.1,shape=shape)returntf.Variable(initial)定义了生成卷积层的函数convolutionallayerdefconv2d(x,W):returntf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')池化层定义生成最大池化层函数defmax_pool_2x2(x):returntf.nn。max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')输入变量x=tf.placeholder(tf.float32,[None,784])传入label的变量y_=tf.placeholder(tf.float32,[None,10])将1D图像转换为28*28的2D照片x_image=tf.reshape(x,[-1,28,28),1])我们定义第一个卷积层权重W_conv1=weight_variabel([5,5,1,32])biasb_conv1=bias_variable([32])卷积核h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)最大池层h_pool1=max_pool_2x2(h_conv1)定义第二个卷积层权重W_conv2=weight_variabel([5,5,32,64])biasb_conv2=bias_variable([64])卷积核h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)最大池化层h_pool2=max_pool_2x2(h_conv2)定义一个全连接层,隐藏节点数为1024,使用ReLU激活函数W_fc1=weight_variabel([7764,1024])b_fc1=bias_variable([1024])h_pool2_flat=tf.reshape(h_pool2,[-1,7764])h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)为了减少过拟合,下面使用了一个Dropout层是由占位符的传输keeper_prob比率控制在训练时,我们随机丢弃一部分节点数据以减少过拟合,在预测时,我们保留所有数据以追求最佳预测性能)最后,我们将Dropout层的输出连接到一个Softmax层得到最终的概率输出W_fc2=weight_variabel([1024,10])b_fc2=bias_variable([10])y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)我们定义损失函数交叉熵,和之前一样,但是优化器使用Adam并给出一个小的学习率1e-4cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1]))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))下面开始训练过程,首先初始化所有参数tf.global_variables_initializer().run()foriin范围(20000):batch=mnist.train.next_batch(50)ifi%100==0:train_accuracy=accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})print("步骤%d,训练准确racy%g"%(i,train_accuracy))train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})print("测试精度%g"%accuracy.eval(feed_dict={x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0}))