cnnによるcifar-10の画像認識モデルをもとに自分のローカルに保存した画像で画像判定ができるかどうかについて実験しています。
cigar-10の学習モデルは参考書(pythonによるAI機械学習・深層学習アプリの作り方)に掲載されているものを実行しています。
オリジナルのモデル(ほとんどcifar10のモデルと同じ)でcifar-10の画像をローカルに保存し、学習させていますが、cifar-10モデル(参考書)のように学習がすすまず、思い通りの判定が出ません。
こちらが参考書に掲載されているcifar-10のモデルです
python
1import matplotlib.pyplot as plt 2import keras 3from keras.datasets import cifar10 4from keras.models import Sequential 5from keras.layers import Dense, Dropout, Activation, Flatten 6from keras.layers import Conv2D, MaxPooling2D 7 8num_classes = 10 9im_rows = 32 10im_cols = 32 11in_shape = (im_rows, im_cols, 3) 12 13# データを読み込む --- (*1) 14(X_train, y_train), (X_test, y_test) = cifar10.load_data() 15 16# データを正規化 --- (*2) 17X_train = X_train.astype('float32') / 255 18X_test = X_test.astype('float32') / 255 19# ラベルデータをOne-Hot形式に変換 20y_train = keras.utils.to_categorical(y_train, num_classes) 21y_test = keras.utils.to_categorical(y_test, num_classes) 22 23# モデルを定義 --- (*3) 24model = Sequential() 25model.add(Conv2D(32, (3, 3), padding='same', 26 input_shape=in_shape)) 27model.add(Activation('relu')) 28model.add(Conv2D(32, (3, 3))) 29model.add(Activation('relu')) 30model.add(MaxPooling2D(pool_size=(2, 2))) 31model.add(Dropout(0.25)) 32 33model.add(Conv2D(64, (3, 3), padding='same')) 34model.add(Activation('relu')) 35model.add(Conv2D(64, (3, 3))) 36model.add(Activation('relu')) 37model.add(MaxPooling2D(pool_size=(2, 2))) 38model.add(Dropout(0.25)) 39 40model.add(Flatten()) 41model.add(Dense(512)) 42model.add(Activation('relu')) 43model.add(Dropout(0.5)) 44model.add(Dense(num_classes)) 45model.add(Activation('softmax')) 46 47# モデルをコンパイル --- (*4) 48model.compile( 49 loss='categorical_crossentropy', 50 optimizer='adam', 51 metrics=['accuracy']) 52 53# 学習を実行 --- (*5) 54hist = model.fit(X_train, y_train, 55 batch_size=32, epochs=1, 56 verbose=1, 57 validation_data=(X_test, y_test)) 58 59# モデルを評価 --- (*6) 60score = model.evaluate(X_test, y_test, verbose=1) 61print('正解率=', score[1], 'loss=', score[0]) 62 63# 学習の様子をグラフへ描画 --- (*7) 64plt.plot(hist.history['acc']) 65plt.plot(hist.history['val_acc']) 66plt.title('Accuracy') 67plt.legend(['train', 'test'], loc='upper left') 68plt.show() 69plt.plot(hist.history['loss']) 70plt.plot(hist.history['val_loss']) 71plt.title('Loss') 72plt.legend(['train', 'test'], loc='upper left') 73plt.show() 74 75#Using TensorFlow backend. 76#Train on 50000 samples, validate on 10000 samples 77#Epoch 1/1 78#50000/50000 [==============================] - 583s 12ms/step - loss: #1.5373 - acc: 0.4363 - val_loss: 1.2501 - val_acc: 0.5468 79#10000/10000 [==============================] - 24s 2ms/step 80#正解率= 0.5468 loss= 1.2501147895812987 81 82
これがオリジナルで少し手を加えたモデルです。
python
1import matplotlib.pyplot as plt 2import keras 3from keras.datasets import cifar10 4from keras.models import Sequential 5from keras.layers import Dense, Dropout, Activation, Flatten 6from keras.layers import Conv2D, MaxPooling2D 7from keras.preprocessing.image import ImageDataGenerator 8 9batch_size = 32 10num_classes = 10 11im_rows = 32 12im_cols = 32 13in_shape = (im_rows, im_cols, 3) 14epochs = 1 15 16# モデルを定義 --- (*3) 17model = Sequential() 18model.add(Conv2D(32, (3, 3), padding='same', 19 input_shape=in_shape)) 20model.add(Activation('relu')) 21model.add(Conv2D(32, (3, 3)))#64 22model.add(Activation('relu')) 23model.add(MaxPooling2D(pool_size=(2, 2))) 24model.add(Dropout(0.25)) 25 26model.add(Conv2D(64, (3, 3), padding='same')) 27model.add(Activation('relu')) 28model.add(Conv2D(64, (3, 3))) 29model.add(Activation('relu')) 30model.add(MaxPooling2D(pool_size=(2, 2))) 31model.add(Dropout(0.25)) 32 33model.add(Flatten()) 34model.add(Dense(512)) 35model.add(Activation('relu')) 36model.add(Dropout(0.5)) 37model.add(Dense(num_classes)) 38model.add(Activation('softmax')) 39 40# モデルをコンパイル --- (*4) 41model.compile( 42 loss='categorical_crossentropy', 43 optimizer='adam', 44 metrics=['accuracy']) 45 46train_datagen = ImageDataGenerator( 47 rescale=0) 48 49test_datagen = ImageDataGenerator(rescale=0) 50 51 52train_generator = train_datagen.flow_from_directory 53 'user/data/train', 54 target_size=(32, 32), 55 batch_size=batch_size, 56 class_mode='categorical') 57 58validation_generator = test_datagen.flow_from_directory( 59 'user/data/test', 60 target_size=(32, 32), 61 batch_size=batch_size, 62 class_mode='categorical') 63 64 65history = model.fit_generator( 66 train_generator, 67 samples_per_epoch=200, 68 nb_epoch=epochs, 69 validation_data=validation_generator, 70 nb_val_samples=200) 71 72#Using TensorFlow backend. 73#Found 50000 images belonging to 10 classes. 74#Found 10000 images belonging to 10 classes. 75#6/6 [==============================] - 13s 2s/step - loss: 2.3368 - acc: #0.0781 - val_loss: 2.3057 - val_acc: 0.1045
traindataとtestdataは同じものなのですが、オリジナルモデルでは6/6しか学習できていないのですが、なぜなのかわかりません、、、
また参考書のcifar-10の判別モデルに自分のローカルデータを当てはめるにはどうしたらいいでしょうか?
特に
データを読み込む --- (*1)
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
をどのように変えたらいいのかわかりません。
教えていただきたいです。宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/23 14:35
2019/05/23 23:32
2019/05/23 23:33