tensorflow實現簡單的cnn

使用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()
相關文章
相關標籤/搜索