首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用隐藏层输出作为目标的一部分的Keras自定义损失函数

使用隐藏层输出作为目标的一部分的Keras自定义损失函数
EN

Stack Overflow用户
提问于 2018-08-21 11:42:45
回答 1查看 2.2K关注 0票数 2

我正在尝试在Keras中实现一个自动编码器,它不仅可以最小化重建误差,而且它的构造特征也应该最大化我定义的度量。我真的不知道该怎么做。

下面是我目前掌握的一些代码片段:

代码语言:javascript
复制
corrupt_data = self._corrupt(self.data, 0.1)

# define encoder-decoder network structure
# create input layer
input_layer = Input(shape=(corrupt_data.shape[1], ))
encoded = Dense(self.encoding_dim, activation = "relu")(input_layer)
decoded = Dense(self.data.shape[1], activation="sigmoid")(encoded)

# create autoencoder
dae = Model(input_layer, decoded)

# define custom multitask loss with wlm measure
def multitask_loss(y_true, y_pred):
    # extract learned features from hidden layer
    learned_fea = Model(input_layer, encoded).predict(self.data)
    # additional measure I want to optimize from an external function
    wlm_measure = wlm.measure(learned_fea, self.labels)
    cross_entropy = losses.binary_crossentropy(y_true, y_pred)
    return wlm_measure + cross_entropy

# create optimizer
dae.compile(optimizer=self.optimizer, loss=multitask_loss)

dae.fit(corrupt_data, self.data, 
                epochs=self.epochs, batch_size=20, shuffle=True, 
                callbacks=[tensorboard])

# separately create an encoder model
encoder = Model(input_layer, encoded)

目前这不能正常工作...当我查看训练历史时,该模型似乎忽略了额外的度量,仅基于交叉熵损失进行训练。另外,如果我将损失函数更改为只考虑wlm度量,我会得到错误消息"numpy.float64“object has no attribute "get_shape”(我不知道将wlm函数的返回类型更改为张量是否有帮助)。

我认为有几个地方可能出了问题。我不知道我是否在我的自定义损失函数中正确提取了隐藏层的输出。此外,我不知道我的wlm.measure函数是否正确输出-它是否应该输出numpy.float32或float32类型的一维张量。

基本上,传统的损失函数只关心输出层的预测标签和真实标签。在我的例子中,我还需要考虑隐藏层的输出(激活),这在Keras中实现起来并不是那么简单。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-21 17:31:26

你不想在你的自定义损失函数中定义你的learned_fea Model。相反,您可以预先定义具有两个输出的单个模型:解码器的输出(重构)和内容器的输出(特征表示):

代码语言:javascript
复制
multi_output_model = Model(inputs=input_layer, outputs=[decoded, encoded])

现在,您可以编写一个自定义损失函数,该函数仅适用于编码器的输出:

代码语言:javascript
复制
def custom_loss(y_true, y_pred):
    return wlm.measure(y_pred, y_true)

在编译模型时,您将传递损失函数列表(如果您命名张量,则传递字典):

代码语言:javascript
复制
model.compile(loss=['binary_crossentropy', custom_loss], optimizer=...)

并通过传递输出列表来拟合模型:

代码语言:javascript
复制
model.fit(X=X, y=[data_to_be_reconstructed,labels_for_wlm_measure])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51941258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档