手寫數(shù)字實(shí)驗(yàn)報(bào)告_第1頁(yè)
手寫數(shù)字實(shí)驗(yàn)報(bào)告_第2頁(yè)
手寫數(shù)字實(shí)驗(yàn)報(bào)告_第3頁(yè)
手寫數(shù)字實(shí)驗(yàn)報(bào)告_第4頁(yè)
手寫數(shù)字實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

手寫數(shù)字實(shí)驗(yàn)報(bào)告1標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)手寫數(shù)字識(shí)別以下代碼是TensorFlow1.0版本中進(jìn)行,運(yùn)行在2.0環(huán)境,因此屏蔽v2,并產(chǎn)生警告1.1代碼1淺層封裝適合查看中間過(guò)程數(shù)據(jù)變化1.1.1代碼

#coding:utf-8

#In[1]:

import

pat.v1

as

tf

tf.disable_v2_behavior()

from

tensorflow.examples.tutorials.mnist

import

input_data

#In[2]:

mnist=input_data.read_data_sets('MNIST_data',one_hot

=

True)

#In[3]:

#

批次的大小

batch_size=

64

#In[4]:

#

計(jì)算一共有多少批次

n_batch=mnist.train.num_examples//batch_size

#In[5]:

#定義兩個(gè)placeholder

x=tf.placeholder(tf.float32,[None,784])

y=tf.placeholder(tf.float32,[None,10])

#In[6]:

#

初始化權(quán)值

def

weight_variable(shape):

initial=tf.truncated_normal(shape,stddev=0.1)#生成一個(gè)截?cái)嗟恼龖B(tài)分布

return

tf.Variable(initial)

#

初始化偏置

def

bias_variable(shape):

initial=tf.constant(0.1,shape=shape)

return

tf.Variable(initial)

#

卷積層

def

conv2d(x,W):

#xinputtensorofshape`[batch,in_height,in_width,in_channels]`,批次,寬度,高度。通道

#Wfilter/kerneltensorofshape[filter_height,filter_width,in_channels,out_channels]

#`strides[0]=strides[3]=1`.固定寫法,

strides[1]代表x方向的步長(zhǎng),strides[2]代表y方向的步長(zhǎng)

#padding:A`string`from:`"SAME","VALID"`

return

tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

#

returntf.nn.conv2d(x,W,strides=[1,1,1,1],padding='VALID')

#

池化層

2*2池化

def

max_pool_2x2(x):

#ksize[1,x,y,1]

return

tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

#

returntf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='VALID')

#In[7]:

#

