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的并行计算加快训练速度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章