python - 部分输入和输出的自定义损失
问题描述
我已经像这样定义了一个VAE:
def cond_encoder(nfeatures,ncondfeatures,layers, latent_dim, activation='relu'):
finputs = Input(shape=(nfeatures,))
cinputs = Input(shape=(ncondfeatures,))
inputs = concatenate([finputs,cinputs])
hidden = Dense(layers[0],activation=activation, name = f"Dense_enc{0}")(inputs)
for i in range(1, len(layers)):
hidden = Dense(units = layers[i], activation=activation, name = f"Dense_enc{i}")(hidden)
z_mean = Dense(units=latent_dim,activation='linear',name='z_mean')(hidden)
z_logvar = Dense(units=latent_dim, activation='linear',name='z_logvar')(hidden)
z_mean,z_logvar = KLDivergenceLayer(weight=1.0)([z_mean,z_logvar])
KLDivergenceLayer.trainable = False
encoder = Model(inputs = [finputs,cinputs], outputs = [z_mean]+[z_logvar])
return encoder
def cond_decoder(nfeatures,ncondfeatures, layers, latent_dim, activation='relu'):
fromEncoder = Input(shape=(latent_dim,))
cinputs = Input(shape=(ncondfeatures,))
inputs = concatenate([fromEncoder,cinputs])
hidden = Dense(units = layers[0], activation = activation, name = f"Dense_dec{0}")(inputs)
for i in range(1, len(layers)):
hidden = Dense(units = layers[i], activation=activation, name = f"Dense_dec{i}")(hidden)
output = Dense(units = nfeatures, activation = 'linear')(hidden)
decoder = Model(inputs=[fromEncoder,cinputs], outputs = output)
return decoder
encoder = models.cond_encoder(nfeatures*nclusters,ncondfeatures,dense_layers,nlatent_dim,activation='relu')
decoder = models.cond_decoder(nfeatures*nclusters,ncondfeatures,dense_layers[::-1],nlatent_dim,activation='relu')
finputs=Input(shape=(nfeatures*nclusters,))
cinputs=Input(shape=(ncondfeatures,))
Z_latent_space= encoder([finputs,cinputs])
sampled_latent_space=models.sampleZ(Z_latent_space)
outputs=decoder([sampled_latent_space,cinputs])
vae_model_train = Model(inputs=[finputs,cinputs],outputs=outputs)
然后我训练编译并拟合模型,如下所示:
vae_model_train.compile(loss=mse,optimizer=Adam(lr))
history = vae_model_train.fit([trainstuff,traincond],[trainstuff, traincond],batch_size=batch_size, epochs= 100, verbose=1, validation_data=([val_jets,valcond],[val_jets,valcond]), initial_epoch=0)
我想要做的是仅计算 trainstuff 和重建的 trainstuff 之间的 mse,但是像我一样传递输入,我怀疑 [trainstuff, traincond] 和它的重建之间的 mse 是计算的?
我试过这个自定义损失函数:
def custom_loss(use_mse=False):
def loss(y_true, y_pred):
return K.int_shape(y_pred)[1] * mse(y_true[0], y_pred[0])
return loss
我不确定这是正确的方法吗?
解决方案
Keras 将输出和目标映射到损失函数,所以只要我的模型输出是 trainstuff reco,目标是 trainstuff,我可以简单地使用 mse 就可以了。
推荐阅读
- c# - ASP.NET Core 中的 ILogger 和 DependencyInjection 架构
- widget - PWA 是否支持小部件
- c++ - qt qml 对象已经有一个 QQmlContext
- python - 熊猫的功能不正常
- visual-studio-code - 将 VS Code 默认设置为折叠
- r - 双重标记 x 轴
- java - 无法在 Android Studio 中加载任何调用本机代码的串行库
- python - 如何删除 csv 文件中的特殊字符并使用 python 保持变音符号
- react-native - React native fetch API 不适用于我的本地地址或除“ngrok”之外的任何方法
- r - 相当于 tidyverse 生态系统中的 ave()