Python ssim作为自动编码器中的自定义丢失功能(keras或/和tensorflow)

Python ssim作为自动编码器中的自定义丢失功能(keras或/和tensorflow),python,tensorflow,keras,autoencoder,Python,Tensorflow,Keras,Autoencoder,我目前正在为图像压缩编程一个自动编码器。从a开始,我现在得到了最后的确认,即我不能在Keras或tensorflow中使用纯Python函数作为损失函数。(我慢慢地开始明白为什么;-) 我想做一些实验,用它作为损失函数和度量。现在看来我可能很幸运。tensorflow中已经有了它的实现,请参见: tf.image.ssim( img1, img2, 最大值 ) 此外,bsautermeister在stackoverflow上提供了一个实现: 我现在的问题是:对于mnist数据集,我将如何使用它作

我目前正在为图像压缩编程一个自动编码器。从a开始,我现在得到了最后的确认,即我不能在Keras或tensorflow中使用纯Python函数作为损失函数。(我慢慢地开始明白为什么;-)

我想做一些实验,用它作为损失函数和度量。现在看来我可能很幸运。tensorflow中已经有了它的实现,请参见:

tf.image.ssim( img1, img2, 最大值 )

此外,bsautermeister在stackoverflow上提供了一个实现:

我现在的问题是:对于mnist数据集,我将如何使用它作为损失函数?该函数不接受张量,只接受两个图像。梯度会自动计算吗?据我所知,如果该函数是在tensorflow或keras后端实现的,那么它应该是

对于如何在keras或tensorflow中将前面提到的任何ssim实现用作损失函数的最小工作示例(MWE),我将非常感激

也许我们可以将我的MWE用于我前面的问题提供的自动编码器:

如果不能将我的keras自动编码器与ssim实现粘合在一起,那么直接在tensorflow中实现自动编码器是否可行?我也有,我能提供吗

我正在使用Python3.5、keras(使用tensorflow后端),如果需要,还可以直接使用tensorflow。 目前我正在使用(带数字的)

谢谢你的帮助


(旁白:似乎有几个人在做类似的事情。对这篇文章的回答也可能对你有用)

我不能为Keras服务,但在普通TensorFlow中,你只需切换L2或任何SSIM结果的成本,如

将tensorflow导入为tf
将numpy作为np导入
def假的img批次(*形状):
i=np.random.randn(*shape).astype(np.float32)
i[i<0]=-i[i<0]
返回tf.convert_到_张量(np.clip(i*255,0,255))
fake_img_a=tf.get_变量('a',初始值设定项=fake_img_批处理(2224224,3))
伪img\u b=tf.get\u变量('b',初始值设定项=fake\u img\u批处理(2224224,3))
假模a=tf.nn.sigmoid(假模a)
假模b=tf.nn.sigmoid(假模b)
#成本=tf.损失.均方误差(假模a,假模b,折减=tf.损失.折减.平均值)
costs=tf.image.ssim(假的img\u a,假的img\u b,1.)
成本=tf.减少平均值(成本)
列车=tf.train.AdamOptimizer(0.01)。最小化(成本)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
打印(sess.run(成本))
对于范围(500)内的k:
_,l=系统运行([列车,成本])
如果k%100==0:
打印('平均SSIM',l)
要检查操作是否具有渐变(已实现),请执行以下操作:

将tensorflow导入为tf
将numpy作为np导入
def假的img批次(*形状):
i=np.random.randn(*shape).astype(np.float32)
i[i<0]=-i[i<0]
返回tf.convert_到_张量(np.clip(i*255,0,255))
x1=tf.将μ转换为张量(假img批次(2,28,28,3))
x2=tf.将μ转换为μ张量(假μimgμ批量(2,28,28,3))
y1=tf.argmax(x1)#不可微->无梯度
y2=tf.image.ssim(x1,x2,255)#具有梯度
使用tf.Session()作为sess:
打印(tf.gradients(y1[x1])#将打印[None]-->无渐变

print(tf.gradients(y2,[x1,x2]))#将打印[首先,非常感谢。这已经非常有用。你为我澄清了梯度问题。不幸的是,还有一些我不太明白的地方。使用mnist=input_data。读取_数据集(“mnist_data”,one_hot=True)并打印(mnist.train.num_examples,mnist.test.num_examples,mnist.validation.num_examples)我得到(55000784)(55000,10)对于使用适当张量的假图像(2224224,3)(2224224,3).但是tf.image.ssim只为图像设计?我这里缺少什么?我无法让代码与mnist一起工作。你能澄清一下维度是如何组合的吗?你只能将ssim应用于两个图像,因此你必须将784输入重塑为[28,28,1]。谢谢!我会再试一次。我会尽快发布MWE。这里的
tf.reduce_mean()
行的功能是什么?原始
成本
是否给出了整个批次的ssim张量,下一行将其平均为单个批次的ssim值?