人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

TensorFlow卷積神經(jīng)網(wǎng)絡(luò)AlexNet實(shí)現(xiàn)示例詳解

發(fā)布日期:2021-12-14 15:59 | 文章來源:腳本之家

2012年,Hinton的學(xué)生Alex Krizhevsky提出了深度卷積神經(jīng)網(wǎng)絡(luò)模型AlexNet,它可以算是LeNet的一種更深更寬的版本。AlexNet以顯著的優(yōu)勢贏得了競爭激烈的ILSVRC 2012比賽,top-5的錯(cuò)誤率降低至了16.4%,遠(yuǎn)遠(yuǎn)領(lǐng)先第二名的26.2%的成績。AlexNet的出現(xiàn)意義非常重大,它證明了CNN在復(fù)雜模型下的有效性,而且使用GPU使得訓(xùn)練在可接受的時(shí)間范圍內(nèi)得到結(jié)果,讓CNN和GPU都大火了一把。AlexNet可以說是神經(jīng)網(wǎng)絡(luò)在低谷期后的第一次發(fā)聲,確立了深度學(xué)習(xí)(深度卷積網(wǎng)絡(luò))在計(jì)算機(jī)視覺的統(tǒng)治地位,同時(shí)也推動(dòng)了深度學(xué)習(xí)在語音識(shí)別、自然語言處理、強(qiáng)化學(xué)習(xí)等領(lǐng)域的拓展。

模型結(jié)構(gòu)

整個(gè)AlexNet前5層為卷積層,后3個(gè)為全連接層,其中最后一層是1000類輸出的Softmax分類輸出層。LRN層在第1個(gè)及第2個(gè)卷積層之后,Max pooling層在兩個(gè)LRN層之后和最后一個(gè)卷積層之后。ReLU激活函數(shù)跟在5個(gè)卷積層和2個(gè)全連接層后面(最后輸出層沒有)。

因?yàn)锳lexNet訓(xùn)練時(shí)使用了兩塊GPU,因此這個(gè)結(jié)構(gòu)圖中不少組件都被拆為了兩部分?,F(xiàn)在我們GPU的顯存足夠大可以放下全部模型參數(shù),因此只考慮一塊GPU的情況。

AlexNet中包含的新技術(shù)點(diǎn)

成功使用ReLU作為CNN的激活函數(shù),并驗(yàn)證了在較深的網(wǎng)絡(luò)中其效果超過了Sigmoid,成功解決了Sigmoid在網(wǎng)絡(luò)較深時(shí)的梯度消失問題。雖然ReLU在很久之前就被提出來了,但AlexNet的出現(xiàn)才將其發(fā)揚(yáng)光大。

網(wǎng)絡(luò)中加入了Dropout層,訓(xùn)練時(shí)使用Dropout隨機(jī)殺死(忽略)一部分神經(jīng)元,以避免模型過擬合。(AlexNet通過實(shí)踐證實(shí)了Dropout的效果,關(guān)于Dropout有單獨(dú)的論文論述。)

池化層使用Max pooling,此前CNN普遍使用平均池化,最大池化避免了平均池化的模糊化效果。且提出讓步長小于池化核的尺寸,這樣池化層的輸出之間會(huì)有重疊和覆蓋,提升了特征的豐富性。

提出了LRN層(Local Response Normalization),對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競爭機(jī)制,使得其中響應(yīng)比較大的值變的相對(duì)更大,并抑制其它反饋較小的神經(jīng)元,增強(qiáng)了模型的泛化能力。

使用CUDA加速深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,利用GPU強(qiáng)大的并行計(jì)算能力,處理神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)大量的矩陣運(yùn)算。(當(dāng)時(shí)Alex使用的是兩塊GTX 580,單個(gè)GPU只有3GB顯存,限制了可訓(xùn)練的網(wǎng)絡(luò)的最大規(guī)模。因此他將AlexNet分布在兩個(gè)GPU上,每個(gè)GPU的顯存中儲(chǔ)存一半的神經(jīng)元的參數(shù)。現(xiàn)在GTX 1080Ti都出來了,硬件發(fā)展的還是比較快的,這也是深度學(xué)習(xí)能飛速發(fā)展的重要原因之一吧)

