python - 实施 MSE 损失
问题描述
我是深度学习的新手,我想实现一个自动编码器。我正在使用keras和mse 损失函数。但是当我使用我实现的 MSE 函数时,我的函数的输出和 keras.losses.mse 大致相同,但结果明显更差。
由于我项目中的一些需求,我想修改 MSE。但是当实施时,结果的质量变得更糟。
函数的输入是两个 23*32*3 的 ndarray。由于我想做的修改,我不得不进行切片。
import tensorflow as tf
import numpy as np
import keras as k
def custom_loss(im1, im2):
im11 = im1[:, :, 0]
im12 = im1[:, :, 1]
im13 = im1[:, :, 2]
im21 = im2[:,:,0]
im22 = im2[:,:,1]
im23 = im2[:,:,2]
diff1 = tf.square(im11 - im21)
diff2 = tf.square(im12 - im22)
diff3 = tf.square(im13 - im23)
res = tf.divide((diff1 + diff2 + diff3), 3)
return res
但是当我测试它时,结果几乎是一样的。但是当我在模型中使用它时,结果要糟糕得多。
a = np.random.rand(32, 32, 3)
b = np.random.rand(32, 32, 3)
v1 = tf.placeholder(tf.float32, (32, 32, 3), 'v1')
v2 = tf.placeholder(tf.float32, (32, 32, 3), 'v2')
with tf.Session() as sess:
me = sess.run(custom_loss(v1, v2), feed_dict={v1: a, v2: b})
true = sess.run(k.losses.mse(v1, v2), feed_dict={v1: a, v2: b})
for i in range(32):
for j in range(32):
print(i, j, true[i][j], me[i][j])
解决方案
我相信您缺少差异的总和。
尝试:
def custom_loss(im1, im2):
im11 = im1[:, :, 0]
im12 = im1[:, :, 1]
im13 = im1[:, :, 2]
im21 = im2[:,:,0]
im22 = im2[:,:,1]
im23 = im2[:,:,2]
diff1 = (im11 - im21)**2
diff2 = (im12 - im22)**2
diff3 = (im13 - im23)**2
res = tf.divide((diff1 + diff2 + diff3).sum(), 3)
return res
推荐阅读
- javascript - 使与当前日期和时间匹配的单元格具有某种颜色
- stackdriver - Google Cloud Run 中的 Opencensus 跟踪
- python - sklearn.metrics 防止未标记的预测被归类为误报
- css - 使用.Net核心减少左右边距
- python - IndexError:在尝试使用 face_recongition 自动识别人脸时列出超出范围的索引
- python - 突出显示熊猫数据框中的特定单元格
- c++ - 试图找到两组点的交集,错误“没有可行的重载'='”
- amazon-web-services - 如何让我的 ansible playbook 收集所需的 AWS EC2 信息并正确包装在文本输出文件中?
- python - 有条件地获取 DataFrame 列中的最后一个字符串元素
- javascript - 如何将表单/输入/文本添加到 fetch() 请求的末尾?