TensorFlow实战-AlexNet
生活随笔
收集整理的這篇文章主要介紹了
TensorFlow实战-AlexNet
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 # 導入數據
2 from tensorflow.examples.tutorials.mnist import input_data
3 # 讀取數據
4 mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)
5 import tensorflow as tf
6
7 # 定義卷積操作函數
8 def conv2d(name,x,w,b):
9 return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME'),b),name=name)
10
11 # 定義下采樣操作函數
12 def max_pool(name,x,k):
13 return tf.nn.max_pool(x,ksize=[1,k,k,1],strides=[1,k,k,1],padding='SAME',name=name)
14
15 # 定義歸一化函數
16 def norm(name,x,lsize=4):
17 return tf.nn.lrn(x,lsize,bias=1.0,alpha=0.001/9,beta=0.75,name=name)
18
19 # 正式定義alex_net網絡結構
20 def alex_net(_X,_weights,_biases,_dropout):
21 # 對輸入進行形變
22 _X=tf.reshape(_X,shape=[-1,28,28,1])
23
24 # 構建第一個卷積層
25 conv1=conv2d('conv1',_X,_weights['wc1'],_biases['bc1'])
26 pool1=max_pool('pool1',conv1,k=2)
27 norm1=norm('norm1',pool1,lsize=4)
28 drop1=tf.nn.dropout(norm1,_dropout)
29
30 # 構建第二個卷積層
31 conv2=conv2d('conv2',drop1,_weights['wc2'],_biases['bc2'])
32 pool2=max_pool('pool2',conv2,k=2)
33 norm2=norm('norm2',pool2,lsize=4)
34 drop2=tf.nn.dropout(norm2,_dropout)
35
36 # 構建第三個卷積層
37 conv3=conv2d('conv3',drop2,_weights['wc3'],_biases['bc3'])
38 pool3=max_pool('pool3',conv3,k=2)
39 norm3=norm('norm3',pool3,lsize=4)
40 drop3=tf.nn.dropout(norm3,_dropout)
41
42 # 對輸出進行形變,然后連接三個全連接層
43 dense1=tf.reshape(drop3,shape=[-1,_weights['wd1'].get_shape().as_list()[0]])
44 dense1=tf.nn.relu(tf.matmul(dense1,_weights['wd1'])+_biases['bd1'],name='fc1')
45 dense2=tf.nn.relu(tf.matmul(dense1,_weights['wd2'])+_biases['bd2'],name='fc2')
46 out=tf.matmul(dense2,_weights['out']+_biases['out'])
47 return out
48
49 # 設置網絡訓練參數
50 learning_rate=0.001
51 training_iters=200000
52 batch_size=64
53 display_step=20
54
55 # 設置數據參數
56 n_input=784
57 n_classes=10
58 dropout=0.8
59
60 # 占位符輸入 有的版本寫成 tf.types.float32
61 x=tf.placeholder(tf.float32,[None,n_input])
62 y=tf.placeholder(tf.float32,[None,n_classes])
63 keep_prob=tf.placeholder(tf.float32)
64
65 # 設置網絡核的大小,層數,采樣步長等
66 weights={
67 'wc1':tf.Variable(tf.random_normal([3,3,1,64])),
68 'wc2':tf.Variable(tf.random_normal([3,3,64,128])),
69 'wc3':tf.Variable(tf.random_normal([3,3,128,256])),
70 'wd1':tf.Variable(tf.random_normal([4*4*256,1024])),
71 'wd2':tf.Variable(tf.random_normal([1024,1024])),
72 'out':tf.Variable(tf.random_normal([1024,10]))
73 }
74
75 biases={
76 'bc1':tf.Variable(tf.random_normal([64])),
77 'bc2':tf.Variable(tf.random_normal([128])),
78 'bc3':tf.Variable(tf.random_normal([256])),
79 'bd1':tf.Variable(tf.random_normal([1024])),
80 'bd2':tf.Variable(tf.random_normal([1024])),
81 'out':tf.Variable(tf.random_normal([n_classes]))
82 }
83
84 # 構建一個alex_net網絡,并根據輸入預測輸出結果
85 pred=alex_net(x,weights,biases,keep_prob)
86
87 # 根據預測值pred和真實標簽y,構建損失函數
88 cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))
89 // 設置優化函數,最小化損失函數
90 optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
91
92 # 設置測試網絡
93 correct_pred=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
94 accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))
95
96 # 初始化網絡所有對權重 有的版本寫成 global_variables_initializer
97 init=tf.initialize_all_variables()
98
99 with tf.Session() as sess:
100 # 初始化網絡權值
101 sess.run(init)
102 step = 1
103
104 # 開始訓練網絡,直到達到最大迭代次數
105 while step * batch_size < training_iters:
106 # 獲取批數據
107 batch_xs, batch_ys = mnist.train.next_batch(batch_size)
108
109 # 根據批數據訓練網絡
110 sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})
111
112 # 打印輸出
113 if step % display_step == 0:
114 # 計算精度
115 acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
116 # 計算損失值
117 loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
118 print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)
119 step += 1
120
121 print "Optimization Finished!"
122 # 計算測試精度
123 print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.}) View Code
?code 解析:
tf.argmax(y,1)函數返回tensor中參數指定對維度中的最大值的索引。在模型中,對應輸入數據對最大概率標簽。
tf.argmax(pred,1)為預測結果
tf.equal比較預測結果和實際結果是否相等。返回一個波哦里列表。
tf.cast將bool列表中的bool值轉換成浮點數,如[True,False,True,True]轉換成[1,0,1,1]
tf.reduce_mean來計算準確率,如0.75
?
AlexNet:
(1)獲得里ILSVRC比賽分類項目的2012年冠軍(top-5錯誤率16.4%,使用額外數據可達到15.3%,8層神經網絡 5 conv+3 fc)
- 有8個需要訓練參數的層(不包括池化層和LRN層)
- 最后一層是有1000類輸出的Softmax層用作分類
- ReLU在8層(conv或fc)每一層的后面
- LRN層在conv1和conv2的ReLU后
- max_pooling層在LRN1 LRN2和 conv5 之后
(2)首次在CNN中成功應用里ReLU Dropout和LRN等Trick:
- 成功使用ReLU作為CNN的激活函數,并驗證其效果在較深對網絡超過里Sigmoid,成功解決里Sigmoid在網絡較深時對梯度彌散問題。雖然ReLU激活函數在很久之前就被提出,但是直到AlexNet的出現才將其發揚光大。
- 訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合。Dropout雖然有單獨對論文,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要時最后幾個全連接使用了Dropout。
- 在CNN中使用重疊對最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化對模糊化效果。并且AlexNet中提出讓步長比池化核的尺寸小,這樣池化層對輸出之間會有重疊和覆蓋,提升里特征對豐富性。
- 提出了LRN層,對局部神經元對活動創建競爭機制,使得其中響應比較大對值變得相對更大,并抑制其他反饋較小的神經元,增強里模型對泛化能力。
- 使用CUDA加速深度卷積網絡的訓練,利用GPU強大對并行計算能力,處理神經網絡訓練時大量的矩陣運算。AlexNet使用了兩塊GTX 580 GPU進行訓練,單個GTX 580只有3GB顯存,這限制了可訓練的網絡的最大規模。因此作者將AlexNet分布在兩個GPU上,在每個GPU的顯存中儲存一半對神經元對參數。因為GPU之間對通信方便,可以互相訪問顯存,而不需要通過主機內存,所以同時使用多塊GPU也是非常高效的。同時,讓GPU之間的通信只在網絡的某些層進行,控制里通信對性能損耗。
- 數據增強,隨機地從256×256的原始圖像中截取224×224大小對區域以及水平翻轉對鏡像,相當于增加了(256-224)×(256-224)×2=2048倍的數據量。如果沒有數據增強,僅靠原始對數據量,CNN會陷入過擬合。進行預測時,則是取圖片對四個角加中間共五個位置,并進行左右翻轉,一共獲得10張圖片。對他們進行預測并對10次結果求均值。同時,對圖像TGB數據進行PCA處理,并對主成分做一個標準差為0.1的高斯擾動,增加一些噪聲,這個Trick可以讓錯誤率再下降1%。
?
參考資料:
《TensorFlow實戰》黃文堅? 唐源 著
?
轉載于:https://www.cnblogs.com/fighting-lady/p/7093217.html
總結
以上是生活随笔為你收集整理的TensorFlow实战-AlexNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis的配置文件中selectK
- 下一篇: iOS imageio nsurlses