Python 加载keras模型时的未知度量错误
我训练了我的回归模型,没有任何问题。完美的训练和测试。 我使用Python 加载keras模型时的未知度量错误,python,tensorflow,keras,metrics,Python,Tensorflow,Keras,Metrics,我训练了我的回归模型,没有任何问题。完美的训练和测试。 我使用model.save(model\u文件名)来保存它。 当我尝试使用model=load\u model(model\u filename)加载模型时,我得到以下错误 ValueError:未知的度量函数:{'class_name': 'RootMeanSquaredError','config':{'name':'root_mean_squared_error', 'dtype':'float32'} 知道发生了什么事吗 以下是我的
model.save(model\u文件名)
来保存它。
当我尝试使用model=load\u model(model\u filename)
加载模型时,我得到以下错误
ValueError:未知的度量函数:{'class_name':
'RootMeanSquaredError','config':{'name':'root_mean_squared_error',
'dtype':'float32'}
知道发生了什么事吗
以下是我的模型定义:
def RegressionCNN2(input_shape,learning_rate):
model = Sequential()
#model.add(keras.Input(shape = input_shape))
#model.add(Dense(256, activation='relu', input_dim=366))
#model.add(Conv2D(64, (3, 3), activation='relu',input_shape=input_shape))
model.add(Conv2D(128, (3, 3), activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), init='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='linear'))
opt = keras.optimizers.Adam(learning_rate=learning_rate)
model.compile(loss='mean_squared_error',
optimizer=opt,
metrics=[tf.keras.metrics.RootMeanSquaredError()]
)
return model
培训代码:
# Create model
model = RegressionCNN2((netH,netW,3),learning_rate)
print(train_ims.shape,train_labels.shape)
# Train model
model.fit(train_ims, train_labels,
batch_size=batch_size,
epochs=epochs,
verbose=2,
validation_data=(valid_ims, valid_labels),
shuffle = True,
use_multiprocessing = True,
callbacks=my_callbacks)
提前谢谢
----更新---
我保存了权重和体系结构,而不是使用model.save(),加载后我重新编译了模型,工作正常。如果你有其他选择的话,我很乐意听到。以下是我的解决方案:
json_file = open('net_name.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights('net_name.h5')
print("Loaded model from disk")
model.compile(loss='mean_squared_error',
optimizer=opt,
metrics=[tf.keras.metrics.RootMeanSquaredError()]
)
----更新2----
这是一个版本控制问题。
使用model=tf.keras.models.load\u model(model\u name)
解决了这个问题。
然而,一般来说,存储权重和体系结构并只是重新编译似乎是一种更为稳健的方法,因为它跨版本工作您可以发布用于加载模型的所有代码吗?model=load_model(net_name)这有帮助吗?我确实检查了这一点,但在我的情况下,我没有定义任何自定义指标。。。我只是使用keras作为默认指标。。。这就是为什么我感到困惑的原因,这并不是所有的代码,当然,你是在用一个keras版本训练模型,然后用另一个版本加载它。那是行不通的。