首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确训练VGG16 Keras

如何正确训练VGG16 Keras
EN

Stack Overflow用户
提问于 2019-04-14 08:10:57
回答 2查看 1.4K关注 0票数 0

我正在尝试重新训练VGG16来对乐高图像进行分类。然而,我的模型的准确率很低(在20%之间)。我做错了什么?可能是FC号错了,或者是我的ImageDataGenerator。我有大约。每个类2k个图像,总共6个类。

如何创建模型:

代码语言:javascript
复制
def vgg16Model(self,image_shape,num_classes):
    model_VGG16 = VGG16(include_top = False, weights = None)
    model_input = Input(shape = image_shape, name = 'input_layer')
    output_VGG16_conv = model_VGG16(model_input)
    #Init of FC layers
    x = Flatten(name='flatten')(output_VGG16_conv)
    x = Dense(256, activation = 'relu', name = 'fc1')(x)
    output_layer = Dense(num_classes,activation='softmax',name='output_layer')(x)
    vgg16 = Model(inputs = model_input, outputs = output_layer)
    vgg16.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
    vgg16.summary()
    return vgg16

我正在创建ImageDataGenerator并进行培训:

代码语言:javascript
复制
path = "real_Legos_images/trainable_classes"
evaluate_path = "real_Legos_images/evaluation"
NN = NeuralNetwork()
gen = ImageDataGenerator(rotation_range=40, width_shift_range=0.02, shear_range=0.02,height_shift_range=0.02, horizontal_flip=True, fill_mode='nearest')

train_generator = gen.flow_from_directory(os.path.abspath(os.path.join(path)), 
                target_size = (224,224), color_mode = "rgb", batch_size = 16, class_mode='categorical')

validation_generator = gen.flow_from_directory(os.path.abspath(os.path.join(evaluate_path)),
                target_size = (224,224), color_mode = "rgb", batch_size = 16, class_mode='categorical')

STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size
num_classes = len(os.listdir(os.path.abspath(os.path.join(path))))
VGG16 = NN.vgg16Model((224, 224, 3), num_classes)

VGG16.save_weights('weights.h5')
VGG16.fit_generator(train_generator, validation_data = validation_generator, validation_steps = validation_generator.n//validation_generator.batch_size,
                steps_per_epoch = STEP_SIZE_TRAIN, epochs = 50)
EN

回答 2

Stack Overflow用户

发布于 2019-04-14 09:27:45

带有参数include_top = FalseVGG16模型将返回512维特征映射。通常,我们应该首先在它后面添加一个GlobalAveragePooling2DGlobalMaxPooling2D层,然后将它展平为一个一维数组。否则,您将得到一个太长而无法容纳的数组。

票数 0
EN

Stack Overflow用户

发布于 2019-04-15 23:13:13

您已经将VGG的weight属性设置为'None‘,这意味着您的网络是用随机权重初始化的。这意味着您没有使用预先训练好的权重。因此,我建议尝试将权重设置为' imagenet‘,这样您就可以使用VGG网络,其权重是在imagenet数据集上预先训练的:

代码语言:javascript
复制
model_VGG16 = VGG16(include_top=False, weights='imagenet')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55670946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档