簡體   English   中英

自定義keras損失函數,其中包含輸出函數

[英]Custom keras loss function which contains a function of the outputs

我正在處理一個特定的問題,我需要實現一個非常特殊的損失函數。 這里有一些解釋:假設我有一些快照稱為 ,每列 對應於快照。 某些模式稱為 每列 對應於一個模式。

我的神經網絡需要一些輸入 並給出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))

您有任何想法如何實施?

謝謝
查爾斯

希望我的尺寸正確-

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)與樣本的行(而不是列)配合得很好,因此您需要交換meansnap的尺寸。
完成此操作並在函數中執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM