本节看一下如何使用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的例子查看结果