tensorflow - 为什么 VGG-16 在 CIFAR-10 数据集上表现不佳?
问题描述
我正在尝试使用 Tensorflow 为 CIFAR-10 数据集实现 VGG-16 卷积神经网络。但我的训练准确率接近 10%。我的代码有什么问题?
import tensorflow as tf
from tensorflow.keras import datasets
(X_train, y_train), (X_test, y_test) = datasets.cifar10.load_data()
X_train.shape, y_train.shape, X_test.shape, y_test.shape
X_train = X_train/255
X_test = X_test/255
y_train = y_train.reshape(-1,)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu", input_shape=
(32,32,3),padding="same"),
tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),
tf.keras.layers.Conv2D(filters=128, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=128, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),
tf.keras.layers.Conv2D(filters=256, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=256, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=256, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.Conv2D(filters=512, kernel_size=(3,3), activation="relu",
padding="same"),
tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4096, activation="relu"),
tf.keras.layers.Dense(4096, activation="relu"),
tf.keras.layers.Dense(10, activation="softmax")
])
model.summary()
model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy,
optimizer=tf.keras.optimizers.Adam(),
metrics=["accuracy"])
X_train[0].shape, y_train[0].shape
model.fit(X_train, y_train, epochs = 100)
解决方案
看来您还没有找到合适的培训计划。
如果您不介意稍微更改模型,我建议在每个卷积层之后使用 Batchnorm。通常,使用 Batchnorm 更容易训练模型。
此外,您是否在一定数量的迭代后降低了学习率?在某些时候,太大的学习率可能不会再减少你的训练错误。例如,ResNet以 0.1 的初始学习率训练 100 个 epoch,然后以 0.01 训练另外 50 个 epoch,0.001 训练另外 50 个 epoch。
推荐阅读
- c++ - Qt QTreeview currentChange 没有发出
- excel - 尝试使用另存为从 excel 到 word 获取对象错误不支持此属性或方法
- batch-file - 如果文件运行后要重复运行,您将如何从批处理文件中删除一行?
- java - 使用通过 RestController 公开的 querydsl 和 spring-data 时传递 groupBy 参数
- powerbi - DAX 获取上一个时间段,无论是否按周、月、年、会计月、日等切片
- ios - 反应本机文本输入自动填充电子邮件问题
- html - 如何在标签中使用 HTML
- nearprotocol - 你如何估计 NEAR 智能合约方法调用的 gas 使用量?
- prolog - 如何获得谓词的所有解的总和(假设解集是有限的)?
- javascript - 将 Javascript 动画转换为 CSS 动画