Keras——VGG16的微调finetune

keras和pytorch对于引入网络模型有一些区别
pytorch

from torchvision import models
resnet_model = models.resnet18(pretrained=True) 
# pretrained 设置为 True,会自动下载模型 所对应权重,并加载到模型中
# 也可以自己下载 权重,然后 load 到 模型中

keras

from keras.models import Model
from keras.applications.vgg16 import VGG16
from keras import layers
base_model = VGG16(weights = "vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5",
                    include_top = False,
                    input_shape = (48,48,3))
#vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5是我下载的模型的权重文件
#这个地方可以指定,'None'就是随机初始化参数,'imagenet'就是采用Imagenet数据集训练好的权重,
#但是第一次跑的时候会下载,下载时间有些长,所以我就在github上直接下载了,指定路径就可以了
#下载源:https://github.com/fchollet/deep-learning-models/releases
#  include_top就是不加载后面的全连接层         
out = base_model.layers[-1].output
out = layers.Flatten()(out)
out  = layers.Dense(512, activation='relu')(out)
out = layers.Dropout(0.5)(out)
out = layers.Dense(128, activation='relu')(out)
out = layers.Dropout(0.3)(out)
out = layers.Dense(7, activation='softmax')(out)
Model_tune = Model(inputs=base_model.input, outputs = out)

print(Model_tune.summary())

这样就是前13个卷积层有参数,后面是自己加的,finetune可以选择让前13个层是否参加训练,通过使能layer.trainable
layer.trainable = False
就是前13层不参加训练,参数不发生改变
layer.trainable = True
就是一起参加训练
可以写在 base_model = VGG16()里面
也可以自定义

for layer in Model_tune.layers[:19]:
    layer.trainable = False
#为什么是19不是13? 因为会有一个池化层,13只是指卷积层 

你可能感兴趣的:(Keras)