2017-08-04 8 views
0

タイトルがあまりにも特定的かもしれないし、これは他のコスト関数にも当てはまるかもしれません。基本的に私は(私の場合、私は非常に異なるアーキテクチャを持っていますが、問題は常に複製されます)以下のようにダミーのセットアップを持っている:Keras binary_crossentropyコスト関数大規模ネットワークでシステマティックエラー

hidden_units=10000 

l2_sparsity = 5e-7 
l1_sparsity = 1e-8 
mod=Sequential([Dense(hidden_units, input_shape = (1000,), activation="relu", kernel_regularizer=l1_l2(l1=l1_sparsity, l2=l2_sparsity), 
        ), 
       Dense(hidden_units, activation="relu", kernel_regularizer=l1_l2(l1=l1_sparsity, l2=l2_sparsity), 
        ), 
       Dense(1000, activation="sigmoid", 
         ) 
    ]) 
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0) 
mod.compile(loss='binary_crossentropy', optimizer=adam, metrics=['binary_accuracy']) 



x = np.array([np.array([random.random() for i in range(1000)], dtype=np.float64) for i in range(10)]) 
classes = (x + 0.5).astype(np.uint32) 

def replica_cross_entropy_loss(predictions, truth): 
    eps=10e-8 

    predictions = np.clip(predictions, eps, 1.0-eps) 
    x = np.log(1.0 *predictions/(1.0 - predictions)) 

    return np.mean(np.clip(x, 0, None) - x * truth + np.log(1 + np.exp(-abs(x)))) 

mod.fit(x[:2],classes[:2], batch_size=128, epochs=1) 



preds = mod.predict(x[:2]) 
print replica_cross_entropy_loss(preds,classes[:2]) 
print mod.test_on_batch(x[:2],classes[:2])[0] 
print 100*(mod.test_on_batch(x[:2],classes[:2])[0]/
replica_cross_entropy_loss(preds,classes[:2]) - 1) 

私がここでやっている何を(に内蔵のkeras損失を比較しています私は信じている)numpyを使用して忠実な再建。ここで概説したmlpアーキテクチャの隠れユニットを実験すると、興味深い結果が得られます。具体的には:

kerasコスト関数は 隠れ層のニューロンの数に関連する差で、numpyの 等価より系統的に高いです。実例として

、ここkerasコスト関数のPCTの過大評価対このMLPの隠れ層のニューロンの数をプロットする簡単なグラフである:

enter image description here

私が言うべきこれはバックエンドに依存しないと思われ、theanoとtensorflowの両方に影響します。

この動作から判断すると、精度の問題があるようです。これを緩和する方法があるかどうか分かりますか?私の実際のモデルはコスト関数がnumpyの回答と一貫して5-10%異なります

+0

'x = mod.predict(x [:2])'という行は間違いだと思います。それは比較を基本的に無意味にし、結論はまったく意味がありません。 –

+1

ケルナ損失関数とそれに相当するnumpyの関数を比較するネットワークは必要ありません。単に 'replica_cross_entropy_loss(a、b)'と 'K.eval(K.mean(K.binary_crossentropy(K.variable(a)、K.variable(b))))' 'の出力を' a、bあなたは答えを見つけるでしょう。 –

+0

より合理的なテストに編集され、私はまだ同じ動作を見つけます – user3684792

答えて

0

2つのコスト関数の間に正則化の用語の違いがありましたパフォーマンス評価に役立つものではない

関連する問題