Keras:我的第一個神經網絡二分類模型

我的第一個Keras神經網絡二分類模型

目標

使用Keras 訓練一個簡單的二分類模型,對下圖中的點分類,其中訓練特徵爲點的座標(x, y),紅色標籤爲0,藍色標籤爲1。

在這裏插入圖片描述

網絡結構

二分類神經網絡模型結構如下,其中:

  1. 輸入層爲點的座標(x, y)。
  2. 輸出層爲點的標籤[0, 1], 激活函數爲sigmoid。
  3. 模型只包含一個隱藏層,隱藏層包含50個神經單元,激活函數爲relu。
    在這裏插入圖片描述

實現

數據

使用sklearn.makemoons()函數生成1000個測試樣本,並按照7:3的比例拆成訓練/測試集。


from sklearn.datasets import make_moons
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from matplotlib import pyplot
from keras.models import load_model
from matplotlib import pyplot
from pandas import DataFrame
from keras.layers import Dropout
import numpy as np

# generate 2d classification dataset
X, y = make_moons(n_samples=1000, noise=0.1, random_state=1)
# scatter plot, dots colored by class value
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()

# split into train and test
n_train = int(X.shape[0] * 0.7)
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]

模型

編輯模型,繪製訓練結果:

  1. model.add(Dense(50, input_dim=2, activation=‘relu’)) 描述了第一個隱藏層的結構。
  2. model.add(Dense(1, activation=‘sigmoid’)) 描述了輸出層的結構。
  3. 模型的損失函數(Loss)爲 ‘binary_crossentropy’。
  4. 模型採用 ‘adam’ 梯度下降搜索算法。
  5. 模型執行1000(epochs=1000)次訓練。

# define model
model = Sequential()
model.add(Dense(50, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=1000, verbose=1)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()

在這裏插入圖片描述

驗證

最後選擇兩個特殊的點(右下角藍色與左上角紅色)驗證一下模型有效性:


testArray = np.array([[2.0, -1.0], [-2.0, 1.0]])
print(model.predict(testArray))

[[1.0000000e+00] (藍色)
 [1.4053326e-24] (紅色)]

小結

  1. trainX是 (700x2)的二維數據,其中每一行是一個訓練數據,總共700個訓練數據。
  2. trainy是700維的向量,總共700個標籤標記紅色(0)或者藍色(1)。
  3. 將訓練/測試數據堆成一個二維數組可以有效利用cpu/gpu的並行計算加快訓練速度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章