我正在使用Keras提供的经过预先训练的VGG 16模型,并将其应用于SVHN dataset,该模型是10类数字0-10的数据集。该网络无法学习,并且已经停留在0.17
精度上。我做错了某些事情,但无法识别。我进行培训的方式如下:
import tensorflow.keras as keras
## DEFINE THE MODEL ##
vgg16 = keras.applications.vgg16.VGG16()
model = keras.Sequential()
for layer in vgg16.layers:
model.add(layer)
model.layers.pop()
for layer in model.layers:
layer.trainable = False
model.add(keras.layers.Dense(10, activation = "softmax"))
## START THE TRAINING ##
train_optimizer_rmsProp = keras.optimizers.RMSprop(lr=0.0001)
model.compile(loss="categorical_crossentropy", optimizer=train_optimizer_rmsProp, metrics=['accuracy'])
batch_size = 128*1
data_generator = keras.preprocessing.image.ImageDataGenerator(
rescale = 1./255
)
train_generator = data_generator.flow_from_directory(
'training',
target_size=(224, 224),
batch_size=batch_size,
color_mode='rgb',
class_mode='categorical'
)
validation_generator = data_generator.flow_from_directory(
'validate',
target_size=(224, 224),
batch_size=batch_size,
color_mode='rgb',
class_mode='categorical')
history = model.fit_generator(
train_generator,
validation_data = validation_generator,
validation_steps = math.ceil(val_split_length / batch_size),
epochs = 15,
steps_per_epoch = math.ceil(num_train_samples / batch_size),
use_multiprocessing = True,
workers = 8,
callbacks = model_callbacks,
verbose = 2
)
我做错了什么?有什么我想念的吗?我期望它具有很高的准确性,因为它承载着imagenet
的重量,但是从第一个纪元开始就保持0.17
的精度。
答案 0 :(得分:0)
我假设您要对类似于32x32 MNIST的图像进行上采样以适合VGG16输入,在这种情况下,您实际上应该做的是删除所有密集层,这样您就可以像卷积层一样输入任何图像大小权重与图像大小无关。
您可以这样做:
vgg16 = keras.applications.vgg16.VGG16(include_top=False, input_shape=(32, 32))
我认为这应该是构造函数的默认行为。
对图像进行升采样时,最好的情况是基本上使图像模糊,在这种情况下,您必须考虑到原始图像的单个像素对应于升采样图像的7个像素,而VGG16的滤镜为3像素宽,换句话说,您正在失去图片的功能。
不必像原始VGG16那样在最后添加3个密集层,您可以尝试使用代码中的相同层。