前提・実現したいこと
犬と猫の画像をCNNで分類するシステムを作っています。
環境はgoogle colaboratoryで、フレームワークはchainerを使っています。
また、画像はgoogle driveから読み込み、ネットワークはvggを使っています。
しかし、trainer.run()を実行すると下記のようなエラーが出てしまいます。
発生している問題・エラーメッセージ
ValueError Traceback (most recent call last) <ipython-input-23-041e2033e90a> in <module>() ----> 1 trainer.run() 8 frames /usr/local/lib/python3.6/dist-packages/chainer/dataset/convert.py in _concat_arrays(arrays, padding) 252 with chainer.using_device(device): 253 arr_concat = device.xp.concatenate( --> 254 [array[None] for array in arrays]) 255 256 return arr_concat <__array_function__ internals> in concatenate(*args, **kwargs) ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 8 has size 4
該当のソースコード
import glob import chainer import chainer.links as L import chainer.functions as F import numpy as np import pandas as pd from google.colab import drive from PIL import Image from sklearn.model_selection import train_test_split from chainer.datasets import tuple_dataset from chainer import training from chainer.training import extensions #google driveにマウント drive.mount('/content/drive') #ファイルパス取得 path1 = glob.glob("/content/drive/My Drive/classification/dog*.jpg") path2 = glob.glob("/content/drive/My Drive/classification/cat*.jpg") #ラベル配列作成 t1 = np.array( [] ) t2 = np.array( [] ) for i in range(len(path1)): t1 = np.append( t1, 0 ) for i in range(len(path2)): t2 = np.append( t2, 1 ) t1 = t1.astype('int32') t2 = t2.astype('int32') #画像前処理 imageData1 = [] imageData2 = [] for i in range(len(path1)): img = Image.open(path1[i]) img = img.resize((224, 224)) img = np.asarray(img) img = img.transpose(2,1,0) img = img.astype(np.float32) img = img / 255 imageData1.append(img) for i in range(len(path2)): img = Image.open(path2[i]) img = img.resize((224, 224)) img = np.asarray(img) img = img.transpose(2,1,0) img = img.astype(np.float32) img = img / 255 imageData2.append(img) #データ整理 x_train1, x_test1, t_train1, t_test1 = train_test_split(imageData1, t1, test_size=0.3, random_state=0) x_train1, x_test2, t_train2, t_test2 = train_test_split(imageData2, t2, test_size=0.3, random_state=0) x_train = [] for i in range(len(x_train1)): x_train.append(x_train1[i]) for i in range(len(x_train2)): x_train.append(x_train2[i]) x_test = [] for i in range(len(x_test1)): x_test.append(x_test1[i]) for i in range(len(x_test2)): x_test.append(x_test2[i]) t_train = [] for i in range(len(t_train1)): t_train.append(t_train1[i]) for i in range(len(t_train2)): t_train.append(t_train2[i]) t_test = [] for i in range(len(t_test1)): t_test.append(t_test1[i]) for i in range(len(t_test2)): t_test.append(t_test2[i]) train = tuple_dataset.TupleDataset(x_train, t_train) test = tuple_dataset.TupleDataset(x_test, t_test) #ネットワーク class VGG(chainer.Chain): def __init__(self, class_labels=2): super(VGG, self).__init__() with self.init_scope(): self.base = L.VGG16Layers() self.fc6 = L.Linear(512 * 7 * 7, 4096) self.fc7 = L.Linear(4096, 4096) self.fc8 = L.Linear(4096, class_labels) def __call__(self, x): h = self.base(x, layers=['pool5'])['pool5'] h = F.dropout(F.relu(self.fc6(h))) h = F.dropout(F.relu(self.fc7(h))) return self.fc8(h) #設定 batchsize = 32 train_iter = chainer.iterators.SerialIterator(train, batchsize) test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat=False, shuffle=False) vgg = VGG() model = L.Classifier(vgg) vgg.base.disable_update() #model.base.disable_update() gpu = 0 if gpu >= 0: chainer.cuda.get_device(gpu).use() model.to_gpu() opt = chainer.optimizers.Adam() opt.setup(model) epoch = 15 updater = training.StandardUpdater(train_iter, opt, device=gpu) trainer = training.Trainer(updater, (epoch, 'epoch'), out='/cifar/result') trainer.extend(extensions.Evaluator(test_iter, model, device=gpu)) trainer.extend(extensions.dump_graph('main/loss')) trainer.extend(extensions.snapshot(), trigger=(epoch, 'epoch')) trainer.extend(extensions.LogReport()) trainer.extend(extensions.PrintReport( ['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy'])) trainer.extend(extensions.ProgressBar()) %学習 trainer.run()
試したこと
画像の前処理が怪しいかなと個人的には思いましたが、、、
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。