0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度學(xué)習(xí)筆記8:利用Tensorflow搭建神經(jīng)網(wǎng)絡(luò)

人工智能實訓(xùn)營 ? 2018-08-24 18:31 ? 次閱讀

在筆記7中,和大家一起入門了 Tensorflow 的基本語法,并舉了一些實際的例子進行了說明,終于告別了使用 numpy 手動搭建的日子。所以我們將繼續(xù)往下走,看看如何利用 Tensorflow 搭建神經(jīng)網(wǎng)絡(luò)模型。

盡管對于初學(xué)者而言使用 Tensorflow 看起來并不那么習(xí)慣,需要各種步驟,但簡單來說,Tensorflow 搭建模型實際就是兩個過程:創(chuàng)建計算圖和執(zhí)行計算圖。在 deeplearningai 課程中,NG和他的課程組給我們提供了 Signs Dataset (手勢)數(shù)據(jù)集,其中訓(xùn)練集包括1080張64x64像素的手勢圖片,并給定了 6 種標(biāo)注,測試集包括120張64x64的手勢圖片,我們需要對訓(xùn)練集構(gòu)建神經(jīng)網(wǎng)絡(luò)模型然后對測試集給出預(yù)測。

先來簡單看一下數(shù)據(jù)集:

#LoadingthedatasetX_train_orig,Y_train_orig,X_test_orig,Y_test_orig,classes=load_dataset()#FlattenthetrainingandtestimagesX_train_flatten=X_train_orig.reshape(X_train_orig.shape[0],-1).T
X_test_flatten=X_test_orig.reshape(X_test_orig.shape[0],-1).T#NormalizeimagevectorsX_train=X_train_flatten/255.X_test=X_test_flatten/255.#ConverttrainingandtestlabelstoonehotmatricesY_train=convert_to_one_hot(Y_train_orig,6)
Y_test=convert_to_one_hot(Y_test_orig,6)print("numberoftrainingexamples="+str(X_train.shape[1]))print("numberoftestexamples="+str(X_test.shape[1]))print("X_trainshape:"+str(X_train.shape))print("Y_trainshape:"+str(Y_train.shape))print("X_testshape:"+str(X_test.shape))print("Y_testshape:"+str(Y_test.shape))

640?wx_fmt=png

下面就根據(jù) NG 給定的找個數(shù)據(jù)集利用 Tensorflow 搭建神經(jīng)網(wǎng)絡(luò)模型。我們選擇構(gòu)建一個包含 2 個隱層的神經(jīng)網(wǎng)絡(luò),網(wǎng)絡(luò)結(jié)構(gòu)大致如下:
LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX
正如我們之前利用
numpy 手動搭建一樣,搭建一個神經(jīng)網(wǎng)絡(luò)的主要步驟如下:
-定義網(wǎng)絡(luò)結(jié)構(gòu)
-初始化模型參數(shù)
-執(zhí)行前向計算/計算當(dāng)前損失/執(zhí)行反向傳播/權(quán)值更新

創(chuàng)建 placeholder

根據(jù) Tensorflow 的語法,我們首先創(chuàng)建輸入X 和輸出 Y 的占位符變量,這里需要注意 shape 參數(shù)的設(shè)置。

def create_placeholders(n_x, n_y):
  X = tf.placeholder(tf.float32, shape=(n_x, None), name='X')
  Y = tf.placeholder(tf.float32, shape=(n_y, None), name='Y')  
return X, Y
初始化模型參數(shù)

其次就是初始化神經(jīng)網(wǎng)絡(luò)的模型參數(shù),三層網(wǎng)絡(luò)包括六個參數(shù),這里我們采用Xavier初始化方法:

