卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(Deep Learning)的代表算法之一。MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28*28像素的灰度手写数字图片。
一、安装,并导入TensorFlow
import tensorflow as tf
二、利用TensorFlow API下载,导入MNIST数据集,并预处理
(x_train_all, y_train_all), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train_all, x_test = x_train_all / 255.0, x_test / 255.0 x_train_all = x_train_all.reshape((60000, 28, 28, 1)) x_test = x_test.reshape((10000, 28, 28, 1)) x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:]
三、构建全连接神经网络模型
model = tf.keras.models.Sequential() model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(28, 28, 1))) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(10, activation='softmax'))
四、编译,并训练模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid))
五、评估模型
model.evaluate(x_test, y_test)
附:完整代码(TensorFlow 2.0.0-RC0)
#!/usr/bin/env python import os os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' import tensorflow as tf # 打印TensorFlow版本号 print(tf.__name__, tf.__version__) # 下载MNIST数据集 (x_train_all, y_train_all), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 预处理数据 [0, 255] => [0.0, 1.0] x_train_all, x_test = x_train_all / 255.0, x_test / 255.0 x_train_all = x_train_all.reshape((60000, 28, 28, 1)) x_test = x_test.reshape((10000, 28, 28, 1)) # 分割数据60000条数据,前5000条为验证数据,后55000条为训练数据 x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # 构建卷积神经网络模型 model = tf.keras.models.Sequential() model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(28, 28, 1))) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu')) model.add(tf.keras.layers.MaxPool2D(pool_size=2)) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid)) # 评估模型 model.evaluate(x_test, y_test)
测试数据集的评估结果:2s 229us/sample – loss: 0.0178 – accuracy: 0.9920,总体来说,效果比全连接网络好不少~