一、只保存/加载模型的结构
保存模型的结构,而非其权重或训练配置项:
json_string = model.to_json()
model.save('my_model.h5')
my_model_json = model.to_json()
with open('my_json_model.json', 'w') as f:
f.write(my_model_json)
from keras.models import model_from_json
model = model_from_json(json_string)
with open('my_json_model.json') as f:
my_json_model = f.read()
from keras.models import model_from_json
model = model_from_json(my_json_model)
model.summary()
# 只有架构,没有被编译,所以需要编译
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.evaluate(test_image, test_label)
二、只保存/加载模型的权重
只保存模型的权重:
model.save_weights('my_model_weights.h5')
只加载模型的权重 :
model.load_weights('my_model_weights.h5')
model去加载权重,是使用已经定义好的model去加载权重
model.load_weights('my_model_weights.h5')
model.evaluate(test_image, test_label)
加载一部分权重
from keras import layers
model_new = keras.Sequential()
model_new.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1), name='conv_1'))
model_new.add(layers.Conv2D(64, (3, 3), activation='relu', name='conv_2'))
model_new.add(layers.MaxPooling2D(pool_size=(2, 2)))
model_new.add(layers.Flatten())
model_new.add(layers.Dense(256, activation='relu', name='dense_1_'))
model_new.add(layers.Dropout(0.5))
model_new.add(layers.Dense(10, activation='softmax', name='dense_2_'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1), name='conv_1'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', name='conv_2'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu', name='dense_1'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax', name='dense_2'))
model_new.summary()
model_new.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model_new.load_weights('my_model_weights.h5', by_name=True)
model_new.evaluate(test_image, test_label)
这样的话卷积层的权重加载进去了,但是Dense层是随机初始化的。