def initialize_parameters(): 
  tf.set_random_seed(1)         
  W1 = tf.get_variable("W1", [25, 12288], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b1 = tf.get_variable("b1", [25, 1], initializer = tf.zeros_initializer())
  W2 = tf.get_variable("W2", [12, 25], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b2 = tf.get_variable("b2", [12, 1], initializer = tf.zeros_initializer())
  W3 = tf.get_variable("W3", [6, 12], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b3 = tf.get_variable("b3", [6,1], initializer = tf.zeros_initializer())

  parameters = {"W1": W1,         
"b1": b1,
"W2": W2,
"b2": b2,
"W3": W3,
"b3": b3}
return parameters
執(zhí)行前向傳播
defforward_propagation(X,parameters):"""
Implementstheforwardpropagationforthemodel:LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX
"""

W1=parameters['W1']
b1=parameters['b1']
W2=parameters['W2']
b2=parameters['b2']
W3=parameters['W3']
b3=parameters['b3']

Z1=tf.add(tf.matmul(W1,X),b1)
A1=tf.nn.relu(Z1)
Z2=tf.add(tf.matmul(W2,A1),b2)
A2=tf.nn.relu(Z2)
Z3=tf.add(tf.matmul(W3,A2),b3)
returnZ3
計算損失函數(shù)

Tensorflow 中損失函數(shù)的計算要比手動搭建時方便很多,一行代碼即可搞定:

def compute_cost(Z3, Y):
  logits = tf.transpose(Z3)
  labels = tf.transpose(Y)

  cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels))  
return cost
代碼整合:執(zhí)行反向傳播和權(quán)值更新

跟計算損失函數(shù)類似,Tensorflow 中執(zhí)行反向傳播的梯度優(yōu)化非常簡便,兩行代碼即可搞定,定義完整的神經(jīng)網(wǎng)絡(luò)模型如下:

def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001,
     num_epochs = 1500, minibatch_size = 32, print_cost = True):
  ops.reset_default_graph()          
  tf.set_random_seed(1)             
  seed = 3                     
  (n_x, m) = X_train.shape            
  n_y = Y_train.shape[0]             
  costs = []                  

  # Create Placeholders of shape (n_x, n_y)
  X, Y = create_placeholders(n_x, n_y)  # Initialize parameters
  parameters = initialize_parameters()  # Forward propagation: Build the forward propagation in the tensorflow graph

  Z3 = forward_propagation(X, parameters)  # Cost function: Add cost function to tensorflow graph
  cost = compute_cost(Z3, Y)  # Backpropagation: Define the tensorflow optimizer. Use an AdamOptimizer.
  optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)  # Initialize all the variables
  init = tf.global_variables_initializer()  # Start the session to compute the tensorflow graph
  with tf.Session() as sess:    # Run the initialization
    sess.run(init)    # Do the training loop
    for epoch in range(num_epochs):
      epoch_cost = 0.          
      num_minibatches = int(m / minibatch_size) 
      seed = seed + 1
      minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)      
for minibatch in minibatches: # Select a minibatch (minibatch_X, minibatch_Y) = minibatch _ , minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y}) epoch_cost += minibatch_cost / num_minibatches # Print the cost every epoch if print_cost == True and epoch % 100 == 0:
print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
if print_cost == True and epoch % 5 == 0: costs.append(epoch_cost) # plot the cost plt.plot(np.squeeze(costs)) plt.ylabel('cost') plt.xlabel('iterations (per tens)') plt.title("Learning rate =" + str(learning_rate)) plt.show() # lets save the parameters in a variable parameters = sess.run(parameters)
print ("Parameters have been trained!") # Calculate the correct predictions correct_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y)) # Calculate accuracy on the test set accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print ("Train Accuracy:", accuracy.eval({X: X_train, Y: Y_train}))
print ("Test Accuracy:", accuracy.eval({X: X_test, Y: Y_test}))
return parameters

執(zhí)行模型:

parameters=model(X_train,Y_train,X_test,Y_test)

640?wx_fmt=png

根據(jù)模型的訓(xùn)練誤差和測試誤差可以看到:模型整體效果雖然沒有達(dá)到最佳,但基本也能達(dá)到預(yù)測效果。

總結(jié)
  • Tensorflow 語法中兩個基本的對象類是 Tensor 和 Operator.

  • Tensorflow 執(zhí)行計算的基本步驟為

    • 創(chuàng)建計算圖(張量、變量和占位符變量等)

    • 創(chuàng)建會話

    • 初始化會話

    • 在計算圖中執(zhí)行會話

可以看到的是,在 Tensorflow 中編寫神經(jīng)網(wǎng)絡(luò)要比我們手動搭建要方便的多,這也正是深度學(xué)習(xí)框架存在的意義之一。功能強大的深度學(xué)習(xí)框架能夠幫助我們快速的搭建起復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,在經(jīng)歷了手動搭建神經(jīng)網(wǎng)絡(luò)的思維訓(xùn)練過程之后,這對于我們來說就不再困難了。

