[英]Keras - Implementation of custom loss function with multiple outputs
[英]Custom keras loss function which contains a function of the outputs
我正在處理一個特定的問題,我需要實現一個非常特殊的損失函數。 這里有一些解釋:假設我有一些快照稱為 ,每列 對應於快照。 某些模式稱為 。 每列 對應於一個模式。
我的神經網絡需要一些輸入 並給出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))
您有任何想法如何實施?
謝謝
查爾斯
希望我的尺寸正確-
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)
恢復(Batchsize, features)
並且(Batchsize, features)
與樣本的行(而不是列)配合得很好,因此您需要交換mean
和snap
的尺寸。
完成此操作並在函數中執行predFields
行之后,您將具有以下內容:
snapT
:形狀(N,m)
predFields
:形狀為(N,m)
,其中每一行i
對應於g_i(x)phi_i(x)
。 由於兩個矩陣的形狀相同,因此它們之間的簡單相減以及snapT
每一行都將被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))
如果我仍然沒有得到您想要的東西,一些示例輸入和輸出可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.