TF2.0初體驗-使用TF2.0 + Keras構建簡單的神經網絡

2021-12-27 小小挖掘機

群裡的小夥伴們都說TF2.0挺不錯的,方便了很多,今天咱也先簡單學習一波。

先推薦一個教程:https://zhuanlan.zhihu.com/c_1091021863043624960

TensorFlow 2.0 使用 Keras 作為開發者的核心體驗。今天體驗了一把,確實挺不錯的,那麼今天就手把手來教學如何通過TF2.0 + Keras構建一個簡單神經網絡。

1、安裝TF2.0虛擬環境

首先,我們要在電腦裡裝一個tf2.0的虛擬環境(我的電腦是mac,windows和linux類似)。這裡使用anaconda的命令:

注意,後面的python版本最好帶上,否則什麼庫都不給你裝。這樣,在anaconda的envs路徑下,就多了一個tf2的虛擬環境,我們可以使用activate命令激活它:

也可以使用deactivate來退出環境:

接下來,安裝tensorflow的環境,我們首先使用清華源:

sudo pip config set global.index-url https:

然後,安裝tf2.0:

sudo pip install tensorflow==2.0.0-alpha

2、創建Jupyter環境

安裝了tf2.0的環境還不夠,我們還需要把它作為一個kernel加入到jupyter環境中,執行下面兩步:

conda install notebook ipykernelsudo python -m ipykernel install 

接下來,使用jupyter notebook命令啟動ipython。環境切換到tf2:

接下來,我們導入tf和keras,看看版本對不對:

import tensorflow as tffrom tensorflow.keras import layers
print(tf.__version__)print(tf.keras.__version__)

輸出為:

哈哈,我們的環境算是安裝成功了!接下來,我們這裡介紹兩種建立神經網絡的方式,分別是使用tf.keras.Sequential和使用 Keras 函數式 API創建神經網絡。

3、使用tf.keras.Sequential創建神經網絡導入數據

這裡,我們下載mnist數據集:

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()x_train = x_train.reshape([x_train.shape[0], -1])x_test = x_test.reshape([x_test.shape[0], -1])print(x_train.shape, ' ', y_train.shape)print(x_test.shape, ' ', y_test.shape)print(x_train.dtype)

結果為

(60000, 784)   (60000,)(10000, 784)   (10000,)uint8

創建神經網絡結構

隨後,我們使用tf.keras.Sequential創建神經網絡,有兩種使用方式:

方式1

model = tf.keras.Sequential()model.add(layers.Dense(64,activation='relu',input_shape=(784,)))model.add(layers.Dense(32,activation='relu',kernel_initializer=tf.keras.initializers.glorot_normal))model.add(layers.Dense(32,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.01)))model.add(layers.Dense(10,activation='softmax'))

方式2

model = tf.keras.Sequential([    layers.Dense(64, activation='relu', kernel_initializer='he_normal', input_shape=(784,)),    layers.Dense(64, activation='relu', kernel_initializer='he_normal'),    layers.Dense(64, activation='relu', kernel_initializer='he_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)),    layers.Dense(10, activation='softmax')])

compile函數

complie函數,主要是來編譯我們的模型,代碼如下:

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),              loss='sparse_categorical_crossentropy',              metrics=['accuracy'])

可以看到,我們這裡主要提供了三個函數,第一個是使用的優化器optimizer;第二個是模型的損失函數,這裡使用的是sparse_categorical_crossentropy,當然也可以寫成loss=tf.keras.losses.SparseCategoricalCrossentropy(),但是!但是!後一種寫法,在使用save方法保存和加載模型的時候,是會報錯的,所以推薦使用字符串的寫法;第三個參數是模型評估的方式,這裡我們使用正確率來評估模型,當然也可以添加更多。

可以通過model.summary()來查看構建的模型:

使用fit函數訓練模型

接下來,使用fit函數訓練模型

history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)

這裡,我們加入了驗證集,batch_size設置為256,並用history來保存了結果。

繪製accuracy曲線

