tensorflow學習之路 實現簡單的卷積網路

2021-08-14 09:48:49 字數 4292 閱讀 5898

使用tensorflow實現乙個簡單的卷積神經,使用的資料集是mnist,本節將使用兩個卷積層加乙個全連線層,構建乙個簡單有代表性的卷積網路。

**是按照書上的敲的,第一步就是匯入資料庫,設定節點的初始值,tf.nn.conv2d是tensorflow中的2維卷積,引數x是輸入,w是卷積的引數,比如【5,5,1,32】,前面兩個數字代表卷積核的尺寸,第三個數字代表有幾個通道,比如灰度圖是1,彩色圖是3.最後乙個代表卷積的數量,總的實現**如下:

from

tensorflow.examples.tutorials.mnist 

import

input_data  

import

tensorflow as tf  

mnist = input_data.read_data_sets("mnsit_data/"

, one_hot=

true

)  sess = tf.interactivesession()  

# in[2]:

#由於w和b在各層中均要用到,先定義乘函式。

#tf.truncated_normal:截斷正態分佈,即限制範圍的正態分佈

defweight_variable(shape):  

initial = tf.truncated_normal(shape, stddev=0.1

)  return

tf.variable(initial)  

# in[7]:

#bias初始化值0.1.

defbias_variable(shape):  

initial = tf.constant(0.1

, shape=shape)  

return

tf.variable(initial)  

# in[12]:

#tf.nn.conv2d:二維的卷積

#conv2d(input, filter, strides, padding, use_cudnn_on_gpu=none,data_format=none, name=none)

#filter:a 4-d tensor of shape

#      `[filter_height, filter_width, in_channels, out_channels]`

#strides:步長,都是1表示所有點都不會被遺漏。1-d 4值,表示每歌dim的移動步長。

# padding:邊界的處理方式,「same"、"valid」可選

defconv2d(x, w):  

return

tf.nn.conv2d(x, w, strides=[1, 

1, 1, 

1], padding=

'same'

)  #tf.nn.max_pool:最大值池化函式,即求2*2區域的最大值,保留最顯著的特徵。

#max_pool(value, ksize, strides, padding, data_format="nhwc", name=none)

#ksize:池化視窗的尺寸

#strides:[1,2,2,1]表示橫豎方向步長為2

defmax_pool_2x2(x):  

return

tf.nn.max_pool(x, ksize=[1, 

2, 2, 

1], strides = [1, 

2, 2, 

1], padding=

'same'

)  x = tf.placeholder(tf.float32, [none

, 784

])  

y_ = tf.placeholder(tf.float32, [none

, 10

])  

#tf.reshape:tensor的變形函式。

#-1:樣本數量不固定

#28,28:新形狀的shape

#1:顏色通道數

x_image = tf.reshape(x, [-1

, 28

, 28, 1

])  

#卷積層包含三部分:卷積計算、啟用、池化

#[5,5,1,32]表示卷積核的尺寸為5×5, 顏色通道為1, 有32個卷積核

w_conv1 = weight_variable([5, 5

, 1, 32

])  

b_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_variable([5, 5

, 32

, 64

])  

b_conv2 = bias_variable([64

])  

h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)  

h_pool2 = max_pool_2x2(h_conv2)  

#經過2次2×2的池化後,影象的尺寸變為7×7,第二個卷積層有64個卷積核,生成64類特徵,因此,卷積最後輸出為7×7×64.

#tensor進入全連線層之前,先將64張二維影象變形為1維影象,便於計算。

w_fc1 = weight_variable([7*7

*64, 1024

])  

b_fc1 = bias_variable([1024

])  

h_pool2_flat = tf.reshape(h_pool2, [-1, 7

*7*64

])  

h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)  

#對全連線層做dropot

keep_prob = tf.placeholder(tf.float32)  

h_fc1_dropout = tf.nn.dropout(h_fc1, keep_prob)  

#又乙個全連線後foftmax分類

w_fc2 = weight_variable([1024

, 10

])  

b_fc2 = bias_variable([10

])  

y_conv = tf.nn.softmax(tf.matmul(h_fc1_dropout, w_fc2) + b_fc2)  

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv), reduction_indices=[1

]))  

#adamoptimizer:adam優化函式

train_step = tf.train.adamoptimizer(1e-4

).minimize(cross_entropy)  

correct_prediction = tf.equal(tf.argmax(y_, 1

), tf.argmax(y_conv, 

1))  

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  

#訓練,並且每100個batch計算一次精度

tf.global_variables_initializer().run()  

fori 

inrange(

20000

):  

batch = mnist.train.next_batch(50

)  if

i%100

== 0

:  train_accuracy = accuracy.eval(feed_dict=)  

print

("step %d, training accuracy %g"

%(i, train_accuracy))  

train_step.run(feed_dict=)  

#在測試集上測試

print

("test accuracy %g"

%accuracy.eval(feed_dict=))  

注意的是書上開始執行的**是

tf.global_variables_initializer().run(),但是在敲到**中就會報錯,也不知道為什麼,可能是因為版本的問題吧,上網搜了一下,改為sess.run(tf.initialiaze_all_variables)即可。

TensorFlow學習之路(五)

在前面四個章節中,我們已經成功構建好了影象以及 了結果 小小有些激動的我還是有些不爽,畢竟還是使用著資料集來進行的結果 誰知道是不是串通著來騙我的,emmm,那麼,今天我們自己手寫乙個數字進行檢測看看能不能通過我們訓練的模型檢測出來 首先我們先用一張a4紙寫乙個數字,寫正常點別龍飛鳳舞就行,我寫了個...

我的Tensorflow學習之路

最近兩年深度學習真的是火的不要不要的,關於深度學習,每個人都有自己的看法。有人說就是煉丹,得個準確率召回率什麼的,拿到實際中,問問為什麼,都答不上來。各種連 都沒寫過的人,也紛紛表示這東西就是小孩堆積木,然後整個大功耗的伺服器跑上幾天,調調引數。然後每個實驗室招生,都說自己是做什麼深度學習,機器 學...

tensorflow安裝之路

版本python 3.7 version 建立tensorflow環境,anaconda prompt裡輸入create n tensorflow python 3.7 建立成功後,啟用環境activate tensorflow 4.安裝tensorflow cpu 版本的tensorflow 輸入...