tensorflow - 自定义损失函数:如何使用 Tensorflow 在 keras 的损失函数中添加隐藏层的输出
问题描述
在我的模型中,隐藏层的输出,即“编码”,有两个通道(例如形状:[none, 128, 128, 2])。我希望在损失函数中在这两个通道之间添加SSIM:
损失= ssim(输入,输出)+ theta * ssim(编码(通道1),编码(通道2))。
我怎么能实现这个?以下是我的模型的架构。
def structural_similarity_index(y_true, y_pred):
loss = 1 - tf.image.ssim(y_true, y_pred, max_val=1.0)
return loss
def mymodel():
input_img = Input(shape=(256, 256, 1))
# encoder
x = Conv2D(4, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
encoded = Conv2D(2, (3, 3), activation='relu', padding='same', name='encoder')(x)
# decoder
x = Conv2D(4, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer = 'adadelta', loss = structural_similarity_index)
autoencoder.summary()
return autoencoder
我尝试定义如下所示的“loss_warper”函数,但它不起作用。这就是我添加此损失函数的方式:
autoencoder.add_loss(loss_wrapper(encoded[:,:,:,0],encoded[:,:,:,1])(input_img, decoded))
'loss_warper' 功能:
def loss_wrapper(CH1, CH2):
def structural_similarity_index(y_true, y_pred):
regweight = 0.01
loss = 1 - tf.image.ssim(y_true, y_pred, max_val=1.0)
loss = loss + regweight*(1-tf.image.ssim(CH1, CH2, max_val=1.0))
return loss
return structural_similarity_index
错误信息:
File "E:/Autoencoder.py", line 160, in trainprocess
validation_data= (x_validate, x_validate))
...
ValueError: ('Error when checking model target: expected no data, but got:', array([...]...[...]))
有谁知道如何实现这个?非常感谢任何帮助!
解决方案
推荐阅读
- java - 如何在字符数组中打印字符串?
- reactjs - 打字稿导入语法错误和其他
- excel - 如何在 Excel 中创建图表以显示正常运行时间和停机时间可用性
- json - 在不使用 jq 的情况下,使用 Shell 脚本从 JSON 中查找键的值
- python - Python - 带有 SQL 样式的数据框中的条件词频率
- python - 模型训练/测试的成对比较 - 如何调整参数?
- widget - 如何让 panel.widgets.MultiSelect 的选项依赖于其他小部件输入
- mysql - 如何在mysql 5.7中将数组转换为行
- html - Swiper JS如何让进度条和阵营分页同时工作?
- rest - 如何实施 CyberSource REST 3D Secure