來看看history裡面都有什麼把,運行history.__dict__。有一個關鍵的key是history,保留了每一步的loss、accuracy、val_loss、val_accuracy。我們直接可以使用history.history['accuracy']來訪問每一步訓練集的準確率,因此我們可以簡單的將其繪製成圖:

import matplotlib.pyplot as pltplt.plot(history.history['accuracy'])plt.plot(history.history['val_accuracy'])plt.legend(['training', 'validation'], loc='upper left')plt.show()

要注意的是,之所以會有accuracy,是因為在compile函數中加入了metrics=['accuracy'],之所以會有val_loss和val_accuracy,是因為我們在fit函數中加入了validation_split=0.3。

使用evaluate進行模型的評測

最後,使用evaluate進行模型的評測:

results = model.evaluate(x_test,y_test)

結果如下:

4、使用Keras 函數式 API創建神經網絡

使用tf.keras.Sequential是層的簡單堆疊,無法表示任意模型,如具有非序列數據流的模型(例如,殘差連接)。而使用Keras 函數式 API則可以。在使用Keras 函數式 API時,層實例可調用並返回張量。 而輸入張量和輸出張量用於定義 tf.keras.Model 實例。

構建模型
input_x = tf.keras.Input(shape=(784,))hidden1 = layers.Dense(64, activation='relu', kernel_initializer='he_normal')(input_x)hidden2 = layers.Dense(64, activation='relu', kernel_initializer='he_normal')(hidden1)hidden3 = layers.Dense(64, activation='relu', kernel_initializer='he_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01))(hidden2)output = layers.Dense(10, activation='softmax')(hidden3)
model2 = tf.keras.Model(inputs = input_x,outputs = output)

模型訓練

後面的過程就跟前面一樣了,不再贅述,直接上代碼:

model2.compile(optimizer=tf.keras.optimizers.Adam(0.001),                             loss='sparse_categorical_crossentropy',              metrics=['accuracy'])history = model2.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)import matplotlib.pyplot as pltplt.plot(history.history['accuracy'])plt.plot(history.history['val_accuracy'])plt.legend(['training', 'validation'], loc='upper left')plt.show()

5、模型的保存和加載

使用save和tf.keras.models.load_model保存和加載模型:

model.save('model.h5')model1 = tf.keras.models.load_model('model.h5')results = model1.evaluate(x_test,y_test)

6、添加BN和Dropout

接下來,我們構建一個更複雜的網絡,在裡面加入BN和Dropout:

model4 = tf.keras.Sequential([    layers.Dense(64, activation='relu', input_shape=(784,)),    layers.BatchNormalization(),    layers.Dropout(0.2),    layers.Dense(64, activation='relu'),    layers.BatchNormalization(),    layers.Dropout(0.2),    layers.Dense(64, activation='relu'),    layers.BatchNormalization(),    layers.Dropout(0.2),    layers.Dense(10, activation='softmax')])model4.compile(optimizer=tf.keras.optimizers.Adam(0.001),             loss='sparse_categorical_crossentropy',             metrics=['accuracy'])
model4.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history = model4.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)import matplotlib.pyplot as pltplt.plot(history.history['accuracy'])plt.plot(history.history['val_accuracy'])plt.legend(['training', 'validation'], loc='upper left')plt.show()

這個添加BN和Dropout的方式真的是太簡單了。。寫到這裡,我有點拿不準了,先BN還是先Dropout呢?再進一步,Relu、BN和Dropout的順序是怎樣的呢?

7、思考-先BN還是先Relu?

在想這個問題之前,我一直認為的順序是Relu->BN->Dropout,Dropout的順序是最後一個應該是沒有疑問的,關鍵是Relu和BN的順序。更擴展點,是BN和非線性激活函數的關係。

關於這個問題,論文中給出的是先BN,後面接非線性激活函數。但實際中,也有人主張先非線性激活函數,再是BN。關於這個,大家可以看一下知乎的帖子:https://www.zhihu.com/question/283715823。

實際應用中,還是都試試吧,哈哈!

