我正在处理一个特定的问题,我需要实现一个非常特殊的损失函数。这里有一些解释:假设我有一些名为的快照,的每一列都对应一个快照。 某些模式称为。 的每一列都对应一个模式。
我的神经网络接受一些输入,并给N个输出说。
我要在Keras中实现的自定义损失函数如下:
和
最后,问题可以看作是
对于的每一列(即每个快照),也会测量一些传感器,即
使用测量传感器,将快照重建为
该算法的目标是找到最佳的神经网络,使得 接近
实际上我有类似的东西:
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))
您有任何想法该如何实施吗?
谢谢
查尔斯
答案 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与样本行(而不是列)配合得很好,您需要交换mean
和snap
的尺寸。
完成此操作并执行函数中的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))
如果我仍然没有得到您想要的东西,一些示例输入和输出可能会有所帮助。