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
文字数の関係上エラー内容が入りきらないので説明不足な点があればコメントよろしくお願いします
回答2件
あなたの回答
tips
プレビュー