ゼロから作るDeep Learning ❷――自然言語処理編でDeepLearningによる自然言語処理を学習中です。
現在LiveDoorのニュースコーパスの文章分類に挑戦しています。
色々な情報を参考にしながらコードを作成しているのでが、エラーが出てしまい、行き詰まっている状況です。
全体のコードは長いので怪しい関数やクラスのみを載せます。
他に見たいコードがあれば仰っていただけますと幸いです。
どうかお力をお貸しいただけると助かります。
よろしくお願いします。
前提・実現したいこと
最終的には正常に学習を進むようにしたいです。
発生している問題・エラーメッセージ
現在のコードで発生しているエラーは以下ですが、
axisの指定を変えたり色々と試しても別の箇所でエラーが出るため
ネットワークかTimeクラスかdatasetの作成方法が悪いと思っています。
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) /tmp/ipykernel_344/3488387848.py in <module> 21 #total_rnn_loss += rnn_loss*len(X_batch) 22 ---> 23 lstm_loss = lstm_model.forward(X_batch, T_batch) 24 lstm_model.backward() 25 optimizer2.update(lstm_model.params, lstm_model.grads) /tmp/ipykernel_344/3951171937.py in forward(self, xs, ts) 30 def forward(self, xs, ts): 31 xs = self.predict(xs) ---> 32 loss = self.loss_layer.forward(xs, ts) 33 return loss 34 /tmp/ipykernel_344/877901989.py in forward(self, x, t) 69 self.t = self.t.argmax(axis=0) 70 ---> 71 loss = cross_entropy_error(self.y, self.t) 72 return loss 73 /tmp/ipykernel_344/689892580.py in cross_entropy_error(y, t) 26 batch_size = y.shape[0] 27 ---> 28 return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size IndexError: index 5 is out of bounds for axis 1 with size 1
datasetの形式
labelはOneHotではなく0~8のラベルとしています。
print(data[0]) > {'text': ['ジューン', 'ブライド', ...(略)..., 'サイト'], 'label': '0'}
print(data[7365]) > {'text': ['米', '紙', ...(略)..., '主張'], 'label': '8'}
Timeクラス
Python
1class TimeLSTM: 2 def __init__(self, input_size, output_size, stateful=False): 3 D,H = input_size, output_size 4 rn = np.random.randn 5 np.random.seed(0) 6 Wx = (rn(D, 4 * H) / np.sqrt(D)).astype('f') 7 Wh = (rn(H, 4 * H) / np.sqrt(H)).astype('f') 8 b = np.zeros(4 * H).astype('f') 9 self.params = [Wx, Wh, b] 10 self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] 11 self.layers = None 12 self.h, self.c = None, None 13 self.dh = None 14 self.stateful = stateful 15 self.input_shapes = None 16 17 def forward(self, xs): 18 Wx, Wh, b = self.params 19 N, T, D = xs.shape 20 H = Wh.shape[0] 21 self.input_shapes = [N,T,D] 22 self.layers = [] 23 hs = np.empty((N, T, H), dtype='f') 24 if not self.stateful or self.h is None: 25 self.h = np.zeros((N, H), dtype='f') 26 if not self.stateful or self.c is None: 27 self.c = np.zeros((N, H), dtype='f') 28 for t in range(T): 29 layer = LSTM(*self.params) 30 self.h, self.c = layer.forward(xs[:, t, :], self.h, self.c) 31 hs[:, t, :] = self.h 32 self.layers.append(layer) 33 return hs 34 35 def backward(self, dhs): 36 Wx, Wh, b = self.params 37 H = Wh.shape[0] 38 N, T, D = self.input_shapes 39 if dhs.ndim == 2: 40 temp = np.zeros((N,T,H)) 41 temp[:,-1,:] = dhs 42 dhs = temp 43 N, T, H = dhs.shape 44 dxs = np.empty((N, T, D), dtype='f') 45 dh, dc = 0, 0 46 grads = [0, 0, 0] 47 for t in reversed(range(T)): 48 layer = self.layers[t] 49 dx, dh, dc = layer.backward(dhs[:, t, :] + dh, dc) 50 dxs[:, t, :] = dx 51 for i, grad in enumerate(layer.grads): 52 grads[i] += grad 53 for i, grad in enumerate(grads): 54 self.grads[i][...] = grad 55 self.dh = dh 56 return dxs 57 58 def set_state(self, h, c=None): 59 self.h, self.c = h, c 60 def reset_state(self): 61 self.h, self.c = None, None
Embedding
EmbedderにはFasttextを使用しています。
Python
1if os.path.exists('fasttext.model'): 2 model = KeyedVectors.load_word2vec_format('fasttext.model') 3else: 4 model = KeyedVectors.load_word2vec_format('cc.ja.300.vec.gz', binary=False) 5 model.save_word2vec_format('fasttext.model')
Python
1def embed_one_word_via_model(word, model): 2 try: 3 return model[word] 4 except: 5 return np.zeros(model.vector_size)
Python
1embedding = [] 2labels = [] 3for d in data: 4 embedding.append(np.array([embed_one_word_via_model(word,model) for word in d['text']])) 5 labels.append(int(d['label'])) 6embedding = np.array(embedding) 7labels = np.array(labels) 8 9X_train, X_test, T_train, T_test = train_test_split(embedding, labels, random_state=0)
ネットワーク
Python
1class SimpleLSTMlm: 2 def __init__(self, wordvec_size, hidden_size): 3 D, H = wordvec_size, hidden_size 4 rn = np.random.randn 5 np.random.seed(0) 6 7 # 重みの初期化 8 rnn_Wx = (rn(D, 4*H) / np.sqrt(D)).astype('f') 9 rnn_Wh = (rn(H, 4*H) / np.sqrt(H)).astype('f') 10 rnn_b = np.zeros(4*H).astype('f') 11 affine_W = (rn(H, 1) / np.sqrt(H)).astype('f') 12 affine_b = np.zeros(1).astype('f') 13 14 # レイヤの生成 15 self.layers = [ 16 TimeLSTM(D, H, stateful=False), 17 Affine(affine_W, affine_b) 18 ]#文章分類で最後の出力だけ受け取るためAffineはTimeAffineではありません。 19 self.loss_layer = SoftmaxWithLoss() 20 #self.embed_layer = self.layers[0] 21 self.rnn_layer = self.layers[0] 22 self.affine_layer = self.layers[1] 23 24 # すべての重みと勾配をリストにまとめる 25 self.params, self.grads = [], [] 26 for layer in self.layers: 27 self.params += layer.params 28 self.grads += layer.grads 29 30 def forward(self, xs, ts): 31 xs = self.predict(xs) 32 loss = self.loss_layer.forward(xs, ts) 33 return loss 34 35 def predict(self, xs): 36 #xs = self.embed_layer.forward(xs) 37 xs = self.rnn_layer.forward(xs)[:, -1, :]#最後の出力 38 xs = self.affine_layer.forward(xs) 39 return xs 40 41 def backward(self, dout=1): 42 dout = self.loss_layer.backward(dout) 43 for layer in reversed(self.layers): 44 dout = layer.backward(dout) 45 return dout 46 47 def reset_state(self): 48 self.rnn_layer.reset_state()
試したこと
detasetのlabelを数値に変更
datasetの単語数変更(30, 100単語)
エラーが出る直前のx, xs, tsなどのprintで内容の確認、 shapeでサイズの確認, 調整など
axisの指定変更
TimeAffine→Affineに変更
Embeddingの削除
OneHote用処理のコメントアウト
気になること
参考にしているコードが次の単語を予測するネットワークなので、最後の出力から分類をするネットワークになっているか
cross_entropy_errorのy(予測)が0.00xx程度のfloatでt(教師ラベル)が0~8のintだが正常にlossの計算ができるか
あなたの回答
tips
プレビュー