kerasで画像判別の学習を行っています。
ローカルに保存してある画像をtrain/test/vali=6:3:1に分け、
trainとtestの画像に対して、imagedatageneratorを適用したいです
python
1# coding:utf-8 2 3import keras 4from keras.utils import np_utils 5from keras.layers.convolutional import Conv2D, MaxPooling2D 6from keras.models import Sequential 7from keras.layers.core import Dense, Dropout, Activation, Flatten 8from keras.preprocessing.image import array_to_img, img_to_array, list_pictures, load_img 9import numpy as np 10import pandas as pd 11from sklearn.model_selection import train_test_split 12import matplotlib.pyplot as plt 13from sklearn.neighbors import KNeighborsClassifier 14 15#【学習データの読み込み】 16X = [] 17Y = []#category_name 18 19V = [] 20W = [] 21 22 23# aの画像 24for picture in list_pictures('Der/a'): 25 img = img_to_array(load_img(picture, target_size=(64,64))) 26 X.append(img) 27 28 Y.append(0) 29 30for picture in list_pictures('Der/a'): 31 img = img_to_array(load_img(picture, target_size=(64,64))) 32 V.append(img) 33 34 W.append(0) 35 36# b 37for picture in list_pictures('Der/b'): 38 img = img_to_array(load_img(picture, target_size=(64,64))) 39 X.append(img) 40 41 Y.append(1) 42 43for picture in list_pictures('Der/b'): 44 img = img_to_array(load_img(picture, target_size=(64,64))) 45 V.append(img) 46 47 W.append(1) 48 49# c 50for picture in list_pictures('Der/c'): 51 img = img_to_array(load_img(picture, target_size=(64,64))) 52 X.append(img) 53 54 Y.append(2) 55 56for picture in list_pictures('Der/c'): 57 img = img_to_array(load_img(picture, target_size=(64,64))) 58 V.append(img) 59 60 W.append(2) 61 62# dの画像 63for picture in list_pictures('Der/d'): 64 img = img_to_array(load_img(picture, target_size=(64,64))) 65 X.append(img) 66 67 Y.append(3) 68 69for picture in list_pictures('Der/d'): 70 img = img_to_array(load_img(picture, target_size=(64,64))) 71 V.append(img) 72 73 W.append(3) 74 75# e 76for picture in list_pictures('Der/e'): 77 img = img_to_array(load_img(picture, target_size=(64,64))) 78 X.append(img) 79 80 Y.append(4) 81 82for picture in list_pictures('Der/e'): 83 img = img_to_array(load_img(picture, target_size=(64,64))) 84 V.append(img) 85 86 W.append(4) 87 88# fの画像 89for picture in list_pictures('Der/f'): 90 img = img_to_array(load_img(picture, target_size=(64,64))) 91 X.append(img) 92 93 Y.append(5) 94 95for picture in list_pictures('Der/f'): 96 img = img_to_array(load_img(picture, target_size=(64,64))) 97 V.append(img) 98 99 W.append(5) 100 101# gの画像 102for picture in list_pictures('Der/g'): 103 img = img_to_array(load_img(picture, target_size=(64,64))) 104 X.append(img) 105 106 Y.append(6) 107 108for picture in list_pictures('Der/g'): 109 img = img_to_array(load_img(picture, target_size=(64,64))) 110 V.append(img) 111 112 W.append(6) 113 114# hの画像 115for picture in list_pictures('Der/h'): 116 img = img_to_array(load_img(picture, target_size=(64,64))) 117 X.append(img) 118 119 Y.append(7) 120 121for picture in list_pictures('Der/h'): 122 img = img_to_array(load_img(picture, target_size=(64,64))) 123 V.append(img) 124 125 W.append(7) 126 127# load_imgをarrayに変換 128X = np.asarray(X) 129Y = np.asarray(Y) 130V = np.asarray(V) 131W = np.asarray(W) 132 133# 画素値を0から1の範囲に変換 134X = X.astype('float32') 135X = X / 255.0 136V = V.astype('float32') 137V = V / 255.0 138 139# クラスの形式を変換 140Y = np_utils.to_categorical(Y, 8)#(ベクトル変換したいラベル、配列数) 141W = np_utils.to_categorical(W, 8) 142 143 144 145X_train, X_vali, y_train, y_vali= train_test_split(X, Y, test_size=0.2) 146V_test, W_test = (V, W) 147 148# 【CNNを構築】 149model = Sequential() 150 151 152model.add(Conv2D(32, (3, 3), padding='same', 153 input_shape=X_train.shape[1:])) 154 155model.add(Activation('relu')) 156model.add(Conv2D(32, (3, 3))) 157model.add(Activation('relu')) 158model.add(MaxPooling2D(pool_size=(2, 2))) 159 160model.add(Dropout(0.4)) 161 162model.add(Conv2D(64, (3, 3), padding='same')) 163model.add(Activation('relu')) 164model.add(Conv2D(64, (3, 3))) 165model.add(Activation('relu')) 166model.add(MaxPooling2D(pool_size=(2, 2))) 167model.add(Dropout(0.4)) 168 169model.add(Flatten()) 170model.add(Dense(512)) 171model.add(Activation('relu')) 172model.add(Dropout(0.4)) 173model.add(Dense(8))#カテゴリー数 174model.add(Activation('softmax')) 175 176# 【コンパイル】 177model.compile(loss='categorical_crossentropy', 178 optimizer='adam', 179 metrics=['accuracy']) 180 181#【学習実行】 182history = model.fit(X_train, y_train, batch_size=64, epochs=100, 183 validation_data = (X_vali, y_vali), verbose = 1) 184 185 186 187score = model.evaluate(V_test, W_test, verbose = 1) 188print("正解", score[1], "loss", score[0])
現在はこのような状態なのですが
この場合だと、X.Yで読み込んだカテゴリー内の画像をtrain:test=8:2に分け、
V.Wで別のディレクトリーからvalidationを作成しています。
これだと、画像を追加する時にどのディレクトリに追加するか考えるのが面倒になるので、
X.Yで読み込んだ画像をtrain/test/validationに6:3:1に振り分けた後に
imagedatageneratorで水増し作業をして学習させたいです。
詳しい方、アドバイスをお願いいたします。
宜しくお願い致します。
あなたの回答
tips
プレビュー