【问题标题】:Why is VGG-16 performing poor on CIFAR-10 dataset?为什么 VGG-16 在 CIFAR-10 数据集上表现不佳?
【发布时间】:2021-09-20 04:41:21
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 你注意到你的损失没有减少吗?
  • 是的....但是,我找不到原因....
  • 使用经过调整的学习率的普通 SGD,直到损失减少,Adam 并不总是工作,而 VGG 是一个边缘情况,它通常会失败。
  • 我试过了....但是没有任何改进....你认为代码有什么问题吗??

标签: tensorflow keras deep-learning conv-neural-network vgg-net


【解决方案1】:

您似乎还没有找到合适的培训计划。

如果您不介意稍微更改模型,我建议在每个卷积层之后使用 Batchnorm。一般来说,使用 Batchnorm 更容易训练模型。

此外,您是否在一定数量的迭代后降低了学习率?在某些时候,太大的学习率可能不会再减少你的训练错误。例如,ResNet 以 0.1 的初始学习率训练 100 个 epoch,然后用 0.01 训练另外 50 个 epoch,再用 0.001 训练另外 50 个 epoch。

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 2018-06-22
    • 2015-11-13
    • 2022-12-04
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多