搭建模型

同样是一个双层神经网络,但是最后一层要接一个Logistic二分类函数来完成二分类任务,如图14-7所示。

二分类任务功能测试 - 图1

  1. def model(dataReader):
  2. num_input = 2
  3. num_hidden = 3
  4. num_output = 1
  5. max_epoch = 1000
  6. batch_size = 5
  7. learning_rate = 0.1
  8. params = HyperParameters_4_0(
  9. learning_rate, max_epoch, batch_size,
  10. net_type=NetType.BinaryClassifier,
  11. init_method=InitialMethod.Xavier,
  12. stopper=Stopper(StopCondition.StopLoss, 0.02))
  13. net = NeuralNet_4_0(params, "Arc")
  14. fc1 = FcLayer_1_0(num_input, num_hidden, params)
  15. net.add_layer(fc1, "fc1")
  16. sigmoid1 = ActivationLayer(Sigmoid())
  17. net.add_layer(sigmoid1, "sigmoid1")
  18. fc2 = FcLayer_1_0(num_hidden, num_output, params)
  19. net.add_layer(fc2, "fc2")
  20. logistic = ClassificationLayer(Logistic())
  21. net.add_layer(logistic, "logistic")
  22. net.train(dataReader, checkpoint=10, need_test=True)
  23. return net

超参数说明:

  1. 输入层神经元数为2
  2. 隐层的神经元数为3,使用Sigmoid激活函数
  3. 由于是二分类任务,所以输出层只有一个神经元,用Logistic做二分类函数
  4. 最多训练1000轮
  5. 批大小=5
  6. 学习率=0.1
  7. 绝对误差停止条件=0.02

运行结果

二分类任务功能测试 - 图2

图14-8是训练记录,再看下面的打印输出结果:

  1. ......
  2. epoch=419, total_iteration=30239
  3. loss_train=0.010094, accuracy_train=1.000000
  4. loss_valid=0.019141, accuracy_valid=1.000000
  5. time used: 2.149379253387451
  6. testing...
  7. 1.0

最后的testing…的结果是1.0,表示100%正确,这初步说明mini框架在这个基本case上工作得很好。图14-9所示的分类效果也不错。

二分类任务功能测试 - 图3

代码位置

原代码位置:ch14, Level3

个人代码:dnn_classification**

keras实现

  1. from MiniFramework.DataReader_2_0 import *
  2. from keras.models import Sequential
  3. from keras.layers import Dense
  4. import matplotlib.pyplot as plt
  5. import os
  6. os.environ['KMP_DUPLICATE_LIB_OK']='True'
  7. def load_data():
  8. train_data_name = "../data/ch10.train.npz"
  9. test_data_name = "../data/ch10.test.npz"
  10. dataReader = DataReader_2_0(train_data_name, test_data_name)
  11. dataReader.ReadData()
  12. dataReader.NormalizeX()
  13. dataReader.Shuffle()
  14. dataReader.GenerateValidationSet()
  15. x_train, y_train = dataReader.XTrain, dataReader.YTrain
  16. x_test, y_test = dataReader.XTest, dataReader.YTest
  17. x_val, y_val = dataReader.XDev, dataReader.YDev
  18. return x_train, y_train, x_test, y_test, x_val, y_val
  19. def build_model():
  20. model = Sequential()
  21. model.add(Dense(3, activation='sigmoid', input_shape=(2, )))
  22. model.add(Dense(1, activation='sigmoid'))
  23. model.compile(optimizer='Adam',
  24. loss='binary_crossentropy',
  25. metrics=['accuracy'])
  26. return model
  27. #画出训练过程中训练和验证的精度与损失
  28. def draw_train_history(history):
  29. plt.figure(1)
  30. # summarize history for accuracy
  31. plt.subplot(211)
  32. plt.plot(history.history['accuracy'])
  33. plt.plot(history.history['val_accuracy'])
  34. plt.title('model accuracy')
  35. plt.ylabel('accuracy')
  36. plt.xlabel('epoch')
  37. plt.legend(['train', 'validation'], loc='upper left')
  38. # summarize history for loss
  39. plt.subplot(212)
  40. plt.plot(history.history['loss'])
  41. plt.plot(history.history['val_loss'])
  42. plt.title('model loss')
  43. plt.ylabel('loss')
  44. plt.xlabel('epoch')
  45. plt.legend(['train', 'validation'], loc='upper left')
  46. plt.show()
  47. if __name__ == '__main__':
  48. x_train, y_train, x_test, y_test, x_val, y_val = load_data()
  49. model = build_model()
  50. history = model.fit(x_train, y_train, epochs=200, batch_size=5, validation_data=(x_val, y_val))
  51. draw_train_history(history)
  52. loss, accuracy = model.evaluate(x_test, y_test)
  53. print("test loss: {}, test accuracy: {}".format(loss, accuracy))
  54. weights = model.get_weights()
  55. print("weights: ", weights)

模型输出

  1. test loss: 0.3908280086517334, test accuracy: 0.8100000023841858
  2. weights: [array([[-0.40774214, -0.3335594 , 0.46907774],
  3. [-2.6843045 , 3.6533718 , -4.166602 ]], dtype=float32), array([ 1.0028745, -1.3372192, 1.7076769], dtype=float32), array([[-2.6436245],
  4. [ 3.5234995],
  5. [-4.228298 ]], dtype=float32), array([0.3786795], dtype=float32)]

模型损失以及准确率曲线

二分类任务功能测试 - 图4