小編答辯順利通過啦,接下來要回到公司上班啦,希望大家都加油哇!

喜歡,別忘關注~

一起來和小編共同進步吧!

後臺回復「進群」,添加小編微信,可以加入交流群喲~~

相關焦點

  • TF2.0實現簡單神經網絡
    首先,回憶一下神經網絡由輸入層,隱藏層和輸出層三部分組成,大概長這樣注意,上面的輸入層矩陣寫的1*2,其實是輸入了一個樣本,這個樣本的維度是
  • 安裝TensorFlow 2.0 preview進行深度學習(附Jupyter Notebook)
    本文介紹安裝TensorFlow 2.0 preview的方法,並介紹一個Github項目tf2_course,它包含了一些TensorFlow 2的練習和解決方案,以Jupyter Notebook的形式展現。TensorFlow是最流行的深度學習框架之一,大家期待已久的TensorFlow 2.0現在出了Preview版本,並且可以直接通過pip安裝。
  • tf2+cnn+中文文本分類優化系列(2)
    1 前言接著上次的tf2+cnn+中文文本分類優化系列(1),本次進行優化:使用多個卷積核進行特徵抽取。
  • TF2.0-鳶尾花數據集三分類【tf2.0底層API函數手動搭建單層簡單神經網絡】
    【基礎函數腦圖和代碼見原文連結:kl8w】     本次實踐將運用這些基礎函數,構建一個只有一層的神經網絡採用softmax激活函數,手動實現梯度下降更新這一層網絡的參數
  • 擴展之Tensorflow2.0 | 19 TF2模型的存儲與載入
    擴展之Tensorflow2.0 | 18 TF2構建自定義模型擴展之Tensorflow2.0
  • 使用TF2與Keras實現經典GNN的開源庫——Spektral
    該項目的主要目的是提供一個簡單但又不失靈活性的圖神經網絡(graph neural networks,GNNs) 框架。我們可以使用 Spektral 來進行網絡節點分類、預測分子特性、使用 GAN 生成新的拓撲圖、節點聚類、預測連結以及其他任意數據是使用拓撲圖來描述的任務。
  • 【小白學PyTorch】18.TF2構建自定義模型
    | 17 TFrec文件的創建與讀取擴展之Tensorflow2.0 | 16 TF2讀取圖片的方法擴展之Tensorflow2.0 | 15 TF2實現一個簡單的服裝分類任務之前講過了如何用tensorflow構建數據集,然後這一節課講解如何用Tensorflow2.0來創建模型。
  • 如何使用Keras構建殘差神經網絡?
    什麼是殘差神經網絡?原則上,神經網絡的層數越多,應獲得越好的結果。一個更深層的網絡可以學到任何淺層的東西,甚至可能更多。如果對於給定的數據集,網絡無法通過添加更多的層來學習更多東西,那麼它就可以學習這些其他層的恆等映射(identity mappings)。這樣,它可以保留先前層中的信息,並且不會比較淺的層更糟糕。
  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    構建一個簡單的模型順序模型在Keras中,您可以組裝網絡層來構建模型。模型通常是一個網絡層構成的圖。構建一個簡單的全連接的網絡(即多層感知器):model = keras.models.Sequential()# 添加一個含有64個神經網絡單元的全連接層到模型中,並且指定輸入數據的維度model.add(keras.layers.Dense(64, activation
  • 小白學PyTorch | 15 TF2實現一個簡單的服裝分類任務
    我見過有的大佬是TF和PyTorch一起用在一個項目中,數據讀取用PyTorch然後模型用TF構建。總之,大家有時間有精力的話,順便學學TF也不虧,更何況TF2.0現在已經優化了很多。本系列預計用3節課來簡單的入門一下Tensorflow2.
  • 用TF2構建模型
    神經網絡的基本構造塊是層。層從饋送到其中的數據中提取表示結果。希望這些表示結果有助於解決手頭問題。大部分深度學習都會把簡單的層連在一起。大部分層(例如 tf.keras.layers.Dense)都具有在訓練期間要學習的參數。
  • 全新版本,李沐《動手學深度學習》TF2.0版本來了
    近日,該書的 TF2.0 代碼復現項目來了。UC 伯克利李沐的《動手學深度學習》開源書一經推出便廣受好評。很多開發者使用了書的內容,並採用各種各樣的深度學習框架將其復現。據機器之心所知,現在已有 MXnet(原版)和 PyTorch 版本。近日,《動手學深度學習》書又有了一個新的復現代碼版本——TensorFlow2.0 版。
  • 李沐《動手學深度學習》+ TF2.0 開源項目來了,不容錯過!
    近日,該書的 TF2.0 代碼復現項目來了。UC 伯克利李沐的《動手學深度學習》開源書一經推出便廣受好評。很多開發者使用了書的內容,並採用各種各樣的深度學習框架將其復現。據機器之心所知,現在已有 MXnet(原版)和 PyTorch 版本。近日,《動手學深度學習》書又有了一個新的復現代碼版本——TensorFlow2.0 版。這一項目登上了 12 月 9 日的 GitHub 熱榜,一天獲得了百星。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。
  • TensorFlow 2.0 中文手寫字識別(漢字OCR)
    你現在是不是想用很深的網絡躍躍欲試?更深的網絡在這個任務上可能根本不可行!!看完本教程我們就可以一探究竟!總之一句話,模型太簡單和太複雜都不好,甚至會發散!(想親身體驗模型訓練發散抓狂的可以來嘗試一下!)。但是,挑戰這個任務也有很多好處:本項目實現了基於CNN的中文手寫字識別,並且採用標準的tensorflow 2.0 api 來構建!
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡(GCNN)
    :Keras中的圖卷積神經網絡(GCNN)。如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)在生活中的某個時刻我們會發現,在Tensorflow Keras中預先定義的層已經不夠了!我們想要更多的層!我們想要建立一個具有創造性結構的自定義神經網絡!幸運的是,通過定義自定義層和模型,我們可以在Keras中輕鬆地執行此任務。在這個循序漸進的教程中,我們將構建一個包含並行層的神經網絡,其中包括一個圖卷積層。
  • 基礎級tf2.0+cnn 中文文本分類實踐練習
    相對於詞級別,字級別的優勢就是處理簡單些,不用去考慮分詞錯誤帶來的誤差;缺陷就是,字所帶的語義含義沒詞豐富,此外同樣長度限制下,詞級別處理的文本長度要遠遠大於字級別。但操作方法的角度來看,二者本質是一致的。接下來詳細介紹如何實現字級別的文本分類。
  • TF2.0-五種優化器,激活函數(sigmoid,tanh,relu,leaky relu的優缺點),損失函數,正則化等
    SGD【最常用】,SGDM,Adagrad,RMSProp,Adam   【文中圖因尺寸較大,放大可能不清晰,點擊原文連結獲取腦圖和代碼(含注釋),本文的代碼較多,文章內不附代碼,針對iris數據集,手動實現五種優化器,手動構建神經網絡加入激活函數
  • 《基於Scikit-Learn、Keras和TensorFlow的機器學習實戰》:人工神經網絡介紹
    本章的第一部分將介紹人工神經網絡,首先快速瀏覽最初的人工神經網絡架構,然後介紹如今被大量使用的多層感知機(mlp)(其他架構將在下一章中探討)。在第二部分中,我們將看看如何使用流行的Keras API實現神經網絡。這是一個設計精美、簡單的高級API,用於構建、訓練、評估和運行神經網絡。但不要被它的簡單性所迷惑:它的表達性和靈活性足以讓您構建各種各樣的神經網絡架構。
  • TF2.0深度學習實戰(一):分類問題之手寫數字識別
    手寫數字識別是基於MNIST數據集的一個圖像分類任務,目的是通過搭建深度神經網絡,實現對手寫數字的識別(分類)。y = tf.convert_to_tensor(y, dtype=tf.int32)  (3)構建數據集對象,設置batch和epos。