版權(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})
("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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)療機(jī)構(gòu)醫(yī)療設(shè)備管理規(guī)范
- 會(huì)議室開會(huì)制度
- 物流配送中心運(yùn)營(yíng)管理優(yōu)化方案(標(biāo)準(zhǔn)版)
- 人力資源管理信息化建設(shè)與實(shí)施(標(biāo)準(zhǔn)版)
- 車站客運(yùn)服務(wù)設(shè)施維護(hù)與管理制度
- 北宋中央制度
- 辦公室員工離職原因分析制度
- 安全生產(chǎn)制度
- 2026年湖南省演出公司公開招聘?jìng)淇碱}庫(kù)及參考答案詳解
- 2026年長(zhǎng)郡中學(xué)國(guó)際部誠(chéng)聘全球精英教師備考題庫(kù)及一套完整答案詳解
- 2026年1月福建廈門市集美區(qū)后溪鎮(zhèn)衛(wèi)生院補(bǔ)充編外人員招聘16人筆試備考試題及答案解析
- 人教版-培智二年級(jí)上-生活數(shù)學(xué)-教案
- GB/T 43731-2024生物樣本庫(kù)中生物樣本處理方法的確認(rèn)和驗(yàn)證通用要求
- 新生兒血便原因課件
- 安徽省合肥市第四十五中學(xué)2022-2023學(xué)年七年級(jí)上學(xué)期數(shù)學(xué)期末試題(含答案 滬科版)
- 2024年部門業(yè)務(wù)主管自查自糾問(wèn)題總結(jié)及整改措施
- 烏魯木齊地區(qū)2024年高三年級(jí)第一次質(zhì)量監(jiān)測(cè)(一模)英語(yǔ)試卷(含答案)
- 六年級(jí)上冊(cè)必讀書目《童年》閱讀測(cè)試題(附答案)
- 不良事件的管理查房
- 雅思閱讀總述講解
- 地下室消防安全制度
評(píng)論
0/150
提交評(píng)論