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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

深層学習

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

314閲覧

chainerによるLSTM設計の際のデータの扱い方について

futashige

総合スコア28

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

深層学習

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2017/12/17 16:16

現在、x_train.shape = (10000,10)としたデータを用いています。
モデルは以下のようなものです。

python

1class ChainLSTM(Chain): 2 def __init__(self): 3 super(ChainLSTM, self).__init__( 4 l1 = L.Linear(1, 5), 5 b1 = L.BatchNormalization(5), 6 lstm1 = L.LSTM(5, 5), 7 b2 = L.BatchNormalization(5), 8 l2 = L.Linear(5, 5), 9 l3 = L.Linear(1, 5), 10 l4 = L.Linear(5, 1) 11 ) 12 13 def __call__(self, x, t): 14 y = self.fwd(x) 15 return F.mean_squared_error(y, t) 16 17 def fwd(self,x): 18 for i in range(9): 19 h = self.b1(F.relu(self.l1(x[i]))) 20 h = self.b2(self.lstm1(h)) 21 h = F.relu(self.l3(x[-1]) + self.l2(h)) 22 h = F.dropout(h) 23 h = self.l4(h) 24 return F.sigmoid(h) 25

fwdにおいて、一つのdataに含まれる10個の時系列データに対して、順にアクセスをしたいのですが、以下のようなエラーが出ます。

python

1 x_type.shape[1] == w_type.shape[1], 2IndexError: tuple index out of range

原因としては、そもそものデータの型(reshapeの仕方)がおかしい・fwdにおけるxへのアクセスの仕方がおかしい などなのではないかと考えていますが、修正の仕方がわかりません。
ご教授いただけると助かります。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

通常の配列のようにスライスでアクセスすることで解決できました。申し訳ありません。

投稿2018/02/22 14:20

futashige

総合スコア28

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

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

0

入力がx_train.shape = (10000,10)なのだとすると、

python

1 h = self.b1(F.relu(self.l1(x[i])))

上記でself.l1に入力されるデータ1次元になるので、x[i].shape == (10,)になってインデックスエラーになっているのだと思います。

投稿2017/12/18 01:12

diningyo

総合スコア379

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

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

futashige

2017/12/18 01:32

どのようにすれば、10個の時系列データが入っているxに対して順番にアクセスすることができるのでしょうか? (ご指摘の部分は、x = [0,1,2,3,4,5,6,7,8,9] とした時に、x[2] = 2 のようなアクセスを考えたつもりでした。)
diningyo

2017/12/18 02:00

とりあえず、このまま動かすということであれば、Linearの__call__関数に流すxを(batch_size, data)の2次元にしてください。 上記のネットワークのl1に合うようにするなら、x[i].reshape(1, -1)ですかね。 何を狙ってるのかがよくわかってないですが。。
futashige

2017/12/18 13:12

fwd内で、x[i]→x[i].reshape(1, -1) の変更を行ったところ以下のようなエラーがでました。 Invalid operation is performed in: LinearFunction (Forward) Expect: in_types[0].shape[1] == in_types[1].shape[1] Actual: 10 != 1
diningyo

2017/12/18 13:25 編集

あーー、たしかに、間違ってますね、すみません。。。 どう扱いたいのかがあるので、意図した形にご自身で直して頂く必要はありますが、Linear.__call__に渡すxの形が(N, 1)になるようにreshape関数使って変形、もしくはx自体をバラして入力して貰う必要がありますね。
futashige

2017/12/19 01:28

行いたいことは、fwd内でxの各要素にアクセスすることです。この場合、x[i]のような表記は間違っているのでしょうか?
diningyo

2017/12/19 02:14

それだと、次元が落ちてLinear.__call__関数の仕様に合わないので、それ相応の加工をしてください。 ということです。
futashige

2017/12/19 06:12

どのように加工すれば良いのでしょうか?
diningyo

2017/12/19 07:05

上に書いて有ること組み合わせれば出来ると思いますが。。。 今の形で行くなら、新しくnumpy.array用意して要素1つずつ入れれば動かすことは出来ます。 速度は遅いでしょうけど。
futashige

2017/12/23 13:58

要素はどのようにしてアクセスすれば良いのでしょうか。(chainerのtuple_datasetの仕組みがよくわかりません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問