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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

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

Q&A

1回答

3669閲覧

CNNの学習が上がらない原因を見つけたい

Fdoragon

総合スコア10

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

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

0グッド

0クリップ

投稿2018/10/18 14:00

前提・実現したいこと

ubuntuのjupyter notebook上でpythonを用いて畳み込みニューラルネットワーク(CNN)を使って"寿司"、"サラダ"、"麻婆豆腐"を見分けるプログラムを作る。

発生している問題・エラーメッセージ

エラーなく実行できたのですが、学習状況を表すグラフが横ばいで全く変化しません。

該当のソースコード

python

1import cnn_model #cnn_modelは下記のcnn_model.pyからインポートする 2import keras 3import matplotlib.pyplot as plt 4import numpy as np 5from sklearn.model_selection import train_test_split 6import cv2 7 8#入力と出力を指定 9im_rows = 32 #画像の縦ピクセル 10im_cols = 32 #画像の横ピクセル 11im_color = 3 #画像の色空間 12in_shape = (im_rows, im_cols, im_color) 13nb_classes = 3 14 15#写真データを読み込み 16photos = np.load('image/photos.npz') 17x = photos['x'] 18y = photos['y'] 19 20#読み込んだデータの三次元配列に変換 21x = x.reshape(-1, im_rows, im_cols, im_color) 22x = x.astype('float32')/255 23#ラベルデータをone-hotベクトルに直す 24y = keras.utils.np_utils.to_categorical(y.astype('int32'),nb_classes) 25 26#学習用とテスト用に分ける 27x_train, x_test, y_train, y_test = train_test_split( 28 x, y, train_size=0.8) 29 30# 学習用データの水増し 31x_new = [] 32y_new = [] 33for i, xi in enumerate(x_train): 34 yi = y_train[i] 35 for ang in range(-30, 30, 5): 36 #回転させる 37 center = (16, 16) 38 mtx = cv2.getRotationMatrix2D(center, ang, 1.0) 39 xi2 = cv2.warpAffine(xi, mtx, (32, 32)) 40 x_new.append(xi2) 41 y_new.append(yi) 42 #更に左右反転させる 43 xi3 = cv2.flip(xi2, 1) 44 x_new.append(xi3) 45 y_new.append(yi) 46 47#水増しした画像を学習用に置き換える 48print('水増し前=',len(y_train)) 49x_train = np.array(x_new) 50y_train = np.array(y_new) 51print('水増し後=',len(y_train)) 52 53#CNNモデルを取得 54model = cnn_model.get_model(in_shape, nb_classes) 55 56#学習を実行 57hist = model.fit(x_train, y_train, 58 batch_size=10, 59 epochs=5, 60 verbose=1, 61 validation_data=(x_test, y_test)) 62 63#モデルを評価 64score = model.evaluate(x_test,y_test,verbose=1) 65print('正解率=', score[1], 'loss=', score[0]) 66 67#学習の様子をグラフへ描画 68#正解率の推移をプロット 69plt.plot(hist.history['acc']) 70plt.plot(hist.history['val_acc']) 71plt.title('Accuracy') 72plt.legend(['train','test'],loc='upper left') 73plt.show() 74 75#ロスの推移をプロット 76plt.plot(hist.history['loss']) 77plt.plot(hist.history['val_loss']) 78plt.title('Loss') 79plt.legend(['train','test'],loc='upper left') 80plt.show() 81 82model.save_weights('./image/photos-model-light.hdf5') 83 84#####################################cnn_model.py############################################ 85import keras 86from keras.models import Sequential 87from keras.layers import Dense, Dropout, Flatten 88from keras.layers import Conv2D, MaxPooling2D 89from keras.optimizers import RMSprop 90 91#CNNのモデルを定義する 92def def_model(in_shape, nb_classes): 93 model = Sequential() 94 model.add(Conv2D(32, 95 kernel_size=(3, 3), 96 activation='relu', 97 input_shape=in_shape)) 98 model.add(Conv2D(32, (3, 3), activation='relu')) 99 model.add(MaxPooling2D(pool_size=(2, 2))) 100 model.add(Dropout(0.25)) 101 102 model.add(Conv2D(64, (3, 3), activation='relu')) 103 model.add(Conv2D(64, (3, 3), activation='relu')) 104 model.add(MaxPooling2D(pool_size=(2, 2))) 105 model.add(Dropout(0.25)) 106 107 model.add(Flatten()) 108 model.add(Dense(512, activation='relu')) 109 model.add(Dropout(0.5)) 110 model.add(Dense(nb_classes, activation='softmax')) 111 return model 112 113#コンパイル済のCNNモデルを返す 114def get_model(in_shape, nb_classes): 115 model = def_model(in_shape, nb_classes) 116 model.compile( 117 loss='categorical_crossentropy', 118 optimizer=RMSprop(), 119 metrics=['accuracy']) 120 return model 121

イメージ説明

試したこと

batchサイズの変更、トレーニング用の画像を再取得、トレーニング用の画像の水増し(約5000枚)

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

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

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

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

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

tiitoi

2018/10/18 14:03 編集

学習は fine-tuning ではなく、フルスクラッチで (1から学習すること) やっていますか?
Fdoragon

2018/10/19 13:09

はい、1からの学習です。
guest

回答1

0

ざっと思うところ。

  • 訓練誤差が落ちていないので、過学習以前に学習ができていない。
  • フルスクラッチ学習ではなく、fine-tuning で学習したほうがよい。
  • エポック数5で止めるのは早い気がする。もう少し学習を続けて様子をみたほうがよい。
  • 画像サイズ 32, 32 は小さくしすぎて情報が落ちてしまっているのでは?モデルの入力を (224, 224) ぐらいにしてみては。
  • Optimizer を adam にしてみる。

まず汎化性能はおいておいて、学習データの Accuracy が 100 %に近づくようがんばりましょう。

投稿2018/10/18 14:12

tiitoi

総合スコア21956

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

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

Fdoragon

2018/10/19 13:03

返信ありがとうございます、やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問