自定义keras损失函数,其中包含输出函数

时间:2018-12-04 09:26:41

标签: python machine-learning keras

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

我的神经网络接受一些输入,并给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))

您有任何想法该如何实施吗?

谢谢
查尔斯

1 个答案:

答案 0 :(得分:0)

希望我的尺寸正确-

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与样本行(而不是列)配合得很好,您需要交换meansnap的尺寸。
完成此操作并执行函数中的predFields行之后,您将具有以下内容:

  • snapT:形状为(N,m)
  • predFields:形状为(N,m),其中每一行i对应于g_i(x)phi_i(x)

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

请注意,我已经假设column i中的每个snap都属于预测中的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))

如果我仍然没有得到您想要的东西,一些示例输入和输出可能会有所帮助。