

ChainerでAutoEncoderを作成して、学習させようしたところ,  
以下のようなエラーが発生しました。

[code]

    Traceback (most recent call last):
      File "MNIST_autoenc.py", line 30, in <module>
        y = model(xs[batch:batch+128])
      File "/usr/local/lib/python3.7/site-packages/chainer/link.py", line 293, in __call__
        forward = self.forward  # type: ignore
    AttributeError: 'AutoEncoder' object has no attribute 'forward'
    
[/code]

コードは以下の通りです。  
修正箇所があればご教授お願いします。

[code]

    import chainer
    import chainer.links as L
    import chainer.functions as F
    import numpy as np
    
    class AutoEncoder(chainer.Chain):
        def __init__(self):
            super(AutoEncoder, self).__init__(
                l0 = L.Linear(784, 256),
                l1 = L.Linear(256, 784) 
            )
    
            def __call__(self, x):
                h0 = F.relu(self.l0(x))
                h1 = F.sigmoid(self.l1(h0))
                return h5
    
    train, test = chainer.datasets.get_mnist(ndim=1)
    xs, ts = train._datasets
    txs, tts = test._datasets
    
    model = AutoEncoder()
    model.to_cpu()
    optimizer = chainer.optimizers.Adam()
    optimizer.setup(model)
    
    for _ in range(1000):
        model.zerograds()
        batch = np.random.randint(0, 60000-128)
        y = model(xs[batch:batch+128])
        acc = F.accuracy(y, rs[batch:batch+128])
        loss = F.softmax_cross_entropy(y, t[batch:batch+128])
        loss.backward()
        optimizer.update()
        if _ % 100 == 0:
            print("epoch:%d --> accuracy:%.4f, loss:%.4f" % (_, acc.data, loss.data))
    
[/code]

環境は  
macbook pro 2015  
python3 ver3.7.0  
chainer ver6.0.0  
numpy 1.17.0


CC BY-SA 4.0
2019-05-20T14:16:47.317
55118
2022-07-11T01:07:00.663
2019-05-21T00:43:17.863
19110
34392
question
python python3 chainer
python3で簡単なAutoencoderを作成したところAttributeErrorが発生する


ぱっと見ですが、`def __call__(self, x):`の行からインデントがずれていることに起因していませんかね。

[code]

            def __call__(self, x):
                h0 = F.relu(self.l0(x))
                h1 = F.sigmoid(self.l1(h0))
                return h5
    
[/code]

以下のようにしたら、どうなりますか？

[code]

        def __call__(self, x):
            h0 = F.relu(self.l0(x))
            h1 = F.sigmoid(self.l1(h0))
            return h5
    
[/code]

`AutoEncoder`に`forward()`も`__call__()`も無いから、`AttributeError`になっているように見えます。

<https://github.com/chainer/chainer/blob/master/chainer/link.py#L293>


CC BY-SA 4.0
2019-05-20T22:36:47.470
55121
2019-05-21T00:33:21.863
2019-05-21T00:33:21.863
21092
21092
55118
answer