传统神经网络训练方法介绍

本节看一下如何使用keras做传统神经网络的训练和预测。

因为很清晰直接上python代码了,必要的地方都有注释。

训练方面:

# 0. load libs
from numpy import loadtxt
from tensorflow import keras

# 1. load dataset and preprocess
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
#一共有768个例子(行),每个例子有8个feature和1个label,即9列。使用7/2/1的比例划分成training, validation, test set
train_numbers = dataset[0 : 537, 0 : 8]                        #可以理解为从二维数组里将第0行到第536行,第0列到第7列这个子二维数组取出来
train_labels = dataset[0 : 537, 8]                            #可以理解为从二维数组里将第0行到第536行的第8列取出来,最终结果是个一维数组
validation_numbers = dataset[537 : 691, 0 : 8]
validation_labels = dataset[537 : 691, 8]
# 2. define model
model = keras.Sequential()                                  #The Sequential model is a linear stack of layers。这是keras里最常用的模型,即语义上等同于神经网络本身
model.add(keras.layers.Dense(12, input_dim=8, activation='relu'))       #我们使用add来增加一层自定义的网络,第一个参数是神经元数量。对于第一层需要使用input_dim指明feature个数
model.add(keras.layers.Dense(8, activation='relu'))             #Dense表示全连接,一般都用这个。activation指明激活函数,传统上使用Sigmoid,但是近期研究表明ReLU效率更高
model.add(keras.layers.Dense(1, activation='sigmoid'))      #最后一层即output layer,对应label。这个例子里是二分,所以用一个节点表示也可以,激活表示1否则为0
# 3. compile model
#loss指定损失函数,对于二分问题binary_crossentropy表现良好。optimizer指定梯度下降算法,adam可以自动调整自己,对大部分问题表现良好
#metrics is used to monitor the training and testing steps,比如选定accuracy后随着训练推进会不断报告正确率的变化
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])       #定义好模型后进行编译,会调用backend的tensorflow完成实质工作
# 4. train model
#给定输入、输出和次数,训练模型以得到理想的权重(weight)
model.fit(train_numbers, train_labels, epochs=150, batch_size=10)   #epoch指将训练集训练多少遍,batch指一次训练把训练集分成多少组传入网络
#更多关于epoch和batch的介绍见https://www.jianshu.com/p/e5076a56946c和https://machinelearningmastery.com/difference-between-a-batch-and-an-epoch/
# 5. evaluate model
loss, accuracy = model.evaluate(validation_numbers, validation_labels)
print('Accuracy: %.2f' % (accuracy*100))
#根据输出结果调整之前的参数并重新跑一边。机器学习目前为止还是一个trial and error的过程
# 6. save model
model.save("model.h5")              #文件格式为HDF5,包括了weights,architecture,compilation details, optimizer state

预测方面:

# 0. load libs
from numpy import loadtxt
from tensorflow import keras
from tensorflow.keras.models import load_model

# 1. load dataset and preprocess
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
#一共有768个例子(行),每个例子有8个feature和1个label,即9列。使用7/2/1的比例划分成training, validation, test set
test_numbers = dataset[691 : , 0 : 8]                    #可以理解为从二维数组里将第691行到最后一行,第0列到第7列这个子二维数组取出来
test_labels = dataset[691 : , 8]                              #可以理解为从二维数组里将第691行到最后一行的第8列取出来,最终结果是个一维数组
# 2. load model
model = load_model("model.h5")                          #模型文件已经训练好,直接读取
model.summary()                                                  #可以查看模型结果和权重以确保读取正确
#3. predict
#predictions = model.predict(test_numbers)                  #使用predict()函数则给出所有label的概率,自己还需要处理一下
predictions = model.predict_classes(test_numbers)       #根据输入直接给出神经网络判断的label
for i in range(predictions.shape[0]):               #获得矩阵行数
    print("%s prediction => %d (correct label => %d)" % (test_numbers[i].tolist(), predictions[i], test_labels[i]))           #输出所有test的例子查看结果