keras中保存的模型有两种类型:
model.save(“文件名.h5”) 和 model.save_weight(“文件名.h5”)
1、 带有网络结构的这种的,好处是吧整个网络框架全部网络在一块了,连根拔起方便快捷。通过(model.save)保存。将h5转换成pb模型或其他转换模型时,转换依据是根据整个网络结构和权重,所以此时必须要完整保存。
后缀名可以是,h5或hdf5。
其对应的加载模型方式为load
model = load_model('model.hdf5')
由save()保存下来的h5文件才可以直接通过load_model()打开
2、没有网络结构的纯权重文件,这种的功能是可以将权重使用到不同的模型中方便迁移学习使用。通过(model.save_weights)保存。它的好处是文件较小。
如果是这种情况,你通过网络层名称去找权重参数是找不到的,因为你压根就没有存储网络结构,固然是失败的。 加载它必须首先定义一摸一样网络结构,然后将权重导入。
# 先建立模型
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# 之后再导入权重
classifier = model.load_weights('model_weights.h5')
在这之后classifier就和load_model()导入的模型一样了。