機械学習で、画像認識をやろうと思っているのですが、画像が入ったファイルが2個までならできるのですが、3つ以上にするとエラーが起こってしまいます。
python
1!pip install icrawler
python
1# from icrawler.builtin import GoogleImageCrawler 2# もつ煮の画像を100枚取得 3# crawler = GoogleImageCrawler(storage={"root_dir": "moosuni"}) 4# crawler.crawl(keyword="もつ煮", max_num=100) 5from icrawler.builtin import BingImageCrawler 6 7# もつ煮の画像を100枚取得 8crawler = BingImageCrawler(storage={"root_dir": "motsuni"}) 9crawler.crawl(keyword="もつ煮", max_num=100)
python
1# ナポリタンの画像を100枚取得 2# crawler = GoogleImageCrawler(storage={"root_dir": "naporitan"}) 3# crawler.crawl(keyword="ナポリタン", max_num=100) 4from icrawler.builtin import BingImageCrawler 5 6# ナポリタンの画像を100枚取得 7crawler = BingImageCrawler(storage={"root_dir": "naporitan"}) 8crawler.crawl(keyword="ナポリタン", max_num=100)
python
1# ラーメンの画像を100枚取得 2# crawler = GoogleImageCrawler(storage={"root_dir": "ra-men"}) 3# crawler.crawl(keyword="ラーメン", max_num=100) 4from icrawler.builtin import BingImageCrawler 5 6# ラーメンの画像を100枚取得 7crawler = BingImageCrawler(storage={"root_dir": "ra-men"}) 8crawler.crawl(keyword="醤油ラーメン", max_num=100)
python
1from PIL import Image 2import os, glob 3import numpy as np 4from PIL import ImageFile 5# IOError: image file is truncated (0 bytes not processed)回避のため 6ImageFile.LOAD_TRUNCATED_IMAGES = True 7 8classes = ["motsuni", "naporitan", "ra-men"] 9num_classes = len(classes) 10image_size = 64 11num_testdata = 25 12 13X_train = [] 14X_test = [] 15y_train = [] 16y_test = [] 17 18for index, classlabel in enumerate(classes): 19 photos_dir = "./" + classlabel 20 files = glob.glob(photos_dir + "/*.jpg") 21 for i, file in enumerate(files): 22 image = Image.open(file) 23 image = image.convert("RGB") 24 image = image.resize((image_size, image_size)) 25 data = np.asarray(image) 26 if i < num_testdata: 27 X_test.append(data) 28 y_test.append(index) 29 else: 30 31 for angle in range(-20, 20, 5): 32 33 img_r = image.rotate(angle) 34 data = np.asarray(img_r) 35 X_train.append(data) 36 y_train.append(index) 37 38 img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) 39 data = np.asarray(img_trains) 40 X_train.append(data) 41 y_train.append(index) 42 43X_train = np.array(X_train) 44X_test = np.array(X_test) 45y_train = np.array(y_train) 46y_test = np.array(y_test) 47 48xy = (X_train, X_test, y_train, y_test) 49np.save("./ryouri.npy", xy)
python
1from keras.models import Sequential 2from keras.layers import Conv2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4from keras.utils import np_utils 5import keras 6import numpy as np 7 8classes = ["motsuni", "naporitan", "ra-men"] 9num_classes = len(classes) 10image_size = 64 11 12""" 13データを読み込む関数 14""" 15def load_data(): 16 X_train, X_test, y_train, y_test = np.load("./ryouri.npy", allow_pickle=True) 17 # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) 18 X_train = X_train.astype("float") / 255 19 X_test = X_test.astype("float") / 255 20 # to_categorical()にてラベルをone hot vector化 21 y_train = np_utils.to_categorical(y_train, num_classes) 22 y_test = np_utils.to_categorical(y_test, num_classes) 23 24 return X_train, y_train, X_test, y_test 25 26""" 27モデルを学習する関数 28""" 29def train(X, y, X_test, y_test): 30 model = Sequential() 31 32 # Xは(1200, 64, 64, 3) 33 # X.shape[1:]とすることで、(64, 64, 3)となり、入力にすることが可能です。 34 model.add(Conv2D(32,(3,3), padding='same',input_shape=X.shape[1:])) 35 model.add(Activation('relu')) 36 model.add(Conv2D(32,(3,3))) 37 model.add(Activation('relu')) 38 model.add(MaxPooling2D(pool_size=(2,2))) 39 model.add(Dropout(0.1)) 40 41 model.add(Conv2D(64,(3,3), padding='same')) 42 model.add(Activation('relu')) 43 model.add(Conv2D(64,(3,3))) 44 model.add(Activation('relu')) 45 model.add(MaxPooling2D(pool_size=(2,2))) 46 model.add(Dropout(0.25)) 47 48 model.add(Flatten()) 49 model.add(Dense(512)) 50 model.add(Activation('relu')) 51 model.add(Dropout(0.45)) 52 model.add(Dense(2)) 53 model.add(Activation('softmax')) 54 55 # https://keras.io/ja/optimizers/ 56 # 今回は、最適化アルゴリズムにRMSpropを利用 57 opt = keras.optimizers.rmsprop(lr=0.00005, decay=1e-6) 58 # https://keras.io/ja/models/sequential/ 59 model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy']) 60 model.fit(X, y, batch_size=28, epochs=40) 61 # HDF5ファイルにKerasのモデルを保存 62 model.save('./cnn.h5') 63 64 return model 65 66""" 67メイン関数 68データの読み込みとモデルの学習を行います。 69""" 70def main(): 71 # データの読み込み 72 X_train, y_train, X_test, y_test = load_data() 73 74 # モデルの学習 75 model = train(X_train, y_train, X_test, y_test) 76 77main()
エラー文
Using TensorFlow backend.
ValueError Traceback (most recent call last)
<ipython-input-6-efdca2892d59> in <module>()
75 model = train(X_train, y_train, X_test, y_test)
76
---> 77 main()
4 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
143 ': expected ' + names[i] + ' to have shape ' +
144 str(shape) + ' but got array with shape ' +
--> 145 str(data_shape))
146 return data
147
ValueError: Error when checking target: expected activation_6 to have shape (2,) but got array with shape (3,)
Google Colab でやっています。
使う画像は、上のコードでウェブから拾ってきています。
3つ以上のファイルを機械学習するためにはどのようにすればいいか、教えていただけると嬉しいです。
回答1件
あなたの回答
tips
プレビュー