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

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

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

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

深層学習

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

Python 3.x

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

機械学習

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

Q&A

解決済

1回答

2287閲覧

chainerによるCNN構築時のエラーに対処できません。

futashige

総合スコア28

Chainer

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

深層学習

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

Python 3.x

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

機械学習

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

0グッド

0クリップ

投稿2017/12/10 05:47

現在、CNNを用いて画像の2値分類を実行しようとしています。
画像は縦5横20チャンネル数3で、それぞれに0か1が割り当てられています。
またそれぞれの画像は1枚ずつあります(訓練データの数は2つ)。
実行したコードは下記のものです。

python

1class MyChain(Chain): 2 def __init__(self): 3 super(MyChain, self).__init__( 4 cn1 = L.Convolution2D(3,8,(2,3),stride=1,pad=1), 5 cn2 = L.Convolution2D(8,16,(2,3),stride=1,pad=1), 6 l1 = L.Linear(160,100), 7 l2 = L.Linear(100,2) 8 ) 9 10 def __call__(self,x,t): 11 return F.softmax_cross_entropy(self.fwd(x),t) 12 13 def fwd(self,x): 14 h1 = F.max_pooling_2d(F.relu(self.cn1(x)),2) #8*3*10 15 h2 = F.max_pooling_2d(F.relu(self.cn2(h1)),2) #16*2*5 16 h3 = F.dropout(F.relu(self.l1(h2))) 17 return self.l2(h3) 18 19xtrain, ytrain = mydata_chainer() 20 21model = MyChain() 22optimizer = optimizers.Adam() 23optimizer.setup(model) 24 25train = datasets.tuple_dataset.TupleDataset(xtrain, ytrain) 26 27iterator = iterators.SerialIterator(train, 2) 28updater = training.StandardUpdater(iterator, optimizer) 29trainer = training.Trainer(updater, (1000, 'epoch')) 30 31trainer.extend(extensions.ProgressBar()) 32trainer.run() 33

また、xtrain,ytrainは、下記のようになっています。

python

1xtrain.shape = (2, 3, 5, 20) 2ytrain.shape = (2, 1)

上記のコードを実行すると以下のようなエラーが発生してしまいます。

python

1Exception in main training loop: 2Invalid operation is performed in: SoftmaxCrossEntropy (Forward) 3 4Expect: in_types[1].dtype.kind == i 5Actual: f != i 6Traceback (most recent call last): 7 File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 299, in run 8 update() 9 File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 223, in update 10 self.update_core() 11 File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 234, in update_core 12 optimizer.update(loss_func, *in_arrays) 13 File "/usr/local/lib/python3.6/site-packages/chainer/optimizer.py", line 534, in update 14 loss = lossfun(*args, **kwds) 15 File "MyChain.py", line 26, in __call__ 16 return F.softmax_cross_entropy(self.fwd(x),t) 17 File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 380, in 18 softmax_cross_entropy 19 normalize, cache_score, class_weight, ignore_label, reduce)(x, t) 20 File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 226, in __call__ 21 ret = node.apply(inputs) 22 File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 228, in apply 23 self._check_data_type_forward(in_data) 24 File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 296, in _check_data_type_forwa 25rd 26 self.check_type_forward(in_type) 27 File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 126, in check_type_forward 28 self._function.check_type_forward(in_types) 29 File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 77, in 30check_type_forward 31 x_type.shape[2:] == t_type.shape[1:], 32 File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 519, in expect 33 expr.expect() 34 File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 477, in expect 35 '{0} {1} {2}'.format(left, self.inv, right)) 36Will finalize trainer extensions and updater before reraising the exception. 37Traceback (most recent call last): 38 File "MyChain.py", line 52, in <module> 39 trainer.run() 40 File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 313, in run 41 six.reraise(*sys.exc_info()) 42 File "/usr/local/lib/python3.6/site-packages/six.py", line 693, in reraise 43 raise value 44 File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 299, in run 45 update() 46 File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 223, in update 47 self.update_core() 48 File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 234, in update_core 49 optimizer.update(loss_func, *in_arrays) 50 File "/usr/local/lib/python3.6/site-packages/chainer/optimizer.py", line 534, in update 51 loss = lossfun(*args, **kwds) 52 File "MyChain.py", line 26, in __call__ 53 return F.softmax_cross_entropy(self.fwd(x),t) 54 File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 380, in 55 softmax_cross_entropy 56 normalize, cache_score, class_weight, ignore_label, reduce)(x, t) 57 File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 226, in __call__ 58 ret = node.apply(inputs) 59 File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 228, in apply 60 self._check_data_type_forward(in_data) 61 File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 296, in _check_data_type_forwa 62rd 63 self.check_type_forward(in_type) 64 File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 126, in check_type_forward 65 self._function.check_type_forward(in_types) 66 File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 77, in 67check_type_forward 68 x_type.shape[2:] == t_type.shape[1:], 69 File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 519, in expect 70 expr.expect() 71 File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 477, in expect 72 '{0} {1} {2}'.format(left, self.inv, right)) 73chainer.utils.type_check.InvalidType: 74Invalid operation is performed in: SoftmaxCrossEntropy (Forward) 75 76Expect: in_types[1].dtype.kind == i 77Actual: f != i

