TensorFlow+神经网络学习
一、学习目标
- 熟悉神经网络框架的搭建
- 完成对MNIST数据集的训练
- 最终完成简易的手势识别项目
二、基本图像分类
1、使用 Fashion MNIST 数据集
该数据集包含 10 个类别的 70,000 个灰度图像。这些图像以低分辨率(28x28 像素)展示了单件衣物,如下所示:
2、搭建学习框架
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, models
import numpy as np
# 载入数据
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 类名
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 预处理数据
train_images = train_images / 255.0
test_images = test_images / 255.0
# 模型建立
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10)
])
# 模型编译
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# 模型训练
model.fit(train_images, train_labels, epochs=10)
# 模型评估
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
# 模型预测
probability_model = tf.keras.Sequential([model,
tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
# 显示预测结果
for i in range(len(predictions)):
label = np.argmax(predictions[i])
print(class_names[int(label)])
三、卷积神经网络
1、使用 CIFAR10 数据集
CIFAR10 数据集包含 10 类,共 60000 张彩色图片,每类图片有 6000 张。此数据集中 50000 个样例被作为训练集,剩余 10000 个样例作为测试集。类之间相互度立,不存在重叠的部分,如下所示:
2、搭建学习框架
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, models
# 载入数据
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# 类名
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
# 预处理数据
train_images, test_images = train_images / 255.0, test_images / 255.0
# 模型建立
model = keras.Sequential([
keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.Flatten(),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(10)
])
# 模型编译
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# 模型训练
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
# 模型评估
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
四、利用卷积神经网络训练 Fashion MNIST 数据集
Fashion MNIST 数据集与 CIFAR10 数据集最重要的一个区别在于图像的维数不同, Fashion MNIST 数据集为灰度图像,而 CIFAR10 数据集为RGB彩色图像,若单纯调用卷积神经网络训练数据集会发生如下错误:
ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: [32, 28, 28]
提示卷积神经网络输入数据最小维数min_ndim=4,所以在数据预处理环节还需进行如下操作:
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)
最终代码如下:
import tensorflow as tf
from tensorflow import keras
# Helper libraries
import numpy as np
# 载入数据
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 类名
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 预处理数据
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)
train_images = train_images / 255.0
test_images = test_images / 255.0
# 模型建立
model = keras.Sequential([
keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(128, (3, 3), activation='relu'),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10)
])
# 模型编译
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# 模型训练
model.fit(train_images, train_labels, epochs=10)
# 模型评估
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
# 模型预测
probability_model = tf.keras.Sequential([model,
tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
# 显示预测结果
for i in range(len(predictions)):
label = np.argmax(predictions[i])
print(class_names[int(label)])