Tensorflow Keras: ValueError:发现意外的损失或不对应于任何模型输出的指标



我有一个使用keras子类化API构建的模型,如下所示:

class APR(keras.Model):
def __init__(self):
super(APR, self).__init__()
# layers for bidirectional
forward_layer = keras.layers.GRU(
128, return_sequences=True, dropout=.5,
name="gru_forward_layer"
)
backward_layer = keras.layers.LSTM(
128, return_sequences=True, dropout=.5,
go_backwards=True, name="lstm_backward_layer"
)
self.embedding = keras.layers.Embedding(
vocab_size, 100, 
input_length=max_words,
weights=[embedding_matrix], 
trainable=True,
name = "embedding_layer"
)
self.bidirectional = keras.layers.Bidirectional(
forward_layer,
backward_layer = backward_layer,
name= "bidirectional_layer"
)
self.gru_layer = keras.layers.GRU(
512, return_sequences=True,
dropout=.5,
name= "gru_layer"
)
self.lstm_layer = keras.layers.LSTM(
512, return_sequences=True,
dropout=.5,
name="lstm_layer"
)
self.fc_1 = keras.layers.Dense(512, activation="relu", name="upvote_fc1")
self.pooling_layer = keras.layers.GlobalAveragePooling1D(
name="average_pooling_layer"
)
self.concatenate_layer = keras.layers.Concatenate(name="concatenate_layer_layer")
self.dense_1 = keras.layers.Dense(64, activation='relu', name="dense_1")
self.dropout_1 = keras.layers.Dropout(rate= .5, name="dropout_layer_0")
self.dense_2 = keras.layers.Dense(512, activation='relu', name="dense_2")
self.dropout_2 =  keras.layers.Dropout(rate= .5, name="dropout_layer_1")
self.dense_3 = keras.layers.Dense(128, activation='relu', name="dense_3")
self.dropout_3 = keras.layers.Dropout(rate= .5, name="dropout_layer_2")
self.rating_output = keras.layers.Dense(5, activation='softmax', name="rating_output")
self.recommend_output = keras.layers.Dense(1, activation='sigmoid', name="recommend_output")

def call(self, inputs):
text, upvote = inputs
# Leaning the text features
x_1 = self.embedding(text)
x_1 = self.bidirectional(x_1)
x_1 = self.gru_layer(x_1)
x_1 = self.lstm_layer(x_1)
x_1 = self.pooling_layer(x_1)
# Learning the upvotes
x_2 = self.fc_1(upvote)
# concatenation
x = self.concatenate_layer([x_1, x_2])
# leaning combinned features
x = self.dense_1(self.dropout_1(x))
x = self.dense_2(self.dropout_2(x))
x = self.dense_3(self.dropout_3(x))
# outputs
rating = self.rating_output(x)
recommend = self.recommend_output(x)
return rating, recommend

这是我如何创建这个模型的实例。

apr_model = APR()
apr_model.build([(None, 100), (None, 1)])
apr_model.summary()

然后按如下方式编译模型:

apr_model.compile(
loss = {
"recommend_output" : keras.losses.BinaryCrossentropy(from_logits=False),
"rating_output" : keras.losses.CategoricalCrossentropy(from_logits=False)
},
metrics = ['accuracy'],
optimizer = keras.optimizers.Adam()
)

问题来了,当我试图运行训练循环,看起来如下:

BATCH_SIZE = 128

recommend_output_early_stoping = keras.callbacks.EarlyStopping(
monitor='recommend_output_loss',
min_delta=0,
patience=5,
verbose=1,
mode='auto',
baseline=None,
restore_best_weights=False,
)
rating_output_early_stoping = keras.callbacks.EarlyStopping(
monitor='rating_output_loss',
min_delta=0,
patience=5,
verbose=1,
mode='auto',
baseline=None,
restore_best_weights=False,
)

history = apr_model.fit(
x = [train_tokens_sequence_padded, train_up_votes_scaled], 
y = [train_recommends.astype('int32'), train_ratings],
epochs = 10,
verbose = 1,
shuffle=True,
batch_size= BATCH_SIZE,
validation_data=([val_tokens_sequence_padded, val_up_votes_scaled], [val_recommends.astype('int32'), val_ratings]),
validation_batch_size = BATCH_SIZE//2,
# callbacks =[recommend_output_early_stoping, rating_output_early_stoping]
)

我得到的错误是:

ValueError: Found unexpected losses or metrics that do not correspond to any Model output: dict_keys(['recommend_output', 'rating_output']). Valid mode output names: ['output_1', 'output_2']. Received struct is: {'recommend_output': <keras.losses.BinaryCrossentropy object at 0x7f5f08ce69d0>, 'rating_output': <keras.losses.CategoricalCrossentropy object at 0x7f5f08ce6990>}.

可能是什么问题

改变这个:

apr_model.compile(
loss = {
"recommend_output" : keras.losses.BinaryCrossentropy(from_logits=False),
"rating_output" : keras.losses.CategoricalCrossentropy(from_logits=False)
},
metrics = ['accuracy'],
optimizer = keras.optimizers.Adam()
)

:

apr_model.compile(
loss = {
"output_2" : keras.losses.BinaryCrossentropy(from_logits=False),
"output_1" : keras.losses.CategoricalCrossentropy(from_logits=False)
},
metrics = ['accuracy'],
optimizer = keras.optimizers.Adam()
)

修复我的问题

最新更新