chainerで画像の学習させようとdataset作成部分でエラーが出ます。
- 評価
- クリップ 0
- VIEW 645
前提・実現したいこと
chainer、pythonを用いて犬猫を分類するプログラムを作ろうとしています。
dataset作成の際に、augmentationをして検証データと訓練データを分割しようとしたところ、エラーが生じています。
発生している問題・エラーメッセージ
Exception in main training loop:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py", line 306, in run
update()
File "/usr/local/lib/python3.5/dist-packages/chainer/training/updaters/standard_updater.py", line 149, in update
self.update_core()
File "/usr/local/lib/python3.5/dist-packages/chainer/training/updaters/standard_updater.py", line 154, in update_core
in_arrays = self.converter(batch, self.device)
File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 133, in concat_examples
[example[i] for example in batch], padding[i])))
File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 163, in _concat_arrays
return xp.concatenate([array[None] for array in arrays])
Will finalize trainer extensions and updater before reraising the exception.
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-150-3287ea1d3afc> in <module>()
----> 1 trainer.run()
/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py in run(self, show_loop_exception_msg)
318 print('Will finalize trainer extensions and updater before '
319 'reraising the exception.', file=sys.stderr)
--> 320 six.reraise(*sys.exc_info())
321 finally:
322 for _, entry in extensions:
/usr/local/lib/python3.5/dist-packages/six.py in reraise(tp, value, tb)
691 if value.__traceback__ is not tb:
692 raise value.with_traceback(tb)
--> 693 raise value
694 finally:
695 value = None
/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py in run(self, show_loop_exception_msg)
304 self.observation = {}
305 with reporter.scope(self.observation):
--> 306 update()
307 for name, entry in extensions:
308 if entry.trigger(self):
/usr/local/lib/python3.5/dist-packages/chainer/training/updaters/standard_updater.py in update(self)
147
148 """
--> 149 self.update_core()
150 self.iteration += 1
151
/usr/local/lib/python3.5/dist-packages/chainer/training/updaters/standard_updater.py in update_core(self)
152 def update_core(self):
153 batch = self._iterators['main'].next()
--> 154 in_arrays = self.converter(batch, self.device)
155
156 optimizer = self._optimizers['main']
/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py in concat_examples(batch, device, padding)
131 for i in six.moves.range(len(first_elem)):
132 result.append(to_device(device, _concat_arrays(
--> 133 [example[i] for example in batch], padding[i])))
134
135 return tuple(result)
/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py in _concat_arrays(arrays, padding)
161 xp = cuda.get_array_module(arrays[0])
162 with cuda.get_device_from_array(arrays[0]):
--> 163 return xp.concatenate([array[None] for array in arrays])
164
165
MemoryError:
該当のソースコード
%matplotlib inline
from PIL import Image
from glob import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import chainer
import chainer.functions as F
import chainer.links as L
import scipy
from scipy.ndimage.interpolation import rotate
import cv2
from glob import glob
import random
def reset_seed(seed=0):
random.seed(seed)
np.random.seed(seed)
if chainer.cuda.available:
chainer.cuda.cupy.random.seed(seed)
reset_seed()
cat_paths = 'data/cat/*.jpg'
dog_paths = 'data/dog/*.jpg'
cat_files = glob(cat_paths)
dog_files = glob(dog_paths)
#cat元画像格納場所
x_basec,t_basec = [],[]
for filepath in cat_files:
img = Image.open(filepath)
img = np.array(img, 'f')#この下に水増し関数いれる
img = np.transpose(img,(2, 0, 1))
x_basec.append(img)
t_basec.append(np.array(0, 'i')) # 猫は0
#dog元画像格納場所
x_based,t_based = [],[]
for filepath in dog_files:
img = Image.open(filepath)
img = np.array(img, 'f')#この下に水増し関数いれる
img = np.transpose(img,(2, 0, 1))
x_based.append(img)
t_based.append(np.array(1, 'i')) # 犬は1
x_train, x_test = [],[]
t_train, t_test = [],[]
for filepath in cat_files:
if random.random() <0.7 : #訓練とテストの分割をランダム化
x_train.append(x_basec)
t_train.append(t_basec)
else:
x_test.append(x_basec)
t_test.append(t_basec)
for filepath in dog_files:
if random.random() <0.7 : #訓練とテストの分割をランダム化
x_train.append(x_based)
t_train.append(t_based)
else:
x_test.append(x_based)
t_test.append(t_based)
**train = chainer.datasets.TupleDataset(x_train,t_train)
test = chainer.datasets.TupleDataset(x_test,t_test) **
class CNN(chainer.Chain):
def __init__(self, n_mid=100, n_out=2):
super().__init__()
with self.init_scope():
self.conv1 = L.Convolution2D(in_channels=1, out_channels=3, ksize=3, stride=1, pad=1)
self.fc1 = L.Linear(None, n_mid)
self.fc2 = L.Linear(None, n_out)
def __call__(self, x):
h = F.relu(self.conv1(x))
h = F.max_pooling_2d(h, 3, 3)
h = self.fc1(h)
h = self.fc2(h)
return h
import random
def reset_seed(seed=0):
random.seed(seed)
np.random.seed(seed)
if chainer.cuda.available:
chainer.cuda.cupy.random.seed(seed)
# CPUとGPU関連のシードをすべて固定
reset_seed(0)
gpu_id = 0 # 使用したGPUに割り振られているID
model.to_gpu(gpu_id)
# Optimizerの定義とmodelとの紐づけ
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
batchsize = 128
train_iter = chainer.iterators.SerialIterator(train, batchsize)
test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat=False, shuffle=False)
from chainer import training
from chainer.training import extensions
epoch = 30
updater = training.StandardUpdater(train_iter, optimizer, device=gpu_id)
trainer = training.Trainer(updater, (epoch, 'epoch'), out='dc0')
# バリデーション用のデータで評価
trainer.extend(extensions.Evaluator(test_iter, model, device=gpu_id))
試したこと
augmentation部分は文字数の関係で省いていますがそれでも本エラーが発生しています。
augmentationせずにdatasetを一気に作成し、tupledataset_randomしたところプログラムが通ったため、
dataset作成orそれ以前の個所にエラーが発生していると考えられます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる