1. 程式人生 > >教程 | Tensorflow keras 極簡神經網路構建與使用

教程 | 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()

image
對資料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)

image

原文釋出時間為:2018-12-9
本文作者: gloomyfish
本文來自雲棲社群合作伙伴“ OpenCV學堂”,瞭解相關資訊可以關注“CVSCHOOL”微信公眾號