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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1473閲覧

chainerで学習データの個数があっていないときのエラーを改善したい

seyu0930

総合スコア20

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/18 08:58

chainerで犬と猫の画像認識しようとしていますが、エラーが出ました。
どのようなエラーかは以下のサイトでわかるのですが、具体的にどう直せば良いのかわかりません。
よろしくお願いいたします。
https://rti7743.hatenadiary.org/entry/20170105/1483602327

https://segafreder.hatenablog.com/entry/2016/01/17/234707

python

1import chainer 2import numpy as np 3from PIL import Image 4import os 5from chainer.datasets import LabeledImageDataset 6from chainer.datasets import TransformDataset 7from chainer import datasets 8import chainer 9import chainer.functions as F 10import chainer.links as L 11from chainer import training, serializers, Chain, optimizers, iterators 12from chainer.training import extensions, Trainer 13 14 15 16#学習データと検証データを分ける 17cats_images_train_path = "/Users/haru/dogscats/train/cats/" 18dogs_images_train_path = "/Users/haru/dogscats/train/dogs/" 19cats_images_valid_path = "/Users/haru/dogscats/valid/cats/" 20dogs_images_valid_path = "/Users/haru/dogscats/valid/dogs/" 21 22image_and_teacher_label_list = [] 23 24 25#画像と教師ラベルを紐付ける0:猫,1:犬 26def get_image_teacher_label_list(dir, label): 27 filepath_list = [] 28 #引数dir内の画像ファイルを取得 29 files = os.listdir(dir) 30 #ひとつずつ取り出してディレクトリ名+画像ファイル名,ラベル(パス,ラベル)でfilepath_listに追加 31 for file in files: 32 filepath_list.append((dir + file, label)) 33 return filepath_list 34 35 36#学習データと検証データをリストにする 37 38#学習データ猫の画像フォルダ。ラベルは0:猫 39image_and_teacher_label_list.extend(get_image_teacher_label_list(cats_images_train_path, 0)) 40 41#学習データ犬の画像フォルダ。ラベルは1:犬 42image_and_teacher_label_list.extend(get_image_teacher_label_list(dogs_images_train_path, 1)) 43#検証データ猫の画像フォルダ。ラベルは0:猫 44image_and_teacher_label_list.extend(get_image_teacher_label_list(cats_images_valid_path, 0)) 45 46#検証データ犬の画像フォルダ。ラベルは1:犬 47image_and_teacher_label_list.extend(get_image_teacher_label_list(dogs_images_valid_path, 1)) 48 49 50#画像データをchainerのconvoluntion2Dに使えるように整備する 51 52#配列の順序を入れ替える関数 53def data_reshape(width_height_channel_image): 54 #ndarryの生成 55 image_array = np.array(width_height_channel_image) 56 #配列の順序を(0,1,2)から(2,0,1)の順にする(499, 495, 3)が(3, 499, 495)になる 57 return image_array.transpose(2, 0, 1) 58 59 60#畳み込みの準備をする関数 61 62def adapt_data_to_convolution2d_format(input_image): 63 image, label = input_image 64 65 #imageのデータを8ビットの符号なしの整数に変換する(dtypeの変換) 66 image = image.astype(np.uint8) 67 #imageを文字列から画像ファイルに変換 68 image = Image.fromarray(image.transpose(1,2,0)) 69 #画像サイズを変更 70 result_image = image.resize((INPUT_WIDTH, INPUT_HEIGHT), Image.LANCZOS) 71 #data_reshape関数でデータ構造を再変換 72 image = data_reshape(result_image) 73 #0~255の整数を取るデータを0〜1の間の値に変換する(0~1のfloat32型で定義しておかないとChainerがエラーになる) 74 image = image.astype(np.float32) / 255 75 76 return image, label 77 78#データセットを作成する 79dogscats_dataset = LabeledImageDataset(image_and_teacher_label_list) 80 81transformed_dataset = TransformDataset(dogscats_dataset, adapt_data_to_convolution2d_format) 82 83 84#学習データと検証データを分ける 85 86#前処理済みのデータをランダムに8:2の割合で分割する 87train_data, test_data = datasets.split_dataset_random(transformed_dataset, int(len(transformed_dataset) * 0.8), seed=0) 88 89 90GPU_ID = 0 91BATCH_SIZE = 64 92MAX_EPOCH = 10 93 94#CNN(畳み込みニューラルネットワーク)の設定 95 96class CNN(Chain): 97 #コンストラクタ 98 def __init__ (self): 99 super(CNN, self).__init__() 100 101 with self.init_scope(): 102#ここが原因っぽい? 103 self.conv1 = L.Convolution2D(None, out_channels=32, ksize=3, stride=1, pad=1) 104 self.conv2 = L.Convolution2D(in_channels=32, out_channels=64, ksize=3, stride=1, pad=1) 105 self.conv3 = L.Convolution2D(in_channels=64, out_channels=128, ksize=3, stride=1, pad=1) 106 self.conv4 = L.Convolution2D(in_channels=128, out_channels=256, ksize=3, stride=1, pad=1) 107 self.layer1 = L.Linear(None, 1000) 108 self.layer2 = L.Linear(1000, 2) 109 110 def __call__(self, input): 111 func = F.max_pooling_2d(F.relu(self.conv1(input)), ksize=2, stride=2) 112 func = F.max_pooling_2d(F.relu(self.conv2(input)), ksize=2, stride=2) 113 func = F.max_pooling_2d(F.relu(self.conv3(input)), ksize=2, stride=2) 114 func = F.max_pooling_2d(F.relu(self.conv4(input)), ksize=2, stride=2) 115 func = F.dropout(F.relu(self.layer1(func)), ratio=0.80) 116 func = self.layer2(func) 117 return func 118 119model = L.Classifier(CNN()) 120model.to_gpu(GPU_ID) 121 122#学習用の反復子 123train_iterator = iterators.MultiprocessIterator(train_data, BATCH_SIZE) 124#検証用の反復子 125test_iterator = iterators.MultiprocessIterator(test_data, BATCH_SIZE, False, False) 126 127optimizer = optimizers.Adam().setup(model) 128 129updater = training.StandardUpdater(train_iterator, optimizer, device=GPU_ID) 130 131trainer = Trainer(updater, stop_trigger=(MAX_EPOCH, "epoch")) 132 133#これを実行した際にエラー 134trainer.run()

