Keras 简明教程
Keras - Convolution Neural Network
让我们将模型从 MPL 修改为 Convolution Neural Network (CNN) 以解决我们先前的数字识别问题。
CNN 可以表示如下 −
该模型的核心功能如下:
-
输入层包含 (1, 8, 28) 值。
-
第一层 Conv2D 包含 32 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。
-
第二层 Conv2D 包含 64 个滤波器和“relu”激活函数,其核尺寸为 (3,3)。
-
第三层 MaxPooling 拥有池尺寸 (2, 2)。
-
第五层 Flatten 用于将其所有输入展平为单维。
-
第六层 Dense 包含 128 个神经元和“relu”激活函数。
-
第七层 Dropout 的值为 0.5。
-
第八个且是最后一层包含 10 个神经元和“softmax”激活函数。
-
将 categorical_crossentropy 用作损失函数。
-
Use Adadelta() as Optimizer.
-
Use accuracy as metrics.
-
使用 128 作为批量大小。
-
Use 20 as epochs.
Step 1 − Import the modules
让我们导入必需的模块。
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
import numpy as np
Step 2 − Load data
让我们导入 mnist 数据集。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
Step 3 − Process the data
让我们根据模型修改数据集,以便可以将其馈送至我们的模型。
img_rows, img_cols = 28, 28
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
数据处理与 MPL 模型类似,除了输入数据形状和图像格式配置。
Step 4 − Create the model
让我们创建实际模型。
model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3),
activation = 'relu', input_shape = input_shape))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Dropout(0.25)) model.add(Flatten())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation = 'softmax'))
Step 5 − Compile the model
让我们使用选定的损失函数、优化器和指标来编译模型。
model.compile(loss = keras.losses.categorical_crossentropy,
optimizer = keras.optimizers.Adadelta(), metrics = ['accuracy'])
Step 6 − Train the model
让我们使用 fit() 方法训练模型。
model.fit(
x_train, y_train,
batch_size = 128,
epochs = 12,
verbose = 1,
validation_data = (x_test, y_test)
)
执行该应用程序将输出以下信息 −
Train on 60000 samples, validate on 10000 samples Epoch 1/12
60000/60000 [==============================] - 84s 1ms/step - loss: 0.2687
- acc: 0.9173 - val_loss: 0.0549 - val_acc: 0.9827 Epoch 2/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0899
- acc: 0.9737 - val_loss: 0.0452 - val_acc: 0.9845 Epoch 3/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0666
- acc: 0.9804 - val_loss: 0.0362 - val_acc: 0.9879 Epoch 4/12
60000/60000 [==============================] - 81s 1ms/step - loss: 0.0564
- acc: 0.9830 - val_loss: 0.0336 - val_acc: 0.9890 Epoch 5/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0472
- acc: 0.9861 - val_loss: 0.0312 - val_acc: 0.9901 Epoch 6/12
60000/60000 [==============================] - 83s 1ms/step - loss: 0.0414
- acc: 0.9877 - val_loss: 0.0306 - val_acc: 0.9902 Epoch 7/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0375
-acc: 0.9883 - val_loss: 0.0281 - val_acc: 0.9906 Epoch 8/12
60000/60000 [==============================] - 91s 2ms/step - loss: 0.0339
- acc: 0.9893 - val_loss: 0.0280 - val_acc: 0.9912 Epoch 9/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0325
- acc: 0.9901 - val_loss: 0.0260 - val_acc: 0.9909 Epoch 10/12
60000/60000 [==============================] - 89s 1ms/step - loss: 0.0284
- acc: 0.9910 - val_loss: 0.0250 - val_acc: 0.9919 Epoch 11/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0287
- acc: 0.9907 - val_loss: 0.0264 - val_acc: 0.9916 Epoch 12/12
60000/60000 [==============================] - 86s 1ms/step - loss: 0.0265
- acc: 0.9920 - val_loss: 0.0249 - val_acc: 0.9922
Step 7 − Evaluate the model
让我们使用测试数据评估模型。
score = model.evaluate(x_test, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
执行以上代码将会输出以下信息−
Test loss: 0.024936060590433316
Test accuracy: 0.9922
测试准确率为 99.22%。我们已创建用于识别手写数字的最佳模型。
Step 8 − Predict
最后,从图像预测数字,如下所示 −
pred = model.predict(x_test)
pred = np.argmax(pred, axis = 1)[:5]
label = np.argmax(y_test,axis = 1)[:5]
print(pred)
print(label)
上述应用程序的输出如下 −
[7 2 1 0 4]
[7 2 1 0 4]
两个数组的输出完全相同,表明我们的模型正确预测了前五个图像。