私はニューラルネットワークを学習しています。私は関数cross_entropy
をpythonで書いています。それはクロスエントロピー関数(python)
、k
と定義されるクラスの数、log
は自然対数であり、試料i
が他クラスj
と0
であればt_i,j
は1でありますp_i,j
は、サンプルi
がクラスj
にある予測された確率です。 対数の数値問題を回避するには、予測値を[10^{−12}, 1 − 10^{−12}]
の範囲にクリップします。
上記の説明によれば、私は、予測をclippintでコードをの範囲に書き留め、次に上記の式に基づいてクロスエントロピーを計算します。
def cross_entropy(predictions, targets, epsilon=1e-12):
"""
Computes cross entropy between targets (encoded as one-hot vectors)
and predictions.
Input: predictions (N, k) ndarray
targets (N, k) ndarray
Returns: scalar
"""
predictions = np.clip(predictions, epsilon, 1. - epsilon)
ce = - np.mean(np.log(predictions) * targets)
return ce
次のコードは、機能がcross_entropy
であるかどうかを確認するために使用されます。
predictions = np.array([[0.25,0.25,0.25,0.25],
[0.01,0.01,0.01,0.96]])
targets = np.array([[0,0,0,1],
[0,0,0,1]])
ans = 0.71355817782 #Correct answer
x = cross_entropy(predictions, targets)
print(np.isclose(x,ans))
上記のコードの出力は、それがcross_entropy
が正しくない関数を定義するための私のコードを言うために、Falseです。次に、cross_entropy(predictions, targets)
の結果を出力します。それは0.178389544455
を与え、正しい結果はans = 0.71355817782
であるはずです。誰かが私のコードの問題点を確認するのを手伝ってもらえますか?