画像認識プログラミングレシピという本でchainerについて学習しております。(犬と猫を判別するものです)この章ではcupyを使うことになっているのですが、macOSXなのでcupyをinstallすることができず代わりにCPUでnumpyなどを使って実行したいです。
しかし最後のtrainer.run()の部分でエラーが出てしまいました。
変更してみた箇所などコード内に記述しておりますので参照いただければと思います。(解決できませんでしたが)
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#学習データ犬の画像フォルダ。ラベルは0:犬 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.unit8) 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 = -1 #0を-1に変更してみた 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 self.conv1 = L.Convolution2D(None, out_channels=32, ksize=3, stride=1, pad=1) 103 self.conv2 = L.Convolution2D(in_channels=32, out_channels=64, ksize=3, stride=1, pad=1) 104 self.conv3 = L.Convolution2D(in_channels=64, out_channels=128, ksize=3, stride=1, pad=1) 105 self.conv4 = L.Convolution2D(in_channels=128, out_channels=256, ksize=3, stride=1, pad=1) 106 self.layer1 = L.Linear(None, 1000) 107 self.layer2 = L.Linear(1000, 2) 108 109 def __call__(self, input): 110 func = F.max_pooling_2d(F.relu(self.conv1(input)), ksize=2, stride=2) 111 func = F.max_pooling_2d(F.relu(self.conv2(input)), ksize=2, stride=2) 112 func = F.max_pooling_2d(F.relu(self.conv3(input)), ksize=2, stride=2) 113 func = F.max_pooling_2d(F.relu(self.conv4(input)), ksize=2, stride=2) 114 func = F.dropout(F.relu(self.layer1(func)), ratio=0.80) 115 func = self.layer2(func) 116 return func 117 118model = L.Classifier(CNN()) 119model.to_cpu() #to_gpu(GPU_ID)を変更してみた 120 121#学習用の反復子 122train_iterator = iterators.MultiprocessIterator(train_data, BATCH_SIZE) 123あ#検証用の反復子 124test_iterator = iterators.MultiprocessIterator(test_data, BATCH_SIZE, False, False) 125 126optimizer = optimizers.Adam().setup(model) 127 128updater = training.StandardUpdater(train_iterator, optimizer, device=GPU_ID) 129 130trainer = Trainer(updater, stop_trigger=(MAX_EPOCH, "epoch")) 131 132trainer.run()
以下のようなサイトを参考にしつつ考えてみましたが解決できませんでした。分かる方いましたら回答よろしくお願いします。
https://www.amelt.net/imc/programming/python/3640/
文字数の関係上エラー内容はこちらにに記述させていただきます。
エラー内容はこちら
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。