包含输出函数的自定义keras损失函数

2024-04-26 11:10:01 发布

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

我正在处理一个特定的问题,我需要实现一个非常特殊的损失函数。这里有一些解释:假设我有一些名为的快照,的每一列对应一个快照。 还有一些模式叫做的每一列对应一个模式。你知道吗

我的神经网络接受一些输入,然后给出N个输出,比如。你知道吗

我想在Keras中实现的自定义损失函数如下:

这样,和

最后,问题可以看作是

  1. 对于的每一列,即每个快照,也测量一些传感器,即

  2. 使用测量传感器,将快照重建为

  3. 该算法的目标是找到最佳的神经网络,使得 接近


事实上,我有这样的想法:

def customLoss(modes,snap):
    def diff(y_true,y_pred):
        predField=modes[:,0]*y_pred[...,0]
        for ii in range(1,modes.shape[1]):
            predField+=modes[:,ii]*y_pred[...,ii]

        realData=#I don t know how can I extract from snap the correct columns

        return K.sum(K.square(predField-realData))

    return diff

一些虚拟数据如下所示:

m=100
n=10000
N=30
ns=8

snap=np.random.rand((m,n))
modes=np.random.rand((m,N))
x=np.random.rand((ns,n))

你有什么办法让我实现这个目标吗?你知道吗

谢谢
查尔斯


Tags: 函数目标np模式神经网络random传感器快照
1条回答
网友
1楼 · 发布于 2024-04-26 11:10:01

希望我没弄错你的尺寸-

def customLoss(modes, snap):
    modesT = K.transpose(modes) #We want to switch row-columns
    snapT = K.transpose(snap) # As y_pred is Nx1.

    def diff(y_true, y_pred):
        predFields = modesT * y_pred #This will result in Nxm, where each row is g_i(x_i)phi_i(x_i)
        return K.sum(K.square(snapT - predFields))
    return diff

由于预测以(Batchsize, features)的形式返回,并且Keras很好地处理sample的行,而不是列,因此需要交换meansnap的维度。
完成此操作并执行函数中的predFields行之后,您将拥有以下内容:

  • snapT:形状(N,m)
  • predFields:形状(N,m),其中每行i对应g_i(x)phi_i(x)。你知道吗

由于这两个矩阵的形状相同,因此它们之间的简单相减,snapT中的每一行将被predFields中的正确行减去。

注意,我假设来自snap的每个column i“属于”来自预测的样本i
下面是一个玩具示例,我测试了这个设置:

from keras import backend as K
import tensorflow as tf
import numpy as np

def customLoss(modes, snap):
    modesT = K.transpose(modes) #We want to switch row-columns
    snapT = K.transpose(snap) # As y_pred is Nx1.

    def diff(y_true, y_pred):
        predFields = modesT * y_pred #This will result in Nxm, where each row is g_i(x_i)phi_i(x_i)
        return K.sum(K.square(snapT - predFields))
    return diff

m = 3
N = 9

snapshot = np.random.randint(0,100, size =(m,N))
modes = np.random.randint(1,10, size = (m,N))

ytrue = np.arange(0,N).reshape((-1,1))
ypred = np.arange(0,N).reshape((-1,1))

loss = customLoss(modes,snapshot)

with tf.Session() as sess:
    x = loss(ytrue,ypred)
    print (sess.run(x))

如果我还没有得到你想要的东西,一些示例输入和输出可能会有所帮助。你知道吗

相关问题 更多 >