在自动编码训练过程中,keras中的自定义丢失会产生误导性输出

2024-04-24 08:06:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大小为(100100,4)的3阶张量,我试图用自动编码器压缩和重建。我使用的是一个身体激励的损失函数。从数学上讲是的

L=—重叠(y|u真,y|u pred)+| 1—标准(y|u pred)^2 |

在代码中,它是这样写的:

def physical_loss(y_true,y_pred,norm=None):
    return - tf.tensordot(y_true,y_pred,axes=([0,1,2],[0,1,2])) + tf.math.abs(1 - tf.tensordot(y_pred,y_pred,axes=([0,1,2],[0,1,2])))

第一项是输入和输出张量之间的重叠(我想最大化),第二项保持输出张量不爆炸,最理想的是范数1(张量和自身之间的重叠=范数)。因此,理想情况下,损失降到-1(即y\u pred=y\u true,norm(y\u pred)=1)

我的模型是一个卷积自动编码器,它将大小缩小到(50,50,4),(25,25,4),然后重新构建。你知道吗

cnn.compile(loss=physical_loss,optimizer="adam")

cnn.fit(x_train, x_train, epochs=num_epochs, batch_size=16,validation_data=(x_train,x_train))

现在,当我训练我的cnn时,我的损失在16个时期内逐渐下降,最终达到valu loss=-0.67。但是当我手动检查结果时(即计算xïu列车和cnn.predict公司(我自己直接训练),平均得到0.75(阳性!)。你知道吗

那么我的问题是,在评估时keras/tensorflow输出是什么?

这可能是相关的或另一个问题,但当我cnn.评估(x_train,x_train,batch_size=x)结果在+0.88到-0.88之间变化,其值取决于我如何选择批量大小x(选择“无”时得到相同的-0.67,因此为32)。我知道keras做的每件事都是成批的,但这不应该改变整体的产出不是吗?这也使得很难解释输出/培训的成功。你知道吗


Tags: true范数normtftrain编码器cnnepochs
1条回答
网友
1楼 · 发布于 2024-04-24 08:06:30

我想我已经弄明白了,问题是keras/tensorflow需要一个已经矢量化的函数。上面的定义是针对秩3张量的,但是keras/tensorflow总是处理批,因此秩3张量的“列表”实际上不是列表而是秩4张量(第一个维度是“列表”)。你知道吗

我发现矢量化这个损失函数不是那么简单,但找到了一个可行的解决方案地图(函数,列出的张量,dtype),其中列出的张量是所提到的第4级批次。你知道吗

def single_eval(duo):
    return - tf.tensordot(duo[0],duo[1],axes=([0,1,2],[0,1,2])) + tf.keras.backend.abs(1 - tf.tensordot(duo[1],duo[1],axes=([0,1,2],[0,1,2])))

def physical_loss(y_true,y_pred,norm=None):
    return tf.map_fn(single_eval,(y_true,y_pred),dtype=(tf.float32))

为了能够使用元组作为参数(即使用两个参数),必须指定数据类型。你知道吗

相关问题 更多 >