5.5.3.でひっかかりました

69 views
Skip to first unread message

tom

unread,
Jan 7, 2019, 6:06:21 AM1/7/19
to japan medical AI
お世話になります。

5.5.3.のコードに、
  • FIXME_1 = 64
  • FIXME_2 = 128
  • FIXME_3 = 128
  • FIXME_4 = 128
  • FIXME_5 = 128
を入力し、実行したのですが、

TypeError: __init__() missing 1 required positional argument: 'out_channels'

と表示されます。

def __init__(self, out_h, out_w, n_class=1): 
のところで、out_channelsを記載する必要があると思い、
out_channels=out_h, out_w や、out_h and out_w など試してみたのですが、うまくいきません。

ど対処したらよいものでしょうか。
どなたか教えていただけませんでしょうか?


class FullyConvolutionalNetwork(chainer.Chain): def __init__(self, out_h, out_w, n_class=1): super().__init__() with self.init_scope(): # L.Convolution2D(in_ch, out_ch, ksize, stride, pad) # in_chは省略することができるので, # L.Convolution2D(out_ch, ksize, stride, pad) # とかくこともできます. self.conv1 = L.Convolution2D(None, FIXME_1=64, ksize=5, stride=2, pad=2) self.conv2 = L.Convolution2D(None, FIXME_2=128, ksize=5, stride=2, pad=2) self.conv3 = L.Convolution2D(None, FIXME_3=128, ksize=3, stride=1, pad=1) self.conv4 = L.Convolution2D(None, FIXME_4=128, ksize=3, stride=1, pad=1) self.conv5 = L.Convolution2D(None, FIXME_5=128, ksize=1, stride=1, pad=0) # L.Deconvolution2D(in_ch, out_ch, ksize, stride, pad) # in_chは省略することができるので, # L.Deconvolution2D(out_ch, ksize, stride, pad) # と書くこともできます. self.deconv6 = L.Deconvolution2D(None, n_class, ksize=32, stride=16, pad=8) self.out_h = out_h self.out_w = out_w def forward(self, x): h = F.relu(self.conv1(x)) h = F.max_pooling_2d(h, 2, 2) h = F.relu(self.conv2(h)) h = F.max_pooling_2d(h, 2, 2) h = F.relu(self.conv3(h)) h = F.relu(self.conv4(h)) h = self.conv5(h) h = self.deconv6(h) return h.reshape(x.shape[0], 1, h.shape[2], h.shape[3]) print(FullyConvolutionalNetwork(256, 256)(np.zeros((1, 1, 256, 256), dtype=np.float32)).shape[2:])

に対し、

TypeError                                 Traceback (most recent call last)
<ipython-input-35-63c544d1354c> in <module>()
     40         return h.reshape(x.shape[0], 1, h.shape[2], h.shape[3])
     41 
---> 42 print(FullyConvolutionalNetwork(256, 256)(np.zeros((1, 1, 256, 256), dtype=np.float32)).shape[2:])

<ipython-input-35-63c544d1354c> in __init__(self, out_h, out_w, n_class)
     13             # L.Convolution2D(out_ch, ksize, stride, pad)
     14             # とかくこともできます.
---> 15             self.conv1 = L.Convolution2D(None, FIXME_1=64, ksize=5, stride=2, pad=2)
     16             self.conv2 = L.Convolution2D(None, FIXME_2=128, ksize=5, stride=2, pad=2)
     17             self.conv3 = L.Convolution2D(None, FIXME_3=128, ksize=3, stride=1, pad=1)

TypeError: __init__() missing 1 required positional argument: 'out_channels'


と表示されます。



shunta...@gmail.com

unread,
Jan 8, 2019, 12:31:27 AM1/8/19
to japan medical AI
表示されたTypeErrorは,FullyConvolutionalNetworkクラスのコンストラクタでなくConvolution2Dクラスのコンストラクタで起きたエラーです.
Convolution2Dクラスのコンストラクタにout_channelsという位置引数が与えられていないということを言っています.
代わりにFIXME_1というキーワード引数が与えられていますが,Convolution2DクラスにFIXME_1というキーワード引数は定義されていません.ただし,可変長引数を取る定義になっているため渡すことはできます(参考:https://github.com/chainer/chainer/blob/master/chainer/links/connection/convolution_2d.py#L108

もとのコードは変更せずに,クラス定義の外側にFIXME_1=64などの行を追加すれば位置引数としてConvolution2Dのout_channelsに値を渡すことになりますし,out_channels=64などの形でキーワード引数として渡しても良いです.

どちらかを試してみてください.

tom

unread,
Jan 8, 2019, 3:53:43 AM1/8/19
to japan medical AI
ありがとうございました。
外側にFIXME_1=64・・と追記して、実行できました。下に添付してみます。
最後のout_channels=64というのは、
self.conv1 = L.Convolution2D(None, out_channels=64, ksize=5, stride=2, pad=2)
としてもよいです。という理解でよろしかったですよね。
大変ありがとうございました。
エラーが生じたときに、何がおかしいのか、うまく同定できない状況でしたので、ありがとうございました。

学習を進めてまいります。


from chainer import reporter
from chainer import cuda
from chainercv import evaluations


class FullyConvolutionalNetwork(chainer.Chain):

    def __init__(self, out_h, out_w, n_class=1):
        super().__init__()
        with self.init_scope():
            # L.Convolution2D(in_ch, out_ch, ksize, stride, pad)
            # in_chは省略することができるので,
            # L.Convolution2D(out_ch, ksize, stride, pad)
            # とかくこともできます.
            FIXME_1 = 64
            FIXME_2 = 128
            FIXME_3 = 128
            FIXME_4 = 128
            FIXME_5 = 128
            self.conv1 = L.Convolution2D(None, FIXME_1, ksize=5, stride=2, pad=2)
            self.conv2 = L.Convolution2D(None, FIXME_2, ksize=5, stride=2, pad=2)
            self.conv3 = L.Convolution2D(None, FIXME_3, ksize=3, stride=1, pad=1)
            self.conv4 = L.Convolution2D(None, FIXME_4, ksize=3, stride=1, pad=1)
            self.conv5 = L.Convolution2D(None, FIXME_5, ksize=1, stride=1, pad=0)
            # L.Deconvolution2D(in_ch, out_ch, ksize, stride, pad)
            # in_chは省略することができるので,
            # L.Deconvolution2D(out_ch, ksize, stride, pad)
            # と書くこともできます.
            self.deconv6 = L.Deconvolution2D(None, n_class, ksize=32, stride=16, pad=8)
        self.out_h = out_h
        self.out_w = out_w

    def forward(self, x):
        h = F.relu(self.conv1(x))
        h = F.max_pooling_2d(h, 2, 2)

        h = F.relu(self.conv2(h))
        h = F.max_pooling_2d(h, 2, 2)

        h = F.relu(self.conv3(h))
        h = F.relu(self.conv4(h))
        h = self.conv5(h)
        h = self.deconv6(h)

        return h.reshape(x.shape[0], 1, h.shape[2], h.shape[3])

print(FullyConvolutionalNetwork(256, 256)(np.zeros((1, 1, 256, 256), dtype=np.float32)).shape[2:])




2019年1月8日火曜日 14時31分27秒 UTC+9 shunta...@gmail.com:
Reply all
Reply to author
Forward
0 new messages