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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度學習筆記8:利用Tensorflow搭建神經網絡

人工智能實訓營 ? 2018-08-24 18:31 ? 次閱讀

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

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

先來簡單看一下數據集:

#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

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

創(chuàng)建 placeholder

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

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
初始化模型參數

其次就是初始化神經網絡的模型參數,三層網絡包括六個參數,這里我們采用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
計算損失函數

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

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í)行反向傳播和權值更新

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

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

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

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

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

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

    • 創(chuàng)建會話

    • 初始化會話

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

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

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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4718

    瀏覽量

    100067
  • 人工智能
    +關注

    關注

    1787

    文章

    46124

    瀏覽量

    235420
  • 機器學習
    +關注

    關注

    66

    文章

    8308

    瀏覽量

    131904
  • 深度學習
    +關注

    關注

    73

    文章

    5424

    瀏覽量

    120630
收藏 人收藏

    評論

    相關推薦

    利用TensorFlow實現(xiàn)基于深度神經網絡的文本分類模型

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

    使用TensorFlow進行神經網絡模型更新

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

    簡單認識深度神經網絡

    深度神經網絡(Deep Neural Networks, DNNs)作為機器學習領域中的一種重要技術,特別是在深度學習領域,已經取得了顯著的
    的頭像 發(fā)表于 07-10 18:23 ?752次閱讀

    深度神經網絡概述及其應用

    深度神經網絡(Deep Neural Networks, DNNs)作為機器學習的一種復雜形式,是廣義人工神經網絡(Artificial Neural Networks, ANNs)的
    的頭像 發(fā)表于 07-04 16:08 ?367次閱讀

    深度神經網絡與基本神經網絡的區(qū)別

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

    深度神經網絡的設計方法

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

    卷積神經網絡與循環(huán)神經網絡的區(qū)別

    深度學習領域,卷積神經網絡(Convolutional Neural Networks, CNN)和循環(huán)神經網絡(Recurrent Neural Networks, RNN)是兩種
    的頭像 發(fā)表于 07-03 16:12 ?1068次閱讀

    bp神經網絡深度神經網絡

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

    卷積神經網絡訓練的是什么

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

    深度學習與卷積神經網絡的應用

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

    卷積神經網絡和bp神經網絡的區(qū)別

    化能力。隨著深度學習技術的不斷發(fā)展,神經網絡已經成為人工智能領域的重要技術之一。卷積神經網絡和BP神經
    的頭像 發(fā)表于 07-02 14:24 ?1181次閱讀

    深度神經網絡模型有哪些

    、Sigmoid或Tanh。 卷積神經網絡(Convolutional Neural Networks,CNN): 卷積神經網絡深度學習中最重
    的頭像 發(fā)表于 07-02 10:00 ?620次閱讀

    利用深度循環(huán)神經網絡對心電圖降噪

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

    詳解深度學習、神經網絡與卷積神經網絡的應用

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

    淺析深度神經網絡壓縮與加速技術

    深度神經網絡深度學習的一種框架,它是一種具備至少一個隱層的神經網絡。與淺層神經網絡類似
    的頭像 發(fā)表于 10-11 09:14 ?607次閱讀
    淺析<b class='flag-5'>深度</b><b class='flag-5'>神經網絡</b>壓縮與加速技術