本篇博客主要是对网络中的全连接层进行修改,分为以下两种情况:
(1)如何使用预训练模型(1000类)训练自己的数据(2类):主要修改全连接层;
(2)在自己搭建的模型中使用像cifar10,ImageNet训练时保存的模型,在如何将预训练参数加载到自己的数据中。
如果有错误,欢迎批评指正,谢谢。
针对(1):
比如加载keras中的inceptionv3预训练模型:
我认为这篇文章写得很全:https://www.jianshu.com/p/23295376c44d
from keras.applications.inception_v3 import InceptionV3
from keras.models import Model,load_model
from keras.layers import Dense, GlobalAveragePooling2D
from keras.utils import plot_model
base_model = InceptionV3(weights='imagenet', include_top=False)
# weights='imagenet':表示加载使用ImageNet预训练的参数;
#include_top:是否包含全连接层
print(base_model.summary()) # 打印模型概况
x = base_model.output
x = GlobalAveragePooling2D()(x)
#【2】增加两个全连接层
x = Dense(1024, activation='relu')(x)
predictions = Dense(class_self, activation='softmax')(x) #class_self:根据自己数据类别设定
self_model = Model(inputs = model.inputs, outputs = predictions)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
针对(2)
与(1)还是有差别的:
首先,加载模型:
model = load_model('./cifar_model.h5')
model = Model(inputs = model.inputs, outputs = model.get_layer('flatten_1').output)
#flatten_1:根据自己想要提取网络第几层来设定
x = model.output
predictions = Dense(class_self, activation='softmax')(x) #class_self:根据自己数据类别设定
self_model = Model(inputs = model.inputs, outputs = predictions)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
之后就是模型训练了model.fit()
参考文章:
https://www.jianshu.com/p/23295376c44d
https://blog.csdn.net/qq_29462849/article/details/83010854