質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2406閲覧

cnn 簡単な画像認識について

22Go

総合スコア55

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/21 15:28

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()

をどのように変えたらいいのかわかりません。

教えていただきたいです。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

オリジナルモデルでは6/6しか学習できていないのですが

test_datagen.flow_from_directory() にパラメータとして batch_size=32 を渡しており、model.fit_generator() のパラメータsamples_per_epoch=200 にてEPOCKあたりのサンプル数を200と設定しているため、結果として 200/32=6 回のバッチ処理が行われているのかと思います。

cifar-10の判別モデルに自分のローカルデータを当てはめるには

現状のオリジナルモデルの方法でなにか問題があるのですか?

投稿2019/05/22 03:25

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

22Go

2019/05/23 14:35

ありがとうございます。epoch/batchなんですね!オリジナルモデルでの実行ができました! ですが参考書のモデルはbatch_size=32.epoch=1となっているのですが、どうゆうことなのでしょうか? オリジナルモデルをできるかぎり参考書のモデルに近づけたいので、どうにかしてできないものかと思い質問させていただきました。
magichan

2019/05/23 23:32

ざっと見る限り、変更前・後の大きな違いは2点 ・オリジナルでは``fit()``関数で学習させておりますので、データのサンプル数は画像の枚数(5000)となっておりますが、変更後の``fit_generator()``の場合はサンプル数を明示的に指定する必要があります。で、この値が samples_per_epoch=200 となっております。 ・オリジナルでは各画像を正規化 (*2) しており、各データの範囲が(0.~1.)となっておりますが、変更後は正規化を無効 (rescale=0)となっております。
magichan

2019/05/23 23:33

あと学習時のインジケータですが、fit()関数では sample数でカウントされ、 fit_generator()関数では batch数でカウントされているようですので、気をつける必要がありそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問