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

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

ただいまの
回答率

91.06%

  • Python 3.x

    3700questions

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

  • 機械学習

    441questions

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

  • Chainer

    87questions

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

  • 深層学習

    85questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 461

futashige

score 19

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

class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            cn1 = L.Convolution2D(3,8,(2,3),stride=1,pad=1), 
            cn2 = L.Convolution2D(8,16,(2,3),stride=1,pad=1),
            l1 = L.Linear(160,100),
            l2 = L.Linear(100,2)
        )

    def __call__(self,x,t):
        return F.softmax_cross_entropy(self.fwd(x),t)

    def fwd(self,x):
        h1 = F.max_pooling_2d(F.relu(self.cn1(x)),2) #8*3*10
        h2 = F.max_pooling_2d(F.relu(self.cn2(h1)),2) #16*2*5
        h3 = F.dropout(F.relu(self.l1(h2)))
        return self.l2(h3)

xtrain, ytrain = mydata_chainer()

model = MyChain()
optimizer = optimizers.Adam()
optimizer.setup(model)

train = datasets.tuple_dataset.TupleDataset(xtrain, ytrain)

iterator = iterators.SerialIterator(train, 2)
updater = training.StandardUpdater(iterator, optimizer)
trainer = training.Trainer(updater, (1000, 'epoch'))

trainer.extend(extensions.ProgressBar())
trainer.run()


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

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


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

Exception in main training loop:
Invalid operation is performed in: SoftmaxCrossEntropy (Forward)

Expect: in_types[1].dtype.kind == i
Actual: f != i
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 299, in run
    update()
  File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 223, in update
    self.update_core()
  File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 234, in update_core
    optimizer.update(loss_func, *in_arrays)
  File "/usr/local/lib/python3.6/site-packages/chainer/optimizer.py", line 534, in update
    loss = lossfun(*args, **kwds)
 File "MyChain.py", line 26, in __call__
    return F.softmax_cross_entropy(self.fwd(x),t)
  File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 380, in
 softmax_cross_entropy
    normalize, cache_score, class_weight, ignore_label, reduce)(x, t)
  File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 226, in __call__
    ret = node.apply(inputs)
  File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 228, in apply
    self._check_data_type_forward(in_data)
  File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 296, in _check_data_type_forwa
rd
    self.check_type_forward(in_type)
  File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 126, in check_type_forward
    self._function.check_type_forward(in_types)
 File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 77, in
check_type_forward
    x_type.shape[2:] == t_type.shape[1:],
  File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 519, in expect
    expr.expect()
  File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 477, in expect
    '{0} {1} {2}'.format(left, self.inv, right))
Will finalize trainer extensions and updater before reraising the exception.
Traceback (most recent call last):
  File "MyChain.py", line 52, in <module>
    trainer.run()
  File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 313, in run
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python3.6/site-packages/six.py", line 693, in reraise
  raise value
  File "/usr/local/lib/python3.6/site-packages/chainer/training/trainer.py", line 299, in run
    update()
  File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 223, in update
    self.update_core()
  File "/usr/local/lib/python3.6/site-packages/chainer/training/updater.py", line 234, in update_core
    optimizer.update(loss_func, *in_arrays)
  File "/usr/local/lib/python3.6/site-packages/chainer/optimizer.py", line 534, in update
    loss = lossfun(*args, **kwds)
  File "MyChain.py", line 26, in __call__
    return F.softmax_cross_entropy(self.fwd(x),t)
  File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 380, in
 softmax_cross_entropy
 normalize, cache_score, class_weight, ignore_label, reduce)(x, t)
  File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 226, in __call__
    ret = node.apply(inputs)
  File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 228, in apply
    self._check_data_type_forward(in_data)
  File "/usr/local/lib/python3.6/site-packages/chainer/function_node.py", line 296, in _check_data_type_forwa
rd
    self.check_type_forward(in_type)
  File "/usr/local/lib/python3.6/site-packages/chainer/function.py", line 126, in check_type_forward
    self._function.check_type_forward(in_types)
  File "/usr/local/lib/python3.6/site-packages/chainer/functions/loss/softmax_cross_entropy.py", line 77, in
check_type_forward
    x_type.shape[2:] == t_type.shape[1:],
  File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 519, in expect
    expr.expect()
  File "/usr/local/lib/python3.6/site-packages/chainer/utils/type_check.py", line 477, in expect
    '{0} {1} {2}'.format(left, self.inv, right))
chainer.utils.type_check.InvalidType:
Invalid operation is performed in: SoftmaxCrossEntropy (Forward)

Expect: in_types[1].dtype.kind == i
Actual: f != i

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

修正:このコメントは正しくありません。
(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
例を見ると型の変換がありました。


import numpy as np

from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer import optimizers, datasets, iterators, training
from chainer.training import extensions

class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            cn1=L.Convolution2D(3, 8, (2, 3), stride=1, pad=1), 
            cn2=L.Convolution2D(8, 16, (2, 3), stride=1, pad=1),
            l1=L.Linear(160, 100),
            l2=L.Linear(100 ,2)
        )

    def __call__(self, x, t):
        pt = self.fwd(x)
        return F.softmax_cross_entropy(pt, t)

    def fwd(self, x):
        h1 = F.max_pooling_2d(F.relu(self.cn1(x)), 2) #8*3*10
        h2 = F.max_pooling_2d(F.relu(self.cn2(h1)), 2) #16*2*5
        h3 = F.dropout(F.relu(self.l1(h2)))
        h4 = self.l2(h3)
        return h4

xtrain = np.random.random((2, 3, 5, 20)).astype('f')
ytrain = np.random.randint(2, size=(2, 1))
ytrain = np.hstack((ytrain, 1-ytrain))
ytrain = np.argmax(ytrain, axis=1).astype('i')

model = MyChain()
optimizer = optimizers.Adam()
optimizer.setup(model)

train = datasets.tuple_dataset.TupleDataset(xtrain, ytrain)

iterator = iterators.SerialIterator(train, 2)
updater = training.StandardUpdater(iterator, optimizer)
trainer = training.Trainer(updater, (1000, 'epoch'))

trainer.extend(extensions.ProgressBar())
trainer.run()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/10 18:07

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

    キャンセル

  • 2017/12/10 18:12

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

    キャンセル

  • 2017/12/10 18: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

    これはどのようなことを意味しているのでしょうか?

    キャンセル

  • 2017/12/10 19:53

    失礼しました。
    ChainerはOneHotエンコーディングが必要ありませんでした。

    その代わりにはじめのエラーは型の違いによるものでした。
    softmaxcrossentropyはnp.int32をyに求めます。
    ですので、
    ytrain = ytrain.astype('i')
    するとうまくいくはずです。

    キャンセル

  • 2017/12/10 21: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:]

    キャンセル

  • 2017/12/10 22:00

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

    キャンセル

  • 2017/12/10 22:22

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

    キャンセル

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

  • ただいまの回答率 91.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    3700questions

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

  • 機械学習

    441questions

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

  • Chainer

    87questions

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

  • 深層学習

    85questions