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

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

ただいまの
回答率

90.12%

Chainerで独自データセットを用いた学習が始まりません…。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,499

physics303

score 76

自己符号化器を作ろうとしているのですが、うまくいきません。
次のようなコードを実行しました。

class Autoencoder(Chain):
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.l1 = L.Linear(3,2)
            self.l2 = L.Linear(2,3)

    def __call__(self,x):
        h1 = self.l1(x)
        h2 = self.l2(h1) 

        return h2

class Dataset(dataset.DatasetMixin):
    def __init__(self,number_of_data, show_initial = False):

        noise_level = 1

        self.data = np.zeros((number_of_data,3),dtype = np.float32)

        OA_vector = np.array([3,2,1])
        OB_vector = np.array([2,-1,1])

        t = np.random.uniform(-0.5,0.5,number_of_data)
        s = np.random.uniform(-0.5,0.5,number_of_data)

        for i in range(0,number_of_data):
            noise = np.random.uniform(-noise_level, noise_level,3)
            self.data[i] = t[i]*OA_vector + s[i]*OB_vector + noise

    def __len__(self):
        return self.data.shape[0]

    def get_example(self,idx):
        return self.data[idx]


if __name__ == "__main__":

    n_epoch = 5
    batch_size = 100

    number_of_data = 1000 #データ数
    train_data = Dataset(number_of_data,False)

    # NNのモデル宣言
    model = Autoencoder()

    optimizer = optimizers.SGD(lr=0.05).setup(model)
    train_iter = iterators.SerialIterator(train_data,batch_size)

    updater = training.StandardUpdater(train_iter,optimizer,device=0)
    trainer = training.Trainer(updater,(n_epoch,"epoch"),out="result")

    trainer.run()

data は 3次元のデータです。活性化関数を恒等関数にしてるのはわざとです。このコードを実行すると次のようなエラーがでるのですが、原因が全くわかりません。なぜでしょうか。

Exception in main training loop: Unsupported type <class 'NoneType'>
Traceback (most recent call last):
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 308, in run update() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 149, in update
self.update_core()
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 164, in update_core optimizer.update(loss_func, in_arrays) File "/home/**/.local/lib/python3.5/site-packages/chainer/optimizer.py", line 655, in update
loss.backward(loss_scale=self._loss_scale)
File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 966, in backward self._backward_main(retain_grad, loss_scale) File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 1095, in _backward_main
target_input_indexes, out_grad, in_grad)
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 548, in backward_accumulate gxs = self.backward(target_input_indexes, grad_outputs) File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 73, in backward
return ReLUGrad2(y).apply((gy,))
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 258, in apply outputs = self.forward(in_data) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 368, in forward
return self.forward_cpu(inputs)
File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 97, in forward_cpu y = (self.b > 0) * inputs[0] File "cupy/core/core.pyx", line 1310, in cupy.core.core.ndarray.mul File "cupy/core/elementwise.pxi", line 753, in cupy.core.core.ufunc.call File "cupy/core/elementwise.pxi", line 68, in cupy.core.core._preprocess_args Will finalize trainer extensions and updater before reraising the exception. Traceback (most recent call last): File "AC.py", line 70, in <module> trainer.run() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 322, in run
six.reraise(*sys.exc_info())
File "/home/**/.local/lib/python3.5/site-packages/six.py", line 693, in reraise raise value File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 308, in run
update()
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 149, in update self.update_core() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 164, in update_core
optimizer.update(loss_func, in_arrays)
File "/home/**/.local/lib/python3.5/site-packages/chainer/optimizer.py", line 655, in update loss.backward(loss_scale=self._loss_scale) File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 966, in backward
self._backward_main(retain_grad, loss_scale)
File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 1095, in _backward_main target_input_indexes, out_grad, in_grad) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 548, in backward_accumulate
gxs = self.backward(target_input_indexes, grad_outputs)
File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 73, in backward return ReLUGrad2(y).apply((gy,)) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 258, in apply
outputs = self.forward(in_data)
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 368, in forward return self.forward_cpu(inputs) File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 97, in forward_cpu
y = (self.b > 0) * inputs[0]
File "cupy/core/core.pyx", line 1310, in cupy.core.core.ndarray.mul
File "cupy/core/elementwise.pxi", line 753, in cupy.core.core.ufunc.call
File "cupy/core/elementwise.pxi", line 68, in cupy.core.core._preprocess_args
TypeError: Unsupported type <class 'NoneType'>

