tensorflow - 未知的度量函数:请确保将此对象传递给“custom_objects”参数
问题描述
我已经使用迁移学习训练了一个带有 keras 的模型。由于整个代码几乎都很大,我只带了重要的部分。
对于学习率,我从 github 克隆了一些代码,以便能够使用循环学习率。并将其作为回调传递给模型。
这是我定义学习率的方式。
from tensorflow.keras.optimizers import RMSprop
opt = RMSprop()
def get_lr_metric(optimizer):
def lr(y_true, y_pred):
return optimizer.lr
return lr
lr_track = get_lr_metric(opt)
MIN_LR = 1e-7
MAX_LR = 1e-3
CLR_METHOD = "triangular"
clr = CyclicLR(
mode= CLR_METHOD,
base_lr= MIN_LR,
max_lr= MAX_LR,
step_size= steps_per_epoch)
和我的模型:
def vgg16_fine_tune():
vgg16_model = VGG16(weights='imagenet', include_top=False)
x = vgg16_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.3)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.3)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.3)(x)
predictions = Dense(3, activation='softmax')(x)
model = Model(inputs=vgg16_model.input, outputs=predictions)
for layer in vgg16_model.layers:
layer.trainable = False
return model
model = vgg16_fine_tune()
我编译了我的代码:
import keras
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy' , lr_track, keras.metrics.Precision(), keras.metrics.Recall()])
history_2 = model.fit(datagen.flow(x_train, y_train),
epochs=20,
shuffle=True,
validation_data=(x_val, y_val),
callbacks=[chkpt, clr, es])
Epoch 1/20
188/188 [==============================] - 80s 416ms/step - loss: 0.5007 - accuracy: 0.8038 - lr: 4.4728e-06 - precision: 0.8275 - recall: 0.7711 - val_loss: 0.3959 - val_accuracy: 0.8560 - val_lr: 8.7048e-07 - val_precision: 0.8833 - val_recall: 0.8227
Epoch 2/20
188/188 [==============================] - 79s 423ms/step - loss: 0.4116 - accuracy: 0.8442 - lr: 4.8224e-06 - precision: 0.8660 - recall: 0.8215 - val_loss: 0.3621 - val_accuracy: 0.8700 - val_lr: 1.7400e-06 - val_precision: 0.8923 - val_recall: 0.8393
Epoch 3/20
188/188 [==============================] - 79s 421ms/step - loss: 0.3884 - accuracy: 0.8535 - lr: 5.1341e-06 - precision: 0.8775 - recall: 0.8331 - val_loss: 0.3529 - val_accuracy: 0.8767 - val_lr: 2.6094e-06 - val_precision: 0.8953 - val_recall: 0.8547
Epoch 4/20
188/188 [==============================] - 80s 423ms/step - loss: 0.3836 - accuracy: 0.8599 - lr: 5.4058e-06 - precision: 0.8809 - recall: 0.8407 - val_loss: 0.3452 - val_accuracy: 0.8767 - val_lr: 3.4789e-06 - val_precision: 0.8962 - val_recall: 0.8580
Epoch 5/20
188/188 [==============================] - 79s 419ms/step - loss: 0.3516 - accuracy: 0.8662 - lr: 5.6348e-06 - precision: 0.8857 - recall: 0.8448 - val_loss: 0.3324 - val_accuracy: 0.8780 - val_lr: 4.3484e-06 - val_precision: 0.8923 - val_recall: 0.8613
Epoch 6/20
188/188 [==============================] - 79s 422ms/step - loss: 0.3518 - accuracy: 0.8726 - lr: 5.8182e-06 - precision: 0.8905 - recall: 0.8487 - val_loss: 0.3378 - val_accuracy: 0.8733 - val_lr: 5.2179e-06 - val_precision: 0.8952 - val_recall: 0.8540
Epoch 7/20
188/188 [==============================] - 78s 413ms/step - loss: 0.3324 - accuracy: 0.8799 - lr: 5.9525e-06 - precision: 0.8955 - recall: 0.8649 - val_loss: 0.3393 - val_accuracy: 0.8740 - val_lr: 6.0873e-06 - val_precision: 0.8944 - val_recall: 0.8527
Epoch 8/20
188/188 [==============================] - 78s 417ms/step - loss: 0.3312 - accuracy: 0.8759 - lr: 6.0333e-06 - precision: 0.8936 - recall: 0.8549 - val_loss: 0.3149 - val_accuracy: 0.8920 - val_lr: 6.9568e-06 - val_precision: 0.9109 - val_recall: 0.8653
然后在拟合后我保存了它:
model.save_weights('model_weight.h5')
model.save('model_keras.h5')
但是当我需要加载我的模型并使用它时,我会收到关于自定义对象的错误。
from tensorflow import keras
import os
model_dir = 'My Directory'
model1 = os.path.join(model_dir, "DenseNet_model_keras.h5")
Vgg16 = keras.models.load_model(model1)
这是我的错误:
ValueError:未知的度量函数:lr。请确保将此对象传递给
custom_objects
参数。有关详细信息,请参阅 https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object 。
我什至尝试过这段代码。
Vgg16 = keras.models.load_model(model1 , custom_objects={"lr": lr})
但我得到的只是
Vgg16 = keras.models.load_model(model1 , custom_objects={"lr": lr}) Traceback(最近一次调用最后):
文件“”,第 1 行,在 Vgg16 = keras.models.load_model(model1 , custom_objects={"lr": lr})
NameError:名称“lr”未定义
有人可以帮我解决我的问题吗?
解决方案
因为正如错误所说你没有调用它lr
,你调用了它
lr_track
在lr_track = get_lr_metric(opt)
,你从来没有定义过lr
。
你需要这样称呼它:
Vgg16 = keras.models.load_model(model1 , custom_objects={"lr": lr_track })
推荐阅读
- c - C中char和int的大小
- laravel - Laravel 8 项目部署到共享主机 - 安全问题和 public_html 文件夹
- python - 列表列表中的自定义切片
- javascript - 当我尝试提交表单时,它显示 TypeError: Object(...) is not a function
- firebase - Firebase 托管重写 URL
- python - 使用 Python 按变量名对 Terraform variables.tf 进行排序
- r - 如何全部转换
到 - python - 加载包列表时出错:请求失败,状态码为 404
- c++ - 具有多个用户输入的数组的模板类
- operating-system - 页面替换策略如何适用于具有 TLB 的系统?