因爲國內網絡問題,建議使用離線的mnist.npz數據集。(這是一個很基本上全部深度學習與神經網絡教學案例都會拿來用的手寫數字數據集)bash
下載好以後,進入C:\ProgramData\Anaconda3\Lib\site-packages\keras\datasets下面的mnist.py,使用notepad++編輯,將origin路徑修改成mnist.npz的真實路徑。網絡
一、導入數據ide
path='c:/data/mnist.npz' f = np.load(path) X_train, y_train = f['x_train'], f['y_train'] X_test, y_test = f['x_test'], f['y_test'] f.close()
二、查看圖片
學習
能夠自定義查看前N張圖片,咱們選擇9張。測試
for i in range(9): plt.subplot(3, 3, i+1) plt.imshow(X_train[i], cmap='gray', interpolation='none') plt.title("Class {}".format(y_train[i]))
三、查看圖片數量lua
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1) X_test = X_test.reshape(X_test.shape[0], 28, 28, 1) print('X_train shape:', X_train.shape) print('X_test shape:', X_test.shape)
四、觀察訓練數據集orm
使用seaborn觀察訓練數據集的y值分佈。blog
Y_train = np_utils.to_categorical(y_train, nb_classes) Y_test = np_utils.to_categorical(y_test, nb_classes) print("Y_train:", Y_train.shape)
五、定義神經網絡
圖片
model = Sequential() model.add(Conv2D(32, kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', input_shape=input_shape)) model.add(Conv2D(32, kernel_size=(3,3), activation='relu', kernel_initializer='he_normal')) model.add(MaxPool2D(2,2)) model.add(Dropout(0.2)) model.add(Conv2D(64, kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same')) model.add(Conv2D(64, kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same')) model.add(MaxPool2D(2,2)) model.add(Dropout(0.25)) model.add(Conv2D(128, kernel_size=(3,3), activation='relu', kernel_initializer='he_normal', padding='same')) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(BatchNormalization()) model.add(Dropout(0.25)) model.add(Dense(nb_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(), metrics=['accuracy']) model.summary()
六、訓練模型
input
datagen = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True) datagen.fit(X_train) filepath = 'model.hdf5' from keras.callbacks import ModelCheckpoint # monitor計算每個模型validation_data的準確率 # save_best_only 只保存最好的一個模型 checkpointer = ModelCheckpoint(filepath, monitor='val_acc', save_best_only=True, mode='max') # steps_per_epoch指定循環次數 h = model.fit_generator(datagen.flow(X_train, Y_train, batch_size=500), steps_per_epoch=len(X_train)/1000, epochs=epochs, validation_data=datagen.flow(X_test, Y_test, batch_size=len(X_test)), validation_steps=1, callbacks=[checkpointer])
能夠用pyplot打印一下,隨着epochs,模型在訓練與測試數據集的準確率表現
history = h.history accuracy = history['acc'] val_accuracy = history['val_acc'] loss = history['loss'] val_loss = history['val_loss'] epochs = range(len(accuracy)) plt.plot(epochs, accuracy, 'bo', label='Training Accuracy') plt.plot(epochs, val_accuracy, 'b', label='Validation Accuracy') plt.title('Training and validation accuracy') plt.legend() plt.show()
七、評估模型
from keras.models import load_model model = load_model('model.hdf5') score = model.evaluate(X_test, Y_test) print('Test score:', score[0]) print('Test accuracy:', score[1])
八、抽取數據與真實值對比
predicted_classes = model.predict_classes(X_test) correct_indices = np.nonzero(predicted_classes == y_test)[0] incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
8.1打印正確預測
plt.figure() for i, correct in enumerate(correct_indices[:9]): plt.subplot(3,3,i+1) plt.imshow(X_test[correct].reshape(28, 28), cmap='gray', interpolation='none') plt.title("Predicted {}, Class {}".format(predicted_classes[correct], y_test[correct]))
8.2打印錯誤預測
plt.figure() for i, incorrect in enumerate(incorrect_indices[:9]): plt.subplot(3,3,i+1) plt.imshow(X_test[incorrect].reshape(28, 28), cmap='gray', interpolation='none') plt.title("Predicted {}, Class {}".format(predicted_classes[incorrect], y_test[incorrect]))