ちなみに cupyのエラーが出てるので、GPU関連かなと思い、

    updater = training.StandardUpdater(train_iter,optimizer,device=-1)

としてみたのですが、今度は

Exception in main training loop: unsupported operand type(s) for *: 'bool' and 'NoneType'
Traceback (most recent call last):
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 308, in run update() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 149, in update
self.update_core()
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 164, in update_core optimizer.update(loss_func, in_arrays) File "/home/**/.local/lib/python3.5/site-packages/chainer/optimizer.py", line 655, in update
loss.backward(loss_scale=self._loss_scale)
File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 966, in backward self._backward_main(retain_grad, loss_scale) File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 1095, in _backward_main
target_input_indexes, out_grad, in_grad)
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 548, in backward_accumulate gxs = self.backward(target_input_indexes, grad_outputs) File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 73, in backward
return ReLUGrad2(y).apply((gy,))
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 258, in apply outputs = self.forward(in_data) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 368, in forward
return self.forward_cpu(inputs)
File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 97, in forward_cpu y = (self.b > 0) * inputs[0] Will finalize trainer extensions and updater before reraising the exception. Traceback (most recent call last): File "AC.py", line 70, in <module> trainer.run() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 322, in run
six.reraise(*sys.exc_info())
File "/home/**/.local/lib/python3.5/site-packages/six.py", line 693, in reraise raise value File "/home/**/.local/lib/python3.5/site-packages/chainer/training/trainer.py", line 308, in run
update()
File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 149, in update self.update_core() File "/home/**/.local/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 164, in update_core
optimizer.update(loss_func, in_arrays)
File "/home/**/.local/lib/python3.5/site-packages/chainer/optimizer.py", line 655, in update loss.backward(loss_scale=self._loss_scale) File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 966, in backward
self._backward_main(retain_grad, loss_scale)
File "/home/**/.local/lib/python3.5/site-packages/chainer/variable.py", line 1095, in _backward_main target_input_indexes, out_grad, in_grad) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 548, in backward_accumulate
gxs = self.backward(target_input_indexes, grad_outputs)
File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 73, in backward return ReLUGrad2(y).apply((gy,)) File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 258, in apply
outputs = self.forward(in_data)
File "/home/**/.local/lib/python3.5/site-packages/chainer/function_node.py", line 368, in forward return self.forward_cpu(inputs) File "/home/**/.local/lib/python3.5/site-packages/chainer/functions/activation/relu.py", line 97, in forward_cpu
y = (self.b > 0) * inputs[0]
TypeError: unsupported operand type(s) for *: 'bool' and 'NoneType'

というエラーがでます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

        h2 = self.l2(x)

        h2 = self.l2(h1)
と書きたかったのでは。


    def get_example(self, idx):
        return self.data[idx]


で1つしか値を返してませんが、ここは入力と出力のを返すのが本当のはず。
AutoEncoderなので正解は自分自身でよく、

    def get_example(self, idx):
        return self.data[idx], self.data[idx]


でしょう。

また、

    model = Autoencoder()


だと予測する層だけで損失を計算してないので、例えば、

    model = L.Classifier(Autoencoder(), lossfun=F.mean_squared_error)
    model.compute_accuracy = False


とでもしましょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/21 09:39

    GPUを使ってないならなぜcupyが使われているんでしょうか。

    キャンセル

  • 2018/11/21 09:40 編集

    あなたの推測は正しかったです。

    キャンセル

  • 2018/11/21 09:41

    ごめんなさい、上のcupyのエラーはdevice = 0とした場合に出たものでした。(コードを直しました)

    キャンセル

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

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

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