おそらくデータの整形に問題があるのではないかとは思うのですが、どこが間違っているのかがわかりません。
どのようにすればこのエラーを回避できるのでしょうか?
わかりにくい点も多いかもしれませんが、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

修正:このコメントは正しくありません。
(ytrain.shape = (2, 1)

l2 = L.Linear(100,2)
が相容れないせいではないでしょうか。)

追記:
SoftmaxCrossEntropyはnp.int32を教師データに要求します。
tに代入される部分を.astype('i')に変換しておく必要があります。
https://docs.chainer.org/en/stable/reference/generated/chainer.functions.softmax_cross_entropy.html
例を見ると型の変換がありました。


python

1import numpy as np 2 3from chainer import Link, Chain, ChainList 4import chainer.functions as F 5import chainer.links as L 6from chainer import optimizers, datasets, iterators, training 7from chainer.training import extensions 8 9class MyChain(Chain): 10 def __init__(self): 11 super(MyChain, self).__init__( 12 cn1=L.Convolution2D(3, 8, (2, 3), stride=1, pad=1), 13 cn2=L.Convolution2D(8, 16, (2, 3), stride=1, pad=1), 14 l1=L.Linear(160, 100), 15 l2=L.Linear(100 ,2) 16 ) 17 18 def __call__(self, x, t): 19 pt = self.fwd(x) 20 return F.softmax_cross_entropy(pt, t) 21 22 def fwd(self, x): 23 h1 = F.max_pooling_2d(F.relu(self.cn1(x)), 2) #8*3*10 24 h2 = F.max_pooling_2d(F.relu(self.cn2(h1)), 2) #16*2*5 25 h3 = F.dropout(F.relu(self.l1(h2))) 26 h4 = self.l2(h3) 27 return h4 28 29xtrain = np.random.random((2, 3, 5, 20)).astype('f') 30ytrain = np.random.randint(2, size=(2, 1)) 31ytrain = np.hstack((ytrain, 1-ytrain)) 32ytrain = np.argmax(ytrain, axis=1).astype('i') 33 34model = MyChain() 35optimizer = optimizers.Adam() 36optimizer.setup(model) 37 38train = datasets.tuple_dataset.TupleDataset(xtrain, ytrain) 39 40iterator = iterators.SerialIterator(train, 2) 41updater = training.StandardUpdater(iterator, optimizer) 42trainer = training.Trainer(updater, (1000, 'epoch')) 43 44trainer.extend(extensions.ProgressBar()) 45trainer.run()

投稿2017/12/10 09:02

編集2017/12/10 10:57
mkgrei

総合スコア8560

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

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

futashige

2017/12/10 09:07

SoftMaxCrossEntoropyではytrainは正解のインデックスを指定するのではないのですか?
mkgrei

2017/12/10 09:12

仰るとおりですが、今のyは2つデータがあって、それぞれには要素が1つしかありません。 それに対して、モデルの方は2値分類を想定しています。 結論としてはytrainに対してOneHotエンコーディングを施す必要があります。
futashige

2017/12/10 09:28

ytrainをOneHotエンコーディングしたところ、 xtrain.shape = (2, 3, 5, 20) ytrain.shape = (2, 2)となりました。 しかし、下記のようなエラーが新たに発生してしまいました。 Invalid operation is performed in: SoftmaxCrossEntropy (Forward) Expect: in_types[1].ndim == in_types[0].ndim - 1 Actual: 2 != 1 これはどのようなことを意味しているのでしょうか?
mkgrei

2017/12/10 10:53

失礼しました。 ChainerはOneHotエンコーディングが必要ありませんでした。 その代わりにはじめのエラーは型の違いによるものでした。 softmaxcrossentropyはnp.int32をyに求めます。 ですので、 ytrain = ytrain.astype('i') するとうまくいくはずです。
futashige

2017/12/10 12:29

変更を行い、データの型は下記のようになりました。 xtrain.shape = (2, 3, 5, 20) ytrain.shape = (2, 1) xtrain.type = float32 ytrain.type = int32 しかしながら、下記のエラーが消えませんでした。 Invalid operation is performed in: SoftmaxCrossEntropy (Forward) Expect: in_types[1].ndim == in_types[0].ndim - 1 Actual: 2 != 1 これは、ytrainの成型が原因でしょうか。 ytrainのコードは次のようになっています。 ytrain = np.empty((1,1),dtype=np.int32) #データについて下記をfor文で回す ytrain = np.vstack((ytrain,np.array([1],dtype=np.int32))) ytrain = np.vstack((ytrain,np.array([0],dtype=np.int32))) # ytrain = ytrain[1:]
mkgrei

2017/12/10 13:00

ytrain = ytrain.reshape(-1) ytrain.shapeは(2,)である必要があります。
futashige

2017/12/10 13:22

無事に動作するようになりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問