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

def model(dataReader):num_input = 2num_hidden = 3num_output = 1max_epoch = 1000batch_size = 5learning_rate = 0.1params = HyperParameters_4_0(learning_rate, max_epoch, batch_size,net_type=NetType.BinaryClassifier,init_method=InitialMethod.Xavier,stopper=Stopper(StopCondition.StopLoss, 0.02))net = NeuralNet_4_0(params, "Arc")fc1 = FcLayer_1_0(num_input, num_hidden, params)net.add_layer(fc1, "fc1")sigmoid1 = ActivationLayer(Sigmoid())net.add_layer(sigmoid1, "sigmoid1")fc2 = FcLayer_1_0(num_hidden, num_output, params)net.add_layer(fc2, "fc2")logistic = ClassificationLayer(Logistic())net.add_layer(logistic, "logistic")net.train(dataReader, checkpoint=10, need_test=True)return net
超参数说明:
- 输入层神经元数为2
- 隐层的神经元数为3,使用Sigmoid激活函数
- 由于是二分类任务,所以输出层只有一个神经元,用Logistic做二分类函数
- 最多训练1000轮
- 批大小=5
- 学习率=0.1
- 绝对误差停止条件=0.02
运行结果

图14-8是训练记录,再看下面的打印输出结果:
......epoch=419, total_iteration=30239loss_train=0.010094, accuracy_train=1.000000loss_valid=0.019141, accuracy_valid=1.000000time used: 2.149379253387451testing...1.0
最后的testing…的结果是1.0,表示100%正确,这初步说明mini框架在这个基本case上工作得很好。图14-9所示的分类效果也不错。

代码位置
原代码位置:ch14, Level3
个人代码:dnn_classification**
keras实现
from MiniFramework.DataReader_2_0 import *from keras.models import Sequentialfrom keras.layers import Denseimport matplotlib.pyplot as pltimport osos.environ['KMP_DUPLICATE_LIB_OK']='True'def load_data():train_data_name = "../data/ch10.train.npz"test_data_name = "../data/ch10.test.npz"dataReader = DataReader_2_0(train_data_name, test_data_name)dataReader.ReadData()dataReader.NormalizeX()dataReader.Shuffle()dataReader.GenerateValidationSet()x_train, y_train = dataReader.XTrain, dataReader.YTrainx_test, y_test = dataReader.XTest, dataReader.YTestx_val, y_val = dataReader.XDev, dataReader.YDevreturn x_train, y_train, x_test, y_test, x_val, y_valdef build_model():model = Sequential()model.add(Dense(3, activation='sigmoid', input_shape=(2, )))model.add(Dense(1, activation='sigmoid'))model.compile(optimizer='Adam',loss='binary_crossentropy',metrics=['accuracy'])return model#画出训练过程中训练和验证的精度与损失def draw_train_history(history):plt.figure(1)# summarize history for accuracyplt.subplot(211)plt.plot(history.history['accuracy'])plt.plot(history.history['val_accuracy'])plt.title('model accuracy')plt.ylabel('accuracy')plt.xlabel('epoch')plt.legend(['train', 'validation'], loc='upper left')# summarize history for lossplt.subplot(212)plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train', 'validation'], loc='upper left')plt.show()if __name__ == '__main__':x_train, y_train, x_test, y_test, x_val, y_val = load_data()model = build_model()history = model.fit(x_train, y_train, epochs=200, batch_size=5, validation_data=(x_val, y_val))draw_train_history(history)loss, accuracy = model.evaluate(x_test, y_test)print("test loss: {}, test accuracy: {}".format(loss, accuracy))weights = model.get_weights()print("weights: ", weights)
模型输出
test loss: 0.3908280086517334, test accuracy: 0.8100000023841858weights: [array([[-0.40774214, -0.3335594 , 0.46907774],[-2.6843045 , 3.6533718 , -4.166602 ]], dtype=float32), array([ 1.0028745, -1.3372192, 1.7076769], dtype=float32), array([[-2.6436245],[ 3.5234995],[-4.228298 ]], dtype=float32), array([0.3786795], dtype=float32)]
模型损失以及准确率曲线

