前提・実現したいこと
pythonによる画像認識のディープラーニングをchainerのライブラリを用いて行っています。
動作環境は、JupyterNotebookです。馬と牛の分類を目的としています。
データセットの作成までは問題なくできたのですが、CNN学習モデルの設定でエラーが出て解決できずにいます。
発生している問題・エラーメッセージ
#学習の実行セルに発生 TypeError Traceback (most recent call last) <ipython-input-27-ab3509b1dfc4> in <module> 1 #学習の実行 ----> 2 trainer.run() ~\Anaconda\envs\project_1\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg) 347 f.write('Traceback (most recent call last):\n') 348 traceback.print_tb(sys.exc_info()[2]) --> 349 six.reraise(*exc_info) 350 finally: 351 for _, entry in extensions: ~\Anaconda\envs\project_1\lib\site-packages\six.py in reraise(tp, value, tb) 701 if value.__traceback__ is not tb: 702 raise value.with_traceback(tb) --> 703 raise value 704 finally: 705 value = None ~\Anaconda\envs\project_1\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg) 314 self.observation = {} 315 with reporter.scope(self.observation): --> 316 update() 317 for name, entry in extensions: 318 if entry.trigger(self): ~\Anaconda\envs\project_1\lib\site-packages\chainer\training\updaters\standard_updater.py in update(self) 173 174 """ --> 175 self.update_core() 176 self.iteration += 1 177 ~\Anaconda\envs\project_1\lib\site-packages\chainer\training\updaters\standard_updater.py in update_core(self) 178 def update_core(self): 179 iterator = self._iterators['main'] --> 180 batch = iterator.next() 181 in_arrays = convert._call_converter(self.converter, batch, self.device) 182 ~\Anaconda\envs\project_1\lib\site-packages\chainer\iterators\multiprocess_iterator.py in __next__(self) 148 if self._prefetch_loop.measure_required(): 149 measure_mode = True --> 150 batch, state = self._prefetch_loop.measure( 151 self.dataset_timeout) 152 self._prefetch_loop.launch_thread() ~\Anaconda\envs\project_1\lib\site-packages\chainer\iterators\multiprocess_iterator.py in measure(self, dataset_timeout) 449 450 batch = batch_ret[0] --> 451 self.mem_size = max(map(_measure, batch)) 452 self._allocate_shared_memory() 453 TypeError: 'NoneType' object is not iterable
該当のソースコード
python
1#セータセットの作成 2from chainer.datasets import LabeledImageDataset 3horcecow_dataset = LabeledImageDataset(image_and_teacher_label_list) 4 5#データセットの代入 6from chainer.datasets import TransformDataset 7transformed_dataset = TransformDataset(horcecow_dataset, adapt_data_to_convolution2d_format) 8 9#学習データと検証データを分ける 10from chainer import datasets 11train_data, test_data = datasets.split_dataset_random(transformed_dataset, int(len(transformed_dataset) * 0.8), seed=0) 12 13import chainer 14import chainer.functions as F 15import chainer.links as L 16from chainer import training, serializers, Chain, optimizers, iterators 17from chainer.training import extensions, Trainer 18 19GPU_ID = -1 20BATCH_SIZE = 20 21MAX_EPOCH = 10 22 23#CNNの設定 24class CNN(Chain): 25 def __init__(self): 26 super(CNN, self).__init__() 27 with self.init_scope(): 28 self.conv1 = L.Convolution2D(None,out_channels=32, ksize=3, stride=1, pad=1) 29 self.conv2 = L.Convolution2D(in_channels=32, out_channels=64, ksize=3, stride=1, pad=1) 30 self.conv3 = L.Convolution2D(in_channels=64, out_channels=128, ksize=3, stride=1, pad=1) 31 self.conv4 = L.Convolution2D(in_channels=128, out_channels=256, ksize=3, stride=1, pad=1) 32 self.layer1 = L.Linear(None, 1000) 33 self.layer2 = L.Linear(1000, 2) 34 35 def __call__(self, input): 36 func = F.max_pooling_2d(F.relu(self.conv1(input)), ksize=2, stride=2) 37 func = F.max_pooling_2d(F.relu(self.conv2(func)), ksize=2, stride=2) 38 func = F.max_pooling_2d(F.relu(self.conv3(func)), ksize=2, stride=2) 39 func = F.max_pooling_2d(F.relu(self.conv4(func)), ksize=2, stride=2) 40 func = F.dropout(F.relu(self.layer1(func)), ratio=0.80) 41 func = self.layer2(func) 42 return func 43 44#モデルのインスタンス作成 45model = L.Classifier(CNN()) 46 47#反復子の作成 48#train_data,test_dataはデータセット済み 49train_iterator = iterators.MultiprocessIterator(train_data, BATCH_SIZE) 50test_iterator = iterators.MultiprocessIterator(test_data, BATCH_SIZE, False, False) 51 52#最適化 53optimizer = optimizers.Adam().setup(model) 54 55#ミニバッチの学習 56updater = training.StandardUpdater(train_iterator, optimizer, device=GPU_ID) 57 58#学習プロセスの自動化 59trainer = Trainer(updater, stop_trigger=(MAX_EPOCH, 'epoch')) 60 61#学習の実行 62trainer.run()
試したこと
CNNクラスの畳み込み層の入出力をいろいろと変化させてみました。
おそらくどこかの戻り値がNoneになってしまっていると思います。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。