报的错误是ValueError: Unknown layer: SpatialPyramidPooling,
使用了SPPnet用于分类。
错误原因:keras中SPP不是默认存在的层,使用 load model 函数报错。
解决:
model.save('./vgg40e.h5')
from keras.models import load_model
from keras.utils import CustomObjectScope
with CustomObjectScope({'SpatialPyramidPooling': SpatialPyramidPooling}):
model = load_model('./vgg40e.h5')
有两个以上的自定义网络层的解决方法如下:
cu_ob = {'AttentionLayer1': custom_layer.Attention,'AttentionLayer2': custom_layer.Attention}
model = load_model('./cnn.h5', custom_objects=cu_ob)
当然model的权重保存有多种办法,save_weights()方法
测试时直接导入搭建的模型代码,写成类或者函数封装,使用model.load_weights()来导入权重文件。
除此之外,模型的训练历史如果没有事先保存,那就找不到了。下次跑模型是应将其训练日志保存下来。
H = model.fit(X_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(X_test, y_test))
accu = H.history['accuracy']
val_acc = H.history['val_accuracy']
loss = H.history['loss']
val_loss = H.history['val_loss']
epochs = range(len(accu))
plt.plot(epochs,accu, 'b', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='validation accuracy')
plt.title('Training and validation accuracy')
plt.legend(loc='lower right')
plt.savefig('./train40e.png', dpi = 600)
plt.figure()
plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.savefig('./tloss40e.png', dpi = 600)
plt.show()
或者在开始训练前使用记录器.
from keras.callbacks import CSVLogger
csv_logger = CSVLogger('training.log', separator=',', append=False)
model.fit(X_train, y_train, callbacks=[csv_logger])
整个日志历史记录存储在文件“ training.log”中,可以获得与H.history相同的信息。加载存储在此文件中的数据,可以使用 pandas read_csv做到这一点:
import pandas as pd
log_data = pd.read_csv('training.log', sep=',', engine='python')