質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

0回答

1117閲覧

Python DL 自然言語処理 文章分類

退会済みユーザー

退会済みユーザー

総合スコア0

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2021/12/20 12:25

編集2021/12/20 12:54

ゼロから作る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の計算ができるか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問