改變x的格式轉(zhuǎn)為4D的格式[batch,in_height,in_width,in_channels]`,-1代表自動(dòng)匹配

x_image=tf.reshape(x,[-1,28,28,1],name

=

'x_4D')

#In[13]:

#

初始化第一個(gè)卷積層的權(quán)值和偏置

with

_scope("conv1"):

W_conv1=weight_variable([5,5,1,32])#5*5的采樣窗口,輸入通道數(shù)是1,輸出通道數(shù)是32

b_conv1=bias_variable([32])

#

把x_image和權(quán)值向量進(jìn)行卷積,再加上偏置值,然后應(yīng)用于relu激活函數(shù)

with

_scope('conv1_op'):

h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)

with

_scope('max_pooling1'):

h_pool1=max_pool_2x2(h_conv1)#進(jìn)行max-pooling

#

初始化第二個(gè)卷積層的權(quán)值和偏置

with

_scope("conv2"):

W_conv2=weight_variable([5,5,32,64])#5*5的采樣窗口,輸入通道數(shù)是32,輸出通道數(shù)是64

b_conv2=bias_variable([64])

#

把h_pool1和權(quán)值向量進(jìn)行卷積,再加上偏置值,然后應(yīng)用于relu激活函數(shù)

with

_scope('conv2_op'):

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

with

_scope('max_pooling2'):

h_pool2=max_pool_2x2(h_conv2)#進(jìn)行max-pooling

#28*28的圖片第一次卷積后還是28*28,第一次池化后變?yōu)?4*14

#

第二次卷積后為14*14,第二次池化后變?yōu)榱?*7

#

進(jìn)過(guò)上面操作后得到64張7*7的平面

#(64,7,7,64)

#

初始化第一個(gè)全連接層的權(quán)值

#上一層有7*7*64個(gè)神經(jīng)元,全連接層有1024個(gè)神經(jīng)元

with

_scope('fc1'):

W_fc1=weight_variable([7*7*64,1024])

b_fc1=bias_variable([1024])

#

把池化層2的輸出扁平化為1維

with

_scope('h_pool2_flat'):

h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])

#

求第一個(gè)全連接層的輸出

with

_scope('fc1_op'):

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

#keep_prob用來(lái)表示神經(jīng)元的輸出概率,現(xiàn)在tensor2.2使用rate

rate=tf.placeholder(tf.float32,name

=

'drop_rate')

with

_scope('fc1_drop'):

h_fc1_drop=tf.nn.dropout(h_fc1,rate)

#

初始化第二個(gè)全連接層

with

_scope('fc2'):

W_fc2=weight_variable([1024,10])

b_fc2=bias_variable([10])

#

計(jì)算輸出

with

_scope('prediction'):

prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)

#

交叉熵代價(jià)函數(shù)

with

_scope('loss_softmax'):

cross_entropy=tf.losses.softmax_cross_entropy(y,prediction)

#

使用AdamOptimizer進(jìn)行優(yōu)化

with

_scope('train'):

train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

#

結(jié)果存放在一個(gè)布爾列表中

with

_scope('correct_list'):

correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))

#

求準(zhǔn)確率

with

_scope('accuracy'):

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

#In[16]:

with

tf.Session()

as

sess:

sess.run(tf.global_variables_initializer())

writer=tf.summary.FileWriter('./logs_cnn/cn',sess.graph)

for

epoch

in

range(10):

for

batch

in

range(n_batch):

batch_xs,batch_ys=

mnist.train.next_batch(batch_size)

sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,rate:0.7})

acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,rate:1.0})

print

("Iter"

+

str(epoch)+

",TestingAccuracy="

+

str(acc))

#In[]:

1.1.2TensorBoard圖需要自己定義命名空間才可以很清晰

1.1.3數(shù)據(jù)流圖

1.2代碼進(jìn)一步封裝1.2.1代碼各層更加清晰,同時(shí)改變每次的函數(shù)更加方便

#coding:utf-8

#In[6]:

importpat.v1astf

tf.disable_v2_behavior()

tf.reset_default_graph()

frompat.v1importConfigProto

frompat.v1importInteractiveSession

config=ConfigProto()

config.gpu_options.allow_growth=True

session=InteractiveSession(config=config)

fromtensorflow.examples.tutorials.mnistimportinput_data

#In[7]:

#讀出數(shù)據(jù)

mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

#In[8]:

#批次的大小

batch_size=64

#計(jì)算一共有多少批次

n_batch=mnist.train.num_examples//batch_size

#定義兩個(gè)placeholder,作為圖片數(shù)據(jù)和標(biāo)簽值

x=tf.placeholder(tf.float32,[None,784])

y=tf.placeholder(tf.float32,[None,10])

#改變x的格式轉(zhuǎn)為4D的格式[batch,in_height,in_width,in_channels]`,-1代表自動(dòng)匹配

x_image=tf.reshape(x,[-1,28,28,1],name='x_4D')

#In[9]:

conv1=tf.layers.conv2d(x_image,

32,

(5,5),#kernelsize

padding='same',

activation=tf.nn.relu,

name='conv1')

pool1=tf.layers.max_pooling2d(conv1,

(2,2),#kernelsize

(2,2),#步長(zhǎng)

name='pool1'

)

conv2=tf.layers.conv2d(pool1,

64,

(5,5),#kernelsize

padding='same',

activation=tf.nn.relu,

name='conv2')

pool2=tf.layers.max_pooling2d(conv2,

(2,2),#kernelsize

(2,2),#步長(zhǎng)

name='pool2'

)

#將數(shù)據(jù)展平

flatten=tf.layers.flatten(pool2)

dense1=tf.layers.dense(flatten,1024,activation=tf.nn.relu)

prediction=tf.layers.dense(dense1,10,activation=tf.nn.softmax)

#交叉熵代價(jià)函數(shù)

loss=tf.losses.softmax_cross_entropy(y,prediction)

#使用AdamOptimizer進(jìn)行優(yōu)化

with_scope('train'):

train_step=tf.train.AdamOptimizer(1e-4).minimize(loss)

#結(jié)果存放在一個(gè)布爾列表中

