シンプルなニューラルネットワークに問題があります。私は映画のレビューを表す入力として疎ベクトルを持っています。私はsklearnのCountVectorizerでこれらのベクトルを生成しました。各ベクトルのサイズは5000です。
いくつかのレビューを繰り返した後、私は警告を受け取ります。
シグモイド関数の一部であるnp.expでオーバーフローが発生しました。私はnp.exp-警告が前方伝播におけるSYN1とL1の乗算後に大きな値によって引き起こされたことが、分かった
数回の反復後のニューラルネットワークが立ち往生し、常に同じエラー値
を生成します。
ネットのさまざまなレイヤーで値を正規化しようとしましたが、それから数回反復した後に が再びスタックしました。
誰も私を助けて、私のコードで何が間違っているのか教えてください。
ありがとうございました。NNが立ち往生し、np.expのオーバーフローが発生する
def sigmoid(x):
output = 1/(1 + np.exp(-x))
return output
def sigmoid_output_to_derivate(x):
return x * (1 - x)
if __name__ == "__main__":
with open("train_data_20.pkl", "rb") as fid:
train_data_features = pickle.load(fid)
with open("train_labels_20.pkl", "rb") as fid_train:
train_labels = pickle.load(fid_train)
with open("test_data_20.pkl", "rb") as fid_test:
test_data_features = pickle.load(fid_test)
with open("test_labels_20.pkl","rb") as fid_l:
test_labels = pickle.load(fid_l)
x = train_data_features[:2500]
y = np.reshape(train_labels[:2500], (-1,1))
np.random.seed(1)
syn0 = 2*np.random.random((5000,6000))-1
syn1 = 2*np.random.random((6000,1))-1
for i in range(1000):
l0 = x
#l0 = l0/np.linalg.norm(l0)
l1 = sigmoid(np.dot(l0,syn0))
l2 = sigmoid(np.dot(l1,syn1))
l2_error = y - l2
error_mean = np.mean(np.abs(l2_error))
print("Error: ", str(error_mean))
l2_delta = l2_error * sigmoid_output_to_derivate(l2)
l1_error = np.dot(l2_delta, syn1.T)
l1_delta = l1_error * sigmoid_output_to_derivate(l1)
syn1 += np.dot(l1.T, l2_delta)
syn0 += np.dot(l0.T, l1_delta)