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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

1489閲覧

過学習を抑制し、収束させたい

smart-material

総合スコア12

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/12/17 02:58

前提・実現したいこと

下記のコードを実行し、学習曲線を書いたところ、画像の結果となりました。
!イメージ説明明](2beaf2fc1ab194ecaf79529e8c9e00e9.png)
vallossをうまく収束させたいです。

該当のソースコード

# seed値 np.random.seed(1) # 使用する画像サイズ img_rows, img_cols = 224, 224 # 画像データ 1枚の読み込みとリサイズを行う def get_im(path): img = cv2.imread(path) resized = cv2.resize(img, (img_cols, img_rows)) return resized # データの読み込み、正規化、シャッフルを行う def read_train_data(ho=0, kind='train'): train_data = [] train_target = [] # 学習用データ読み込み for j in range(0, 6): # 0~5まで path = '../../data/Caltech-101/' path += '%s/%i/*/%i/*.jpg'%(kind, ho, j) files = sorted(glob.glob(path)) for fl in files: flbase = os.path.basename(fl) # 画像 1枚 読み込み img = get_im(fl) img = np.array(img, dtype=np.float32) # 正規化(GCN)実行 img -= np.mean(img) img /= np.std(img) train_data.append(img) train_target.append(j) # 読み込んだデータを numpy の array に変換 train_data = np.array(train_data, dtype=np.float32) train_target = np.array(train_target, dtype=np.uint8) # (レコード数,縦,横,channel数) を (レコード数,channel数,縦,横) に変換 #train_data = train_data.transpose((0, 3, 1, 2)) # target を 6次元のデータに変換。 # ex) 1 -> 0,1,0,0,0,0 2 -> 0,0,1,0,0,0 train_target = np_utils.to_categorical(train_target, 6) # データをシャッフル perm = permutation(len(train_target)) train_data = train_data[perm] train_target = train_target[perm] return train_data, train_target # テストデータ読み込み def load_test(test_class, aug_i): path = '../../data/Caltech-101/test/%i/%i/*.jpg'%(aug_i, test_class) files = sorted(glob.glob(path)) X_test = [] X_test_id = [] for fl in files: flbase = os.path.basename(fl) img = get_im(fl) img = np.array(img, dtype=np.float32) # 正規化(GCN)実行 img -= np.mean(img) img /= np.std(img) X_test.append(img) X_test_id.append(flbase) # 読み込んだデータを numpy の array に変換 test_data = np.array(X_test, dtype=np.float32) # (レコード数,縦,横,channel数) を (レコード数,channel数,縦,横) に変換 #test_data = test_data.transpose((0, 3, 1, 2)) return test_data, X_test_id # 9層 CNNモデル 作成 def layer_9_model(): # KerasのSequentialをモデルの元として使用 ---① model = Sequential() # 畳み込み層(Convolution)をモデルに追加 ---② model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', input_shape=(img_rows, img_cols, 3))) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) # プーリング層(MaxPooling)をモデルに追加 ---③ model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(Convolution2D(128, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Convolution2D(128, 3, 3, border_mode='same', activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(MaxPooling2D((2, 2), strides=(2, 2))) # Flatten層をモデルに追加 -- ④ model.add(Flatten()) # 全接続層(Dense)をモデルに追加 --- ⑤ model.add(Dense(1024, activation='linear')) model.add(LeakyReLU(alpha=0.3)) # Dropout層をモデルに追加 --- ⑥ model.add(Dropout(0.5)) model.add(Dense(1024, activation='linear')) model.add(LeakyReLU(alpha=0.3)) model.add(Dropout(0.5)) # 最終的なアウトプットを作成。 --- ⑦ model.add(Dense(6, activation='softmax')) # ロス計算や勾配計算に使用する式を定義する。 --- ⑧ sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=["accuracy"]) return model # モデルの構成と重みを読み込む def read_model(ho, modelStr='', epoch='00'): # モデル構成のファイル名 json_name = 'architecture_%s_%i.json'%(modelStr, ho) # モデル重みのファイル名 weight_name = 'model_weights_%s_%i_%s.h5'%(modelStr, ho, epoch) # モデルの構成を読込み、jsonからモデルオブジェクトへ変換 model = model_from_json(open(os.path.join('cache', json_name)).read()) # モデルオブジェクトへ重みを読み込む model.load_weights(os.path.join('cache', weight_name)) return model # モデルの構成を保存 def save_model(model, ho, modelStr=''): # モデルオブジェクトをjson形式に変換 json_string = model.to_json() # カレントディレクトリにcacheディレクトリがなければ作成 if not os.path.isdir('cache'): os.mkdir('cache') # モデルの構成を保存するためのファイル名 json_name = 'architecture_%s_%i.json'%(modelStr, ho) # モデル構成を保存 open(os.path.join('cache', json_name), 'w').write(json_string) import tensorflow as tf import keras def run_train(modelStr=''): for ho in range(1): # モデルの作成 model = layer_9_model() # trainデータ読み込み t_data, t_target = read_train_data(ho, 'train') v_data, v_target = read_train_data(ho, 'valid') # CheckPointを設定。エポック毎にweightsを保存する。 cp = ModelCheckpoint('./cache/model_weights_%s_%i_{epoch:02d}.h5'%(modelStr, ho), monitor='val_loss', save_best_only=False) model.fit(t_data, t_target, batch_size=32, nb_epoch=40, verbose=1, callbacks=[es_cb, tb_cb, csv_logger], validation_data=(v_data, v_target), shuffle=True), save_model(model, ho, modelStr)

試したこと

ホールドアウト層の追加

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

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

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

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

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

jbpb0

2021/12/17 08:10

from keras.optimizers import Adam を追加 model.compile(optimizer=sgd, ↓ 変更 model.compile(optimizer=Adam(), で、どうでしょうか?
jbpb0

2021/12/17 09:07

実装ディープラーニング https://shop.ohmsha.co.jp/shopdetail/000000004775/ の111ページを見ると、テストデータでの正解率が82%です 質問のグラフの画像の「val_acc」も、80%(0.8)をちょっと超えてて、書籍の正解率と同じくらいですよね なので、これくらいがこのネットワークの実力なのではないですかね もちろん、扱ってる画像の分類の難しさとか、学習に使える画像の枚数とかに依存する話なので、質問者さんがやろうとしてることの難しさが、書籍で扱ってる画像分類の難しさと同程度ならば、ということですが 書籍の後の方で出てくる、VGG-16とかResNet-152とかの、もっと性能が高いネットワークを使ってみたら、いかがでしょうか
guest

回答2

0

ベストアンサー

実装ディープラーニング
の111ページを見ると、テストデータでの正解率が82%です

質問のグラフの画像の「val_acc」も、80%(0.8)をちょっと超えてて、書籍の正解率と同じくらいですよね
なので、これくらいがこのネットワークの実力なのではないですかね

もちろん、扱ってる画像の分類の難しさとか、学習に使える画像の枚数とかに依存する話なので、質問者さんがやろうとしてることの難しさが、書籍で扱ってる画像分類の難しさと同程度ならば、ということですが

書籍の後の方で出てくる、VGG-16とかResNet-152とかの、もっと性能が高いネットワークを使ってみたら、いかがでしょうか

投稿2021/12/20 02:14

jbpb0

総合スコア7653

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

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

0

KerasのLearningRateSchedulerを使って学習率を途中で変化させるを使って、徐々に学習率を下げるのが有効らしいです。

投稿2021/12/17 05:50

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問