エラー内容の抜粋

python

1InvalidType: 2Invalid operation is performed in: Convolution2DFunction (Forward) 3 4Expect: in_types[0].shape[1] == in_types[1].shape[1] * 1 5Actual: 3 != 32

文字数の関係上エラー内容が入りきらないので説明不足な点があればコメントよろしくお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/07/18 09:29

func = F.max_pooling_2d(F.relu(self.conv1(input)), ksize=2, stride=2) 以外に、 func = F.max_pooling_2d(F.relu(self.conv2(input)), ksize=2, stride=2) func = F.max_pooling_2d(F.relu(self.conv3(input)), ksize=2, stride=2) func = F.max_pooling_2d(F.relu(self.conv4(input)), ksize=2, stride=2) でも入力を「input」にしてますが、それらの入力は一つ前の出力の「func」なのでは?
seyu0930

2021/07/18 10:53

ありがとうございます! 修正したところ以下のようなエラーに変わりました Exception in thread prefetch_loop: multiprocessing.pool.RemoteTraceback: """ Traceback (most recent call last): File "/usr/lib/python3.7/multiprocessing/pool.py", line 121, in worker result = (True, func(*args, **kwds)) File "/usr/lib/python3.7/multiprocessing/pool.py", line 44, in mapstar return list(map(*args)) File "/usr/local/lib/python3.7/dist-packages/chainer/iterators/multiprocess_iterator.py", line 545, in _fetch_run data = _fetch_dataset[index] File "/usr/local/lib/python3.7/dist-packages/chainer/dataset/dataset_mixin.py", line 67, in __getitem__ return self.get_example(index) File "/usr/local/lib/python3.7/dist-packages/chainer/datasets/sub_dataset.py", line 76, in get_example return self._dataset[index] File "/usr/local/lib/python3.7/dist-packages/chainer/dataset/dataset_mixin.py", line 67, in __getitem__ return self.get_example(index) File "/usr/local/lib/python3.7/dist-packages/chainer/datasets/transform_dataset.py", line 52, in get_example return self._transform(in_data) File "<ipython-input-9-74915ea256fe>", line 13, in adapt_data_to_convolution2d_format image = data_reshape(result_image) File "<ipython-input-7-f056548796cb>", line 6, in data_reshape image_array = np.array(width_height_channel_image) File "/usr/local/lib/python3.7/dist-packages/cupy/_creation/from_data.py", line 41, in array return _core.array(obj, dtype, copy, order, subok, ndmin) File "cupy/_core/core.pyx", line 2124, in cupy._core.core.array File "cupy/_core/core.pyx", line 2203, in cupy._core.core.array File "cupy/_core/core.pyx", line 2277, in cupy._core.core._send_object_to_gpu File "cupy/_core/core.pyx", line 164, in cupy._core.core.ndarray.__init__ File "cupy/cuda/memory.pyx", line 735, in cupy.cuda.memory.alloc File "cupy/cuda/memory.pyx", line 1412, in cupy.cuda.memory.MemoryPool.malloc File "cupy/cuda/memory.pyx", line 1432, in cupy.cuda.memory.MemoryPool.malloc File "cupy/cuda/device.pyx", line 47, in cupy.cuda.device.get_device_id File "cupy_backends/cuda/api/runtime.pyx", line 289, in cupy_backends.cuda.api.runtime.getDevice File "cupy_backends/cuda/api/runtime.pyx", line 261, in cupy_backends.cuda.api.runtime.check_status cupy_backends.cuda.api.runtime.CUDARuntimeError: cudaErrorInitializationError: initialization error """ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib/python3.7/dist-packages/chainer/iterators/multiprocess_iterator.py", line 488, in _run alive = self._task() File "/usr/local/lib/python3.7/dist-packages/chainer/iterators/multiprocess_iterator.py", line 512, in _task data_all = future.get(_response_time) File "/usr/lib/python3.7/multiprocessing/pool.py", line 657, in get raise self._value cupy_backends.cuda.api.runtime.CUDARuntimeError: cudaErrorInitializationError: initialization error epoch main/loss main/accuracy validation/main/loss validation/main/accuracy elapsed_time /usr/local/lib/python3.7/dist-packages/chainer/iterators/multiprocess_iterator.py:27: TimeoutWarning: Stalled dataset is detected. See the documentation of MultiprocessIterator for common causes and workarounds: https://docs.chainer.org/en/stable/reference/generated/chainer.iterators.MultiprocessIterator.html MultiprocessIterator.TimeoutWarning)
jbpb0

