字符串“loss”被传递给 metric_name() 而不是指标名称

问题描述 投票:0回答:1

我是机器学习新手,现在只是在学习教程,但我收到了错误:

ValueError: Could not interpret metric identifier: loss

在:

\keras\src\metrics\__init__.py:205, in get(identifier)

看起来在wrapper.py第532行中

metric_name(key)
应该接收损失函数的名称,但它实际上接收字符串“loss”

以下是错误的相关代码:

def buildNetwork():
    classificator = Sequential()
    classificator.add(Dense(units = 20, activation='relu', kernel_initializer='random_uniform', input_shape=(30,)))
    classificator.add(Dense(units = 20, activation='relu', kernel_initializer='random_uniform'))
    classificator.add(Dense(units = 1, activation='sigmoid'))
    optimizer = keras.optimizers.Adam(learning_rate=0.001, weight_decay=0.000001)
    classificator.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['binary_accuracy'])
    return classificator


classifier = KerasClassifier(model=buildNetwork,batch_size=10,epochs=100, loss='binary_crossentropy')

score = cross_val_score(estimator=classifier, X=data, y=truth, cv=10, error_score='raise')

如果在里面

keras_metric_get
我手动设置
identifier = "binary_crossentropy"
它工作正常

我不知道是否是兼容性问题,但我有 Keras 3.0.8、TF 2.15.0 和 SciKeras 0.12.0

python machine-learning keras
1个回答
0
投票

SciKeras 快速入门文档,您应该将模型和损失传递给

KerasClassifier()
。从 KerasClassifier 文档,您还可以传递优化器和指标。

我会避免在

buildNetwork()
KerasClassifier()
中定义损失。我会模仿 SciKeras 快速入门文档中的示例,其中仅网络在
buildNetwork()
中定义,其他所有内容(优化器、损失和指标)都在外部定义。

def buildNetwork():
    classificator = Sequential()
    classificator.add(Dense(units = 20, activation='relu', kernel_initializer='random_uniform', input_shape=(30,)))
    classificator.add(Dense(units = 20, activation='relu', kernel_initializer='random_uniform'))
    classificator.add(Dense(units = 1, activation='sigmoid'))
    return classificator


classifier = KerasClassifier(
    model=buildNetwork,
    batch_size=10,
    epochs=100, 
    loss='binary_crossentropy',
    optimizer=keras.optimizers.Adam(learning_rate=0.001, weight_decay=0.000001),
    metrics=['binary_accuracy'],
)
© www.soinside.com 2019 - 2024. All rights reserved.