教程 | Tensorflow keras 極簡神經網路構建與使用
Tensorflow keras極簡神經網路構建教程
Keras介紹
Keras (κέρας) 在希臘語中意為號角,它來自古希臘和拉丁文學中的一個文學形象。釋出於2015年,是一套高階API框架,其預設的backend是tensorflow,但是可以支援CNTK、Theano、MXNet作為backend執行。其特點是語法簡單,容易上手,提供了大量的實驗資料介面與預訓練網路介面,最初是谷歌的一位工程師開發的,非常適合快速開發。Tensorflow雖然是非常流行的深度學習框架,但是tensorflow開發需要了解計算圖與自動微分相關技術,對於完全沒有任何深度學習基礎的人不是一個很好的選擇,而keras完全是為零基礎的人準備,它簡化了tensorflow中計算圖、會話等基本概念,通過Sequential與功能API兩個元件實現網路搭建,通過簡單的新增一些層就可以快速搭建神經網路模型。
Mnist資料集準備
我們以mnist資料集為例,構建一個神經網路實現手寫數字的訓練與測試,首先我們需要認識一下mnist資料集,mnist資料集有6萬張手寫影象,1萬張測試影象。Keras通過datase來下載與使用mnist資料集,下載與讀取的程式碼如下:
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) =mnist.load_data()
通過下面的程式碼可以顯示手寫數字影象:
print(train_labels[0]) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([ ]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.gray) plt.xlabel(str(train_labels[i])) plt.show()
對資料re-scale到0~1.0之間,對標籤進行了one-hot編碼,程式碼如下:
# re-scale to 0~1.0之間
train_images = train_images / 255.0
test_images = test_images / 255.0
train_labels = one_hot(train_labels)
test_labels = one_hot(test_labels)
其中one-hot編碼函式如下:
def one_hot(labels): onehot_labels = np.zeros(shape=[len(labels), 10]) for i in range(len(labels)): index = labels[i] onehot_labels[i][index] = 1 return onehot_labels
建立模型
構建神經網路
輸入層為28x28=784個輸入節點
隱藏層120個節點
輸出層10個節點
首先需要定義模型:
model = keras.Sequential()
然後按順序新增模型各層
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(units=120, activation=tf.nn.relu))
model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
編譯模型
模型還需要再進行幾項設定才可以開始訓練。這些設定會新增到模型的編譯步驟:
損失函式
衡量模型在訓練期間的準確率。我們希望儘可能縮小該函式,以“引導”模型朝著正確的方向優化。
優化器
根據模型看到的資料及其損失函式更新模型的方式。
指標
用於監控訓練和測試步驟。以下示例使用準確率,即影象被正確分類的比例
model.compile(optimizer=tf.train.AdamOptimizer(),
loss="categorical_crossentropy", metrics=['accuracy'])
訓練模型
訓練神經網路模型需要執行以下步驟:
將訓練資料饋送到模型中,在本示例中為 train_images 和 train_labels 陣列。
模型學習將影象與標籤相關聯。我們要求模型對測試集進行預測,在本示例中為 test_images 陣列。我們會驗證預測結果是否與 test_labels 陣列中的標籤一致。
要開始訓練,請呼叫 model.fit 方法,使模型與訓練資料“擬合”:
model.fit(x=train_images, y=train_labels, epochs=5)
評估模型
模型在測試集資料上執行:
test_loss, test_acc = model.evaluate(x=test_images, y=test_labels)
print("Test Accuracy %.2f"% test_acc)
使用模型進行預測
# 開始預測
cnt = 0
predictions = model.predict(test_images)
for i in range(len(test_images)):
target = np.argmax(predictions[i])
label = np.argmax(test_labels[i])
if target == label:
cnt += 1
print("correct prediction of total : %.2f"%(cnt/len(test_images)))
卷積神經網路
mnist資料轉換為四維
train_images = np.expand_dims(train_images, axis=3)
test_images = np.expand_dims(test_images, axis=3)
建立模型並構建CNN各層
model = keras.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=5, strides=(1, 1),
padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1)))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1),
padding='same', activation=tf.nn.relu))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=128, activation=tf.nn.relu))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
編譯與訓練模型
# 訓練模型
model.compile(optimizer=tf.train.AdamOptimizer(), loss="categorical_crossentropy", metrics=['accuracy'])
model.fit(x=train_images, y=train_labels, epochs=10)
原文釋出時間為:2018-12-9
本文作者: gloomyfish
本文來自雲棲社群合作伙伴“ OpenCV學堂”,瞭解相關資訊可以關注“CVSCHOOL”微信公眾號