回答編集履歴

1 edit

mkgrei

mkgrei score 8498

2017/12/10 19:57  投稿

ytrain.shape = (2, 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
例を見ると型の変換がありました。
---
```python
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()
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る