针对 traffic-signs-data 数据集进行多分类预测,同样可以使用卷积神经网络 (Convolutional Neural Network, CNN)。以下是基于 Keras 和 TensorFlow 框架实现的 Python 代码:
```python
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 数据集路径
data_dir = '/path/to/traffic-signs-data'
train_dir = os.path.join(data_dir, 'train')
val_dir = os.path.join(data_dir, 'val')
test_dir = os.path.join(data_dir, 'test')
# 数据预处理
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
val_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
# 训练集、验证集、测试集
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(32, 32),
batch_size=32,
color_mode='grayscale',
class_mode='categorical')
val_generator = val_datagen.flow_from_directory(
val_dir,
target_size=(32, 32),
batch_size=32,
color_mode='grayscale',
class_mode='categorical')
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(32, 32),
batch_size=32,
color_mode='grayscale',
class_mode='categorical')
# 搭建模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,1)),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(43, activation='softmax')
])
# 编译模型
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=50,
validation_data=val_generator,
validation_steps=50)
# 评估模型
test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test acc:', test_acc)
```
在上述代码中,我们同样使用了 ImageDataGenerator 对数据进行了数据增强,并利用 flow_from_directory() 方法从文件夹中读取数据,分别构建了训练集、验证集、测试集。基于 Sequential 模型搭建了卷积神经网络模型,并使用 compile() 方法对模型进行编译。最后使用 fit_generator() 方法训练模型,evaluate_generator() 方法评估模型。需要注意的是,traffic-signs-data 数据集中的图片是灰度图,因此需要将 color_mode 设置为 'grayscale'。另外,输出层的神经元个数为 43,对应数据集中的 43 种交通标识。