群裡的小夥伴們都說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-alpha2、創建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。
實際應用中,還是都試試吧,哈哈!
小編答辯順利通過啦,接下來要回到公司上班啦,希望大家都加油哇!
喜歡,別忘關注~
一起來和小編共同進步吧!
後臺回復「進群」,添加小編微信,可以加入交流群喲~~