2021/07/19 23:55 編集

質問のエラーが直って、次に進んで別のエラーが出てきたわけだから、それは別の質問にしてください あと、GPUが絡むとエラーの分析がしにくいので、 GPU_ID = -1 としてCPUのみで実行してみてどうなるのか、も確認した方がいいですよ CPUのみ実行では別のエラーが出た場合でも、そのエラーを直したら、GPU使用実行のエラーも直る、ということもあります
guest

回答2

0

自己解決

マシンの都合上chainerを使うのが困難なためtensorflowに切り替えました。

投稿2021/07/20 01:44

seyu0930

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

python

1 self.conv2 = L.Convolution2D(in_channels=32, out_channels=64, ksize=3, stride=1, pad=1)

と、「conv2」の入力channelは32ですが、そこに

python

1 func = F.max_pooling_2d(F.relu(self.conv2(input)), ksize=2, stride=2)

と、channelが3の「input」を入れてるので、

Actual: 3 != 32

となるのだと思います

 .

python

1 func = F.max_pooling_2d(F.relu(self.conv2(input)), ksize=2, stride=2) 2 func = F.max_pooling_2d(F.relu(self.conv3(input)), ksize=2, stride=2) 3 func = F.max_pooling_2d(F.relu(self.conv4(input)), ksize=2, stride=2) 4

の入力が「input」になってますが、それらの入力は一つ前の出力の「func」ではないのですか?

投稿2021/07/19 23:49

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問