數(shù)據(jù)增強(qiáng)。隨機(jī)地從256*256的原始圖像中截取224*224大小的區(qū)域(以及水平翻轉(zhuǎn)的鏡像),相當(dāng)于增加了((256-224)^2)*2=2048倍的數(shù)據(jù)量。如果沒有數(shù)據(jù)增強(qiáng),僅靠原始數(shù)據(jù)的數(shù)據(jù)量,參數(shù)眾多的CNN會(huì)陷入過擬合中,進(jìn)行數(shù)據(jù)增強(qiáng)后可以大大減輕過擬合,提升模型的泛化能力。進(jìn)行預(yù)測時(shí),則是取圖片的四個(gè)角加中間共5個(gè)位置,并進(jìn)行左右翻轉(zhuǎn),一共獲得10個(gè)圖片,對(duì)它們進(jìn)行預(yù)測并對(duì)求10次結(jié)果求均值。同時(shí),AlexNet論文中提到了會(huì)對(duì)圖像的RGB數(shù)據(jù)進(jìn)行PCA處理,并對(duì)主成分做一個(gè)標(biāo)準(zhǔn)差為0.1的高斯擾動(dòng),增加了一些噪聲,這個(gè)Trick可以讓錯(cuò)誤率再下降1%。

AlexNet每層的超參數(shù)

其中,

Input:圖片尺寸224*224

Conv1:卷積核11*11,步長4,96個(gè)filter(卷積核尺寸較大)

ReLU

LRN1

Max pooling1:3*3,步長2

Conv2:卷積核5*5,步長1,256個(gè)filter

ReLU

LRN2

Max pooling2:3*3,步長2

Conv3:卷積核3*3,步長1,384個(gè)filter

ReLU

Conv4:卷積核3*3,步長1,384個(gè)filter

ReLU

Conv5:卷積核3*3,步長1,256個(gè)filter

ReLU

Max pooling3:3*3,步長2

FC1:4096

ReLU

FC2:4096

ReLU

FC3(Output):1000

對(duì)AlexNet使用MNIST數(shù)據(jù)集

代碼如下:

from datetime import datetime
import time
import tensorflow as tf
import input_data
mnist = input_data.read_data_sets('data/', one_hot=True)
print("MNIST READY")
# 定義網(wǎng)絡(luò)參數(shù)
n_input = 784 # 輸入的維度
n_output = 10 # 標(biāo)簽的維度
learning_rate = 0.001
dropout = 0.75
# 定義函數(shù)print_activations來顯示網(wǎng)絡(luò)每一層結(jié)構(gòu),展示每一個(gè)卷積層或池化層輸出tensor的尺寸
def print_activations(t):
 print(t.op.name, '', t.get_shape().as_list())
# 定義卷積操作
def conv2d(input, w, b):
 return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding='SAME'), b)) # 參數(shù)分別指定了卷積核的尺寸、多少個(gè)channel、filter的個(gè)數(shù)即產(chǎn)生特征圖的個(gè)數(shù)# 步長為1,即掃描全圖像素,[1, 1, 1, 1]分別代表batch_size、h、w、c的stride
