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

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

ただいまの
回答率

88.33%

chainerで画像の学習させようとdataset作成部分でエラーが出ます。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 645

yuya_murakami

score 12

前提・実現したいこと

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%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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