题目要求:
在“竞赛资料\第三部分\任务一”提供的 TensorFlow 模型构建代码 中找到并修改设定以下参数:
1.读取 keras.datasets内置数据集 Fashion_mnist,使用 matplotlib 以子图的形式查看 10 张 Fashion_mnist 图片,将查看的图片截图保 存到答题卡指定位置。
2.使用 Tensorflow 构建神经网络,要求至少包含 4 个卷积层(Conv), 并使用 model.summary()将模型结构打印输出,将输出的模型结构截 图保存到答题卡指定位置。
3.定义损失函数和优化器,以及对数据进行数据增强操作,开始模型 训练,将训练过程截图保存到答题卡指定位置。
4.完成训练后使用 matplotlib 绘制 accuracy 变化图和 loss 变化图 并输出最高的 accuracy 值,要求不低于(0.8),将 accuracy 图以 及输出的 accuracy 值截图保存到答题卡指定位置。
不同于MNIST手写数据集,Fashion-MNIST数据集包含了10个类别的图像,分别是:t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套),sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)。
1.读取 Fashion_mnist 数据集并可视化
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
# 加载数据集
(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
# 将图像标准化
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# 可视化前十张图片
plt.figure(figsize=(10, 10))
for i in range(10):
plt.subplot(5, 5, i + 1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.show()
2.使用 Tensorflow 构建神经网络,并打印模型结构
# 构建神经网络模型
model = keras.Sequential([
keras.layers.Reshape(target_shape=(28, 28, 1), input_shape=(28, 28)),
keras.layers.Conv2D(filters=32, kernel_size=(3, 3), padding="same",activation="relu"),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Conv2D(filters=64, kernel_size=(3, 3), padding="same",activation="relu"),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Conv2D(filters=128, kernel_size=(3, 3), padding="same",activation="relu"),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Conv2D(filters=256, kernel_size=(3, 3),padding="same", activation="relu"),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Flatten(),
keras.layers.Dense(512, activation="relu"),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation="softmax")
])
# 打印模型结构
model.summary()
这段代码构建了一个卷积神经网络(Convolutional Neural Network, CNN)模型,用于对图像进行分类。
具体来说,该模型包括四个卷积层和两个全连接层,其中卷积层用于提取图像的特征,全连接层则用于将提取出的特征映射到具体的类别。
在输入数据之前,首先将其 Reshape 成为形状为 (28, 28, 1) 的 Tensor,其中最后一维表示通道数。然后,通过四个卷积层和池化层的组合,逐渐减小特征图的大小,并增加特征的抽象程度。最后,通过一个全连接层将特征映射到一个长度为 10 的向量,即每个类别对应一个得分。由于是多分类问题,因此使用 softmax 激活函数作为输出层的激活函数。
在上述模型的基础上,还添加了一个 Dropout 层,用于防止过拟合。Dropout 层会随机将一部分神经元的输出置为 0,从而引入随机性,有助于避免模型过度依赖某些特定的输入。
为了进一步防止过拟合,还可以使用 L2 正则化等技术。 最后,要编译该模型,并指定损失函数、优化器和评估指标。在本例中,将使用 categorical_crossentropy 作为损失函数,Adam 作为优化器,accuracy 作为评估指标,即分类准确率。 总的来说,这段代码构建了一个比较常见的卷积神经网络模型,可以用于对图像进行分类任务。在实际应用时,需要根据具体问题调整模型结构和超参数,以获得更好的性能。
3.定义损失函数和优化器,以及对数据进行数据增强操作,开始模型训练
# 定义损失函数和优化器
loss_fn = keras.losses.SparseCategoricalCrossentropy()
optimizer = keras.optimizers.Adam(lr=0.001)
# 数据增强操作
data_augmentation = keras.Sequential([
keras.layers.experimental.preprocessing.RandomFlip("horizontal"),
keras.layers.experimental.preprocessing.RandomRotation(0.1),
keras.layers.experimental.preprocessing.RandomZoom(0.1)
])
# 编译模型
model.compile(optimizer=optimizer, loss=loss_fn, metrics=["accuracy"])
# 模型训练
history = model.fit(
data_augmentation(x_train),
y_train,
batch_size=64,
epochs=20,
validation_split=0.2
)
4、绘制 accuracy 和 loss 变化图
# 绘制 accuracy 和 loss 变化图
acc = history.history["accuracy"]
val_acc = history.history["val_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs_range = range(20)
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label="Training Accuracy")
plt.plot(epochs_range, val_acc, label="Validation Accuracy")
plt.legend(loc="lower right")
plt.title("Training and Validation Accuracy")
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label="Training Loss")
plt.plot(epochs_range, val_loss, label="Validation Loss")
plt.legend(loc="upper right")
plt.title("Training and Validation Loss")
plt.show()
# 计算模型在测试集上的表现
test_loss, test_acc = model.evaluate(x_test, y_test)
print("Test accuracy:", test_acc)