keras调用load_model时报错ValueError: Unknown layer:*解决办法

报的错误是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')

你可能感兴趣的:(改错历程,python,机器学习,神经网络,tensorflow,深度学习)