以上是模型,下面是代码:
1 import tensorflow as tf 2 import numpy as np 3 import time 4 from tensorflow.examples.tutorials.mnist import input_data 5 6 import os 7 os.environ[‘TF_CPP_MIN_LOG_LEVEL‘] = ‘2‘ 8 9 start = time.clock() 10 11 # 下载并载入MNIST 手写数字库 12 mnist = input_data.read_data_sets("./data/MNIST", one_hot=True) 13 14 input_x = tf.placeholder(tf.float32, shape=[None, 28 * 28]) / 255 # 灰度的处理 15 output_y = tf.placeholder(tf.float32, shape=[None, 10]) #输出10个数字的标签 16 input_x_images = tf.reshape(input_x, shape=[-1, 28, 28, 1]) #改变形状之后的输入 17 18 # 从Test(测试)数据集里选取3000个手写数字的图片和对应的标签 19 test_x = mnist.test.images[:3000] 20 test_y = mnist.test.labels[:3000] 21 22 # 构建我们的卷积神经网络 23 # 第一层卷积 24 conv1 = tf.layers.conv2d(inputs=input_x_images, # 形状为[28,28,1] 25 filters=32, # 32个过滤器,输出的深度位32 26 kernel_size=[5, 5], # 过滤器在二维的大小是(5*5) 27 strides=1, # 步长是1 28 padding="same", # snme表示输出大小不变,因此要在外围补零2圈 29 activation=tf.nn.relu # 表示激活函数是relu 30 ) # 形状[28,28,32] 31 32 # 第一层池化(亚采样) 33 pool1 = tf.layers.max_pooling2d( 34 inputs=conv1, # 形状[28,28,32] 35 pool_size=[2, 2], # 过滤器在二维的大小是[2,2] 36 strides=2 # 步长是2 37 ) # 形状[14,14,32] 38 39 # 第二层卷积 40 conv2 = tf.layers.conv2d(inputs=pool1, # 形状为[14,14,32] 41 filters=64, # 64个过滤器,输出的深度位64 42 kernel_size=[5, 5], # 过滤器在二维的大小是(5*5) 43 strides=1, # 步长是1 44 padding="same", # snme表示输出大小不变,因此要在外围补零2圈 45 activation=tf.nn.relu # 表示激活函数是relu 46 ) # 形状[14,14,64] 47 48 # 第二层池化(亚采样) 49 pool2 = tf.layers.max_pooling2d( 50 inputs=conv2, # 形状[14,14,64] 51 pool_size=[2, 2], # 过滤器在二维的大小是[2,2] 52 strides=2 # 步长是2 53 ) # 形状[7,7,64] 54 55 #平坦化(flat) 56 flat = tf.reshape(pool2,shape=[-1,7 * 7 * 64]) #形状[7 * 7 * 64] 57 58 #1024个神经元的全连接层 59 dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu) 60 61 #Dropout :丢弃 50% rate = 0.5 62 dropout = tf.layers.dropout(inputs=dense,rate=0.5) 63 64 #10个神经元的全连接层,这里不用激活函数来做非线性化了。 65 logits = tf.layers.dense(inputs=dropout,units=10) #输出形状[1,1,10] 66 67 #计算误差(计算 Cross entropy(交叉熵)),再用softmax计算百分比概率 68 loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits) 69 70 # Adam 优化器来最小化误差,学习率0.001 71 train_op = tf.train.AdadeltaOptimizer(learning_rate=0.001).minimize(loss) 72 73 #精度,计算,预测值 和 实际标签 的匹配程度 74 #返回 (accuracy .update_op) 会创建两个局部变量 75 accuracy = tf.metrics.accuracy( 76 labels=tf.argmax(input=output_y,axis=1), 77 predictions=tf.argmax(input=logits,axis=1) 78 )[1] 79 80 #创建会话 81 with tf.Session() as sess: 82 #初始化变量 83 init = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer()) 84 sess.run(init) 85 for i in range(20000): 86 batch = mnist.train.next_batch(50) #从Train(训练)数据集里下一个50个样本 87 train_loss,train_op_ = sess.run([loss,train_op],feed_dict={input_x:batch[0],output_y:batch[1]}) 88 if i % 100 == 0: 89 test_accuracy = sess.run(accuracy,feed_dict={input_x:test_x,output_y:test_y}) 90 print(("Step+%d,Train loss=%.4f,[Test accuracy=%.2f]") % (i,train_loss,test_accuracy)) 91 92 #测试:打印20个 预测值 和 真实值 的对 93 test_output = sess.run(logits,feed_dict={input_x:test_x[:20]}) 94 inference_y = np.argmax(test_output,1) 95 print(inference_y," Inference number") #推测的数字 96 print(np.argmax(test_y[:20],1),"Real numbers") #真实的数字 97 98 #显示时间 99 end = time.clock() 100 print(end - start, "秒")
当然CNN还有很长一段路要走。代码不容易,且敲且珍惜。
原文地址:https://www.cnblogs.com/tianqianlan/p/10699172.html
时间: 2024-10-20 00:38:26