# 定義池化操作
def max_pool(input):
 return tf.nn.max_pool(input, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # padding有兩種選擇:'SAME'(窗口滑動(dòng)時(shí),像素不夠會(huì)自動(dòng)補(bǔ)0)或'VALID'(不夠就跳過)兩種選擇
# 定義全連接操作
def fc(input, w, b):
 return tf.nn.relu(tf.add(tf.matmul(input, w), b)) # w*x+b,再通過非線性激活函數(shù)relu
# 定義網(wǎng)絡(luò)結(jié)構(gòu)
def alex_net(_input, _weights, _biases, _keep_prob):
 _input_r = tf.reshape(_input, [-1, 28, 28, 1])  # 對(duì)圖像做一個(gè)預(yù)處理,轉(zhuǎn)換為tf支持的格式,即[n, h, w, c],-1是確定好其它3維后,讓tf去推斷剩下的1維
 with tf.name_scope('conv1'):
  _conv1 = conv2d(_input_r, _weights['wc1'], _biases['bc1'])
  print_activations(_conv1) # 將這一層最后輸出的tensor conv1的結(jié)構(gòu)打印出來
 # # 這里參數(shù)基本都是AlexNet論文中的推薦值,但目前其他經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)模型基本都放棄了LRN(主要是效果不明顯),
 # # 并且使用LRN也會(huì)讓前饋、反饋的速度大大下降(整體速度降到1/3)
 # with tf.name_scope('_lrn1'):
 #  _lrn1 = tf.nn.lrn(_conv1, 4, bias=1.0, alpha=0.001/9, beta=0.75)
 with tf.name_scope('pool1'):
  _pool1 = max_pool(_conv1)
  print_activations(_pool1)
 with tf.name_scope('conv2'):
  _conv2 = conv2d(_pool1, _weights['wc2'], _biases['bc2'])
  print_activations(_conv2)
 # with tf.name_scope('_lrn2'):
 #  _lrn2 = tf.nn.lrn(_conv2, 4, bias=1.0, alpha=0.001/9, beta=0.75)
 with tf.name_scope('pool2'):
  _pool2 = max_pool(_conv2)
  print_activations(_pool2)
 with tf.name_scope('conv3'):
  _conv3 = conv2d(_pool2, _weights['wc3'], _biases['bc3'])
  print_activations(_conv3)
 with tf.name_scope('conv4'):
  _conv4 = conv2d(_conv3, _weights['wc4'], _biases['bc4'])
  print_activations(_conv4)
 with tf.name_scope('conv5'):
  _conv5 = conv2d(_conv4, _weights['wc5'], _biases['bc5'])
  print_activations(_conv5)
 with tf.name_scope('pool3'):
  _pool3 = max_pool(_conv5)
  print_activations(_pool3)
 _densel = tf.reshape(_pool3, [-1, _weights['wd1'].get_shape().as_list()[0]])  # 定義全連接層的輸入,把pool2的輸出做一個(gè)reshape,變?yōu)橄蛄康男问? # pool_shape = _pool3.get_shape().as_list()
 # nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
 with tf.name_scope('fc1'):
  _fc1 = fc(_densel, _weights['wd1'], _biases['bd1'])
  _fc1_drop = tf.nn.dropout(_fc1, _keep_prob) # 為了減輕過擬合,使用Dropout層
  print_activations(_fc1_drop)
 with tf.name_scope('fc2'):
  _fc2 = fc(_fc1_drop, _weights['wd2'], _biases['bd2'])
  _fc2_drop = tf.nn.dropout(_fc2, _keep_prob)
  print_activations(_fc2_drop)
 with tf.name_scope('out'):
  _out = tf.add(tf.matmul(_fc2_drop, _weights['wd3']), _biases['bd3'])
  print_activations(_out)
 return _out
print("CNN READY")
x = tf.placeholder(tf.float32, [None, n_input]) # 用placeholder先占地方,樣本個(gè)數(shù)不確定為None
y = tf.placeholder(tf.float32, [None, n_output]) # 用placeholder先占地方,樣本個(gè)數(shù)不確定為None
keep_prob = tf.placeholder(tf.float32)
# 存儲(chǔ)所有的網(wǎng)絡(luò)參數(shù)
weights = {
 # 使用截?cái)嗟恼龖B(tài)分布(標(biāo)準(zhǔn)差0.1)初始化卷積核的參數(shù)kernel,卷積核大小為3*3,channel為1,個(gè)數(shù)64
 'wc1': tf.Variable(tf.truncated_normal([3, 3, 1, 64], dtype=tf.float32, stddev=0.1), name='weights1'),
 'wc2': tf.Variable(tf.truncated_normal([3, 3, 64, 128], dtype=tf.float32, stddev=0.1), name='weights2'),
 'wc3': tf.Variable(tf.truncated_normal([3, 3, 128, 256], dtype=tf.float32, stddev=0.1), name='weights3'),
 'wc4': tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32, stddev=0.1), name='weights4'),
 'wc5': tf.Variable(tf.truncated_normal([3, 3, 256, 128], dtype=tf.float32, stddev=0.1), name='weights5'),
 'wd1': tf.Variable(tf.truncated_normal([4*4*128, 1024], dtype=tf.float32, stddev=0.1), name='weights_fc1'),
 'wd2': tf.Variable(tf.random_normal([1024, 1024], dtype=tf.float32, stddev=0.1), name='weights_fc2'),
 'wd3': tf.Variable(tf.random_normal([1024, n_output], dtype=tf.float32, stddev=0.1), name='weights_output')
}
biases = {
 'bc1': tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name='biases1'),
 'bc2': tf.Variable(tf.constant(0.0, shape=[128], dtype=tf.float32), trainable=True, name='biases2'),
 'bc3': tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases3'),
 'bc4': tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name='biases4'),
 'bc5': tf.Variable(tf.constant(0.0, shape=[128], dtype=tf.float32), trainable=True, name='biases5'),
 'bd1': tf.Variable(tf.constant(0.0, shape=[1024], dtype=tf.float32), trainable=True, name='biases_fc1'),
 'bd2': tf.Variable(tf.constant(0.0, shape=[1024], dtype=tf.float32), trainable=True, name='biases_fc2'),
 'bd3': tf.Variable(tf.constant(0.0, shape=[n_output], dtype=tf.float32), trainable=True, name='biases_output')
}
pred = alex_net(x, weights, biases, keep_prob) # 前向傳播的預(yù)測值
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) # 交叉熵?fù)p失函數(shù),參數(shù)分別為預(yù)測值_pred和實(shí)際label值y,reduce_mean為求平均loss
optm = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # 梯度下降優(yōu)化器
corr = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) # tf.equal()對(duì)比預(yù)測值的索引和實(shí)際label的索引是否一樣,一樣返回True,不一樣返回False
accuracy = tf.reduce_mean(tf.cast(corr, tf.float32)) # 將pred即True或False轉(zhuǎn)換為1或0,并對(duì)所有的判斷結(jié)果求均值
# 初始化所有參數(shù)
init = tf.global_variables_initializer()
print("FUNCTIONS READY")
# 上面神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)定義好之后,下面定義一些超參數(shù)
training_epochs = 1000 # 所有樣本迭代1000次
batch_size = 1 # 每進(jìn)行一次迭代選擇50個(gè)樣本
display_step = 10
sess = tf.Session() # 定義一個(gè)Session
sess.run(init) # 在sess里run一下初始化操作
for epoch in range(training_epochs):
 avg_cost = 0.
 total_batch = int(mnist.train.num_examples/batch_size)
 start_time = time.time()
 for i in range(total_batch):
  batch_xs, batch_ys = mnist.train.next_batch(batch_size) # 逐個(gè)batch的去取數(shù)據(jù)
  # 獲取批數(shù)據(jù)
  sess.run(optm, feed_dict={x: batch_xs, y: batch_ys, keep_prob:dropout})
  avg_cost += sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob:1.0})/total_batch
 if epoch % display_step == 0:
  train_accuracy = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.0})
  test_accuracy = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob:1.0})
  print("Epoch: %03d/%03d cost: %.9f TRAIN ACCURACY: %.3f TEST ACCURACY: %.3f" % (epoch, training_epochs, avg_cost, train_accuracy, test_accuracy))
 # 計(jì)算每輪迭代的平均耗時(shí)mn和標(biāo)準(zhǔn)差sd,并顯示
 duration = time.time() - start_time
 print('%s: step %d, duration = %.3f' % (datetime.now(), epoch, duration))
print("DONE")

本文參考《TensorFlow實(shí)戰(zhàn)》黃文堅(jiān) 唐源 著

以上就是TensorFlow卷積神經(jīng)網(wǎng)絡(luò)AlexNet實(shí)現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于TensorFlow卷積神經(jīng)網(wǎng)絡(luò)AlexNet的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部