2017-01-16 16 views
5

としての内部層出力を必要とする関数は、入力として(y_true、y_pred)だけでなく、内部層からの出力を使用する必要がある私の損失関数をカスタマイズしたいネットワークは出力レイヤーのラベルとして使用されます。この図は、Kerasのカスタマイズされた損失の実装ケラスのラベル

を示しています。ここで、内部出力は1D特徴ベクトルであるxnです。右上隅の出力はxn 'であり、xnの予測値である。つまり、xnはxn 'のラベルです。

[Ax、Ay]は伝統的にy_trueとして知られており、[Ax '、Ay']はy_predです。

これらの2つの損失コンポーネントを1つにまとめ、ネットワークを共同してトレーニングしたいと考えています。

アイデアや考えは大変ありがとうございます。

答えて

0

まず、Functional APIを使用してください。次に、ネットワーク出力を出力に加えて内部レイヤーからの結果として定義し、連結して単一の出力にマージし、次にマージされた出力を2つの部分に分割して損失計算を行うカスタム損失関数を作成する必要がありますそのままで。

ような何か:私は道を考え出した

def customLoss(y_true, y_pred): 
    #loss here 
    internalLayer = Convolution2D()(inputs) #or other layers 
    internalModel = Model(input=inputs, output=internalLayer) 
    tmpOut = Dense(...)(internalModel) 
    mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1) 
    fullModel = Model(input=inputs, output=mergedOut) 

    fullModel.compile(loss = customLoss, optimizer = "whatever") 
+0

ありがとう!私の主な関心事は、私の損失機能の形成方法です。はい、両方の出力を1つにまとめることはできますが、内部出力(xn ')の損失を計算するときは、内部出力(xn)のラベルを取得するためにモデル自体にアクセスする必要があります。 xnは訓練データではなく、モデルによって処理された訓練データのある種の変換である。 – ljklonepiece

+0

@LiJuekunは、フィットするために渡すy値に「内部ラベル」を入れることはできませんか? –

7

は、誰もが同じを探している場合には、私は(この記事では、特定のネットワークに基づいて)ここに掲載:

考えられるのは、カスタマイズされた損失関数を定義し、それをネットワークの出力として使用することです。 (表記:Aは変数Aの真のラベルであり、そしてA'は、変数Aの予測値である)ご返信用

def customized_loss(args): 
    #A is from the training data 
    #S is the internal state 
    A, A', S, S' = args 
    #customize your own loss components 
    loss1 = K.mean(K.square(A - A'), axis=-1) 
    loss2 = K.mean(K.square(S - S'), axis=-1) 
    #adjust the weight between loss components 
    return 0.5 * loss1 + 0.5 * loss2 

def model(): 
    #define other inputs 
    A = Input(...) # define input A 
    #construct your model 
    cnn_model = Sequential() 
    ... 
    # get true internal state 
    S = cnn_model(prev_layer_output0) 
    # get predicted internal state output 
    S' = Dense(...)(prev_layer_output1) 
    # get predicted A output 
    A' = Dense(...)(prev_layer_output2) 
    # customized loss function 
    loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S']) 
    model = Model(input=[...], output=[loss_out]) 
    return model 

    def train(): 
     m = model() 
     opt = 'adam' 
     model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt) 
     # train the model 
     .... 
+0

これはしばらく静かだったことは分かっていますが、AとA 'が何​​であるか説明できますか? A 'はAの予測ですか? Aは実際に期待される結果でなければならないのですが、値をとる数値配列の代わりに入力として定義されるのはなぜですか? – tryingtolearn

関連する問題