使用tensroflow實現簡單的cnn的代碼以下,僅供參考python
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import tensorflow as tf #download mnist datasets #55000 * 28 * 28 55000image from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets('mnist_data',one_hot=True) #one_hot is encoding format #None means tensor 的第一維度能夠是任意維度 #/255. 作均一化 input_x=tf.placeholder(tf.float32,[None,28*28])/255. #輸出是一個one hot的向量 output_y=tf.placeholder(tf.int32,[None,10]) #輸入層 [28*28*1] input_x_images=tf.reshape(input_x,[-1,28,28,1]) #從(Test)數據集中選取3000個手寫數字的圖片和對應標籤 test_x=mnist.test.images[:3000] #image test_y=mnist.test.labels[:3000] #label #隱藏層 #conv1 5*5*32 #layers.conv2d parameters #inputs 輸入,是一個張量 #filters 卷積核個數,也就是卷積層的厚度 #kernel_size 卷積核的尺寸 #strides: 掃描步長 #padding: 邊邊補0 valid不須要補0,same須要補0,爲了保證輸入輸出的尺寸一致,補多少不須要知道 #activation: 激活函數 conv1=tf.layers.conv2d( inputs=input_x_images, filters=32, kernel_size=[5,5], strides=1, padding='same', activation=tf.nn.relu ) print(conv1) #輸出變成了 [28*28*32] #pooling layer1 2*2 #tf.layers.max_pooling2d #inputs 輸入,張量必需要有四個維度 #pool_size: 過濾器的尺寸 pool1=tf.layers.max_pooling2d( inputs=conv1, pool_size=[2,2], strides=2 ) print(pool1) #輸出變成了[?,14,14,32] #conv2 5*5*64 conv2=tf.layers.conv2d( inputs=pool1, filters=64, kernel_size=[5,5], strides=1, padding='same', activation=tf.nn.relu ) #輸出變成了 [?,14,14,64] #pool2 2*2 pool2=tf.layers.max_pooling2d( inputs=conv2, pool_size=[2,2], strides=2 ) #輸出變成了[?,7,7,64] #flat(平坦化) flat=tf.reshape(pool2,[-1,7*7*64]) #形狀變成了[?,3136] #densely-connected layers 全鏈接層 1024 #tf.layers.dense #inputs: 張量 #units: 神經元的個數 #activation: 激活函數 dense=tf.layers.dense( inputs=flat, units=1024, activation=tf.nn.relu ) #輸出變成了[?,1024] print(dense) #dropout #tf.layers.dropout #inputs 張量 #keep_rate 保留率,訓練時使用 #training 是不是在訓練的時候丟棄 keep_rate = tf.palceholder(tf.float32) dropout=tf.layers.dropout( inputs=dense, rate=keep_rate, ) print(dropout) #輸出層,不用激活函數(本質就是一個全鏈接層) logits=tf.layers.dense( inputs=dropout, units=10 ) #輸出形狀[?,10] print(logits) #計算偏差 cross entropy(交叉熵),再用Softmax計算百分比的機率 #tf.losses.softmax_cross_entropy #onehot_labels: 標籤值 #logits: 神經網絡的輸出值 loss=tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits) # 用Adam 優化器來最小化偏差,學習率0.001 相似梯度降低 print(loss) train_op=tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(loss) #精度。計算預測值和實際標籤的匹配程度 #tf.metrics.accuracy #labels:真實標籤 #predictions: 預測值 #Return: (accuracy,update_op)accuracy 是一個張量準確率,update_op 是一個op能夠求出精度。 #這兩個都是局部變量 accuracy_op=tf.metrics.accuracy( labels=tf.argmax(output_y,axis=1), predictions=tf.argmax(logits,axis=1) )[1] #爲何是1 是由於,咱們這裏不是要準確率這個數字。而是要獲得一個op #建立會話 sess=tf.Session() #初始化變量 #group 把不少個操做弄成一個組 #初始化變量,全局,和局部 init=tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) sess.run(init) for i in range(500): batch=mnist.train.next_batch(50) #從Train(訓練)數據集中取‘下一個’樣本 train_loss,train_op_=sess.run([loss,train_op],{input_x:batch[0],output_y:batch[1],keep_rate=0.5}) if i%100==0: test_accuracy=sess.run(accuracy_op,{input_x:test_x,output_y:test_y,keep_rate=1}) print("Step=%d, Train loss=%.4f,[Test accuracy=%.2f]"%(i,train_loss,test_accuracy)) #測試: 打印20個預測值和真實值 對 test_output=sess.run(logits,{input_x:test_x[:20],keep_rate=1}) inferenced_y=np.argmax(test_output,1) print(inferenced_y,'Inferenced numbers')#推測的數字 print(np.argmax(test_y[:20],1),'Real numbers') sess.close()