with_scope('correct_list'):

correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))

#求準(zhǔn)確率

with_scope('accuracy'):

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

#In[]:

withtf.Session()assess:

sess.run(tf.global_variables_initializer())

writer=tf.summary.FileWriter('./logs_cnn/structure',sess.graph)

forepochinrange(10):

forbatchinrange(n_batch):

batch_xs,batch_ys=

mnist.train.next_batch(batch_size)

sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})

acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

print("Iter"+str(epoch)+",TestingAccuracy="+str(acc))

#In[]:

1.2.2Tensorboard計(jì)算圖比之前的更加具有條理2相同網(wǎng)絡(luò)結(jié)構(gòu)下的不同激活函數(shù)2.1理論知識(shí)參考:/p/89956fbb7098

2.1.1sigmoid函數(shù)sigmoid函數(shù)輸入一個(gè)實(shí)值的數(shù),然后將其壓縮到0~1的范圍內(nèi)。特別地,大的負(fù)數(shù)被映射成0,大的正數(shù)被映射成1,數(shù)值絕對(duì)值越大,梯度越平坦,敏感度越低。也正是這個(gè)特點(diǎn),為它的失寵埋下了伏筆缺點(diǎn):1.Sigmoid容易飽和,當(dāng)輸入非常大或者非常小的時(shí)候,函數(shù)曲線非常平坦,梯度就接近于0,從圖中可以看出梯度的趨勢(shì)。而反向傳播中,我們需要使用sigmoid的導(dǎo)數(shù)來(lái)更新權(quán)重,如果導(dǎo)數(shù)都基本為0,會(huì)導(dǎo)致權(quán)重基本沒什么更新,我們就無(wú)法遞歸地學(xué)習(xí)到輸入數(shù)據(jù)了,這種現(xiàn)象也可以叫做梯度彌散。2.Sigmoid的輸出不是0均值的,這是我們不希望的,因?yàn)檫@會(huì)導(dǎo)致后層的神經(jīng)元的輸入是非0均值的信號(hào),這會(huì)對(duì)梯度產(chǎn)生影響:假設(shè)后層神經(jīng)元的輸入都為正,那么對(duì)w求局部梯度則都為正,這樣在反向傳播的過(guò)程中w要么都往正方向更新,要么都往負(fù)方向更新,導(dǎo)致有一種捆綁的效果,使得收斂緩慢。3.計(jì)算量大,sigmod函數(shù)要進(jìn)行指數(shù)運(yùn)算,這個(gè)對(duì)于計(jì)算機(jī)來(lái)說(shuō)是比較慢的。優(yōu)點(diǎn):

將所有數(shù)據(jù)映射成了(0,1)之間的數(shù),很好的表達(dá)神經(jīng)元的激活與未激活的狀態(tài),適合二分類。2.1.2tanh函數(shù)tanh是在sigmoid基礎(chǔ)上的改進(jìn),將壓縮范圍調(diào)整為(-1,1)。Tanh和Sigmoid是一對(duì)姐妹花,圖形基本是相似的,不同的是它把輸入壓縮到(-1,1)的范圍,因此它基本是0均值的。優(yōu)點(diǎn):

它是0均值的,解決了上述Sigmoid缺點(diǎn)中的第二個(gè),所以實(shí)際中tanh會(huì)比sigmoid更常用。缺點(diǎn):1.它還是存在梯度彌散的問(wèn)題。2.計(jì)算量大,函數(shù)要進(jìn)行指數(shù)運(yùn)算,這個(gè)對(duì)于計(jì)算機(jī)來(lái)說(shuō)是比較慢的。

2.1.3relu函數(shù)relu函數(shù)是目前主流的激活函數(shù),它的公式很簡(jiǎn)單,輸入小于0的時(shí)候?yàn)?,大于0的時(shí)候是本身。優(yōu)點(diǎn):1.正方向上,梯度不變,也就不會(huì)發(fā)生梯度彌散。2.正方向上是線性函數(shù),相比于sigmoid/tanh需要計(jì)算指數(shù)等,ReLU只需要一個(gè)閾值就可以得到激活值。缺點(diǎn):

只要輸入是負(fù)值,那么輸出就為0,這可能導(dǎo)致后面的網(wǎng)絡(luò)輸入都是0,造成網(wǎng)絡(luò)大面積壞死。2.1.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論