gpt4 book ai didi

python - Keras 自定义损失函数,包含来自完整输入数据集的样本

转载 作者:行者123 更新时间:2023-12-01 07:14:28 25 4
gpt4 key购买 nike

我正在尝试为 Keras 中的变分自动编码器设计一个自定义损失函数,分为两部分:重建损失发散损失。但是,我不想使用高斯分布来计算散度损失,而是想从输入中随机采样,然后根据采样的输入执行散度损失。但是,我不知道如何对来自完整数据集的输入进行采样,然后对其进行损失。编码器模型为:

x_input = Input((input_size,))
enc1 = Dense(encoder_size[0], activation='relu')(x_input)
drop = Dropout(keep_prob)(enc1)
enc2 = Dense(encoder_size[1], activation='relu')(drop)
drop = Dropout(keep_prob)(enc2)
mu = Dense(latent_dim, activation='linear', name='encoder_mean')(drop)
encoder = Model(x_input,mu)

损失的结构应该是:

# the input is the placeholder for the complete input
def loss(x, y, input):
reconstruction_loss = mean_squared_error(x, y)
sample_num = 100
sample_input = sample_from_input(input, sample_num)
sample_encoded = encoder.predict(sample_input) <-- this would not work with placeholder
sample_prior = gaussian(mean=0, std=1)
# perform KL divergence between sample_encoded and sample_prior

我还没有发现任何类似的东西。如果有人能指出我正确的方向,那就太好了。

最佳答案

您的代码中存在一些问题。首先,当您创建自定义损失函数时,它只需要 y_truey_pred 两个(等效)参数。因此,在您的情况下,您将无法显式传递 input 参数。如果你想传递额外的参数,你必须使用嵌套函数的概念。

下一步是在 predict 函数中,您将无法传递 TensorFlow 占位符。您必须在其中传递 Numpy 数组等效项。因此,我建议您重写 sample_from_input,它从一组文件路径输入中进行采样,读取它并发送文件数据的 Numpy 数组。另外,在 input_data 的参数中,将数据所在的文件路径传递给它。

我只附上了相关的代码部分。

def custom_loss(input_data):
def loss(y_true, y_pred):
reconstruction_loss = mean_squared_error(x, y)
sample_num = 100
sample_input = sample_from_input(input_data)
# sample_input is a Numpy array
sample_encoded = encoder.predict(sample_input)
sample_prior = gaussian(mean=0, std=1)
# perform KL divergence between sample_encoded and sample_prior
divergence_loss = # Your logic returning a numeric value
return reconstruction_loss + divergence_loss
return loss

encoder.compile(optimizer='adam', loss=custom_loss('<<input_data_path>>'))

关于python - Keras 自定义损失函数,包含来自完整输入数据集的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58044421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com