本文由《自興動腦人工智能》項目部 凱文 投稿。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)工具與框架

    卷積神經(jīng)網(wǎng)絡(luò)因其在圖像和視頻處理任務(wù)中的卓越性能而廣受歡迎。隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,多種實現(xiàn)工具和框架應(yīng)運而生,為研究人員和開發(fā)者提供了強大的支持。 TensorFlow 概述
    的頭像 發(fā)表于 11-15 15:20 ?276次閱讀

    深度學(xué)習(xí)中的卷積神經(jīng)網(wǎng)絡(luò)模型

    深度學(xué)習(xí)近年來在多個領(lǐng)域取得了顯著的進展,尤其是在圖像識別、語音識別和自然語言處理等方面。卷積神經(jīng)網(wǎng)絡(luò)作為深度學(xué)習(xí)的一個分支,因其在圖像處理
    的頭像 發(fā)表于 11-15 14:52 ?348次閱讀

    利用TensorFlow實現(xiàn)基于深度神經(jīng)網(wǎng)絡(luò)的文本分類模型

    利用TensorFlow實現(xiàn)一個基于深度神經(jīng)網(wǎng)絡(luò)(DNN)的文本分類模型,我們首先需要明確幾個關(guān)鍵步驟:數(shù)據(jù)預(yù)處理、模型構(gòu)建、模型訓(xùn)練、模型評估與調(diào)優(yōu),以及最終的模型部署(盡管在本文
    的頭像 發(fā)表于 07-12 16:39 ?878次閱讀

    使用TensorFlow進行神經(jīng)網(wǎng)絡(luò)模型更新

    使用TensorFlow進行神經(jīng)網(wǎng)絡(luò)模型的更新是一個涉及多個步驟的過程,包括模型定義、訓(xùn)練、評估以及根據(jù)新數(shù)據(jù)或需求進行模型微調(diào)(Fine-tuning)或重新訓(xùn)練。下面我將詳細(xì)闡述這個過程,并附上相應(yīng)的TensorFlow代碼
    的頭像 發(fā)表于 07-12 11:51 ?431次閱讀

    簡單認(rèn)識深度神經(jīng)網(wǎng)絡(luò)

    深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)作為機器學(xué)習(xí)領(lǐng)域中的一種重要技術(shù),特別是在深度學(xué)習(xí)領(lǐng)域,已經(jīng)取得了顯著的
    的頭像 發(fā)表于 07-10 18:23 ?1040次閱讀

    深度神經(jīng)網(wǎng)絡(luò)概述及其應(yīng)用

    深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)作為機器學(xué)習(xí)的一種復(fù)雜形式,是廣義人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks, ANNs)的
    的頭像 發(fā)表于 07-04 16:08 ?1292次閱讀

    深度神經(jīng)網(wǎng)絡(luò)與基本神經(jīng)網(wǎng)絡(luò)的區(qū)別

    在探討深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)與基本神經(jīng)網(wǎng)絡(luò)(通常指傳統(tǒng)神經(jīng)網(wǎng)絡(luò)或前向神經(jīng)網(wǎng)絡(luò))的區(qū)別時,我們需
    的頭像 發(fā)表于 07-04 13:20 ?897次閱讀

    深度神經(jīng)網(wǎng)絡(luò)的設(shè)計方法

    深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)作為人工智能領(lǐng)域的重要技術(shù)之一,通過模擬人腦神經(jīng)元之間的連接,實現(xiàn)了對復(fù)雜數(shù)據(jù)的自主學(xué)習(xí)和智能判斷。其設(shè)計方法不僅涉
    的頭像 發(fā)表于 07-04 13:13 ?475次閱讀

    bp神經(jīng)網(wǎng)絡(luò)深度神經(jīng)網(wǎng)絡(luò)

    BP神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network)是一種常見的前饋神經(jīng)網(wǎng)絡(luò),它使用反向傳播算法來訓(xùn)練網(wǎng)絡(luò)。雖然BP神經(jīng)網(wǎng)絡(luò)在某些方面與
    的頭像 發(fā)表于 07-03 10:14 ?860次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練的是什么

    、訓(xùn)練過程以及應(yīng)用場景。 1. 卷積神經(jīng)網(wǎng)絡(luò)的基本概念 1.1 卷積神經(jīng)網(wǎng)絡(luò)的定義 卷積神經(jīng)網(wǎng)絡(luò)是一種前饋深度學(xué)習(xí)模型,其核心思想是
    的頭像 發(fā)表于 07-03 09:15 ?423次閱讀

    深度學(xué)習(xí)與卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用

    隨著人工智能技術(shù)的飛速發(fā)展,深度學(xué)習(xí)和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)作為其中的重要分支,已經(jīng)在多個領(lǐng)域取得了顯著的應(yīng)用成果。從圖像識別、語音識別
    的頭像 發(fā)表于 07-02 18:19 ?919次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)和bp神經(jīng)網(wǎng)絡(luò)的區(qū)別

    化能力。隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展,神經(jīng)網(wǎng)絡(luò)已經(jīng)成為人工智能領(lǐng)域的重要技術(shù)之一。卷積神經(jīng)網(wǎng)絡(luò)和BP神經(jīng)
    的頭像 發(fā)表于 07-02 14:24 ?4120次閱讀

    深度神經(jīng)網(wǎng)絡(luò)模型有哪些

    、Sigmoid或Tanh。 卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN): 卷積神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)中最重
    的頭像 發(fā)表于 07-02 10:00 ?1464次閱讀

    利用深度循環(huán)神經(jīng)網(wǎng)絡(luò)對心電圖降噪

    具體的軟硬件實現(xiàn)點擊 http://mcu-ai.com/ MCU-AI技術(shù)網(wǎng)頁_MCU-AI 我們提出了一種利用由長短期記憶 (LSTM) 單元構(gòu)建的深度循環(huán)神經(jīng)網(wǎng)絡(luò)來降 噪心電圖信號 (ECG
    發(fā)表于 05-15 14:42

    詳解深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)與卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用

    在如今的網(wǎng)絡(luò)時代,錯綜復(fù)雜的大數(shù)據(jù)和網(wǎng)絡(luò)環(huán)境,讓傳統(tǒng)信息處理理論、人工智能與人工神經(jīng)網(wǎng)絡(luò)都面臨巨大的挑戰(zhàn)。近些年,深度學(xué)習(xí)逐漸走進人們的視線
    的頭像 發(fā)表于 01-11 10:51 ?2061次閱讀
    詳解<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>、<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>與卷積<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的應(yīng)用