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

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

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

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

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

955閲覧

エポックを指定しても、学習が止まりません。

smart-material

総合スコア12

Keras

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

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/12/14 06:32

前提・実現したいこと

エポック数を20でしているはずなのに、追加で10エポック実行されてしまいます。
callbackを用いた際に、うまく動かせていないのでしょうか。
コードレビューと、解決方法をお伺いしたいです。

import numpy as np from numpy.random import permutation import os, glob, cv2, math, sys import pandas as pd from keras.models import Sequential, model_from_json from keras.layers.core import Dense, Dropout, Flatten from keras.layers.convolutional import Convolution2D, MaxPooling2D from keras.layers.advanced_activations import LeakyReLU from keras.callbacks import ModelCheckpoint from keras.optimizers import SGD from keras.utils import np_utils # 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)) 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=''): # HoldOut 2回行う 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) # train実行 model.fit(t_data, t_target, batch_size=32, # nb_epoch=40, nb_epoch=20, verbose=1, validation_data=(v_data, v_target), shuffle=True, callbacks=[cp]) # モデルの構成を保存 save_model(model, ho, modelStr) #コールバック es_cb = keras.callbacks.EarlyStopping( monitor='loss', min_delta=0.0001, patience=10, mode='auto') tb_cb = keras.callbacks.TensorBoard(log_dir='./logs') csv_logger = keras.callbacks.CSVLogger('./training.csv') model.fit( t_data, t_target, callbacks=[es_cb, tb_cb, csv_logger], validation_data=(v_data, v_target)) # 実行した際に呼ばれる if __name__ == '__main__': # 引数を取得 # [1] = train or test # [2] = test時のみ、使用Epoch数 1 # [3] = test時のみ、使用Epoch数 2 param = sys.argv if len(param) < 2: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]") # train or test run_type = param[1] if run_type == 'train': run_train('9_Layer_CNN') elif run_type == 'test': # testの場合、使用するエポック数を引数から取得する if len(param) == 4: epoch1 = "%02d"%(int(param[2])-1) epoch2 = "%02d"%(int(param[3])-1) run_test('9_Layer_CNN', epoch1, epoch2) else: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]") else: sys.exit ("Usage: python 9_Layer_CNN.py [train, test] [1] [2]")

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

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

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

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

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

jbpb0

2021/12/17 03:42

> エポック数を20でしているはずなのに、追加で10エポック実行されてしまいます。 「def run_train(modelStr=''):」内で「model.fit()」を2回実行してるからでしょう 1回目は、「nb_epoch=20」の指定通りに20エポック実行されます その次の2回目は、もし最初からEarlyStoppingコールバックの「min_delta=0.0001, patience=10」条件に該当したとしたら、10エポック実行された時にEarlyStoppingコールバックが発動して終わります それが「追加で10エポック実行」の分です
smart-material

2021/12/17 03:47

ご回答有り難うございます。 model.fit()を、修正し(1)にしたところ、解決いたしました。 ありがとうございます。
guest

回答1

0

ベストアンサー

エポック数を20でしているはずなのに、追加で10エポック実行されてしまいます。

「def run_train(modelStr=''):」内で「model.fit()」を2回実行してるからでしょう

1回目は、「nb_epoch=20」の指定通りに20エポック実行されます

その次の2回目は、もし最初からEarlyStoppingコールバックの「min_delta=0.0001, patience=10」条件に該当したとしたら、10エポック実行された時にEarlyStoppingコールバックが発動して終わります
それが「追加で10エポック実行」の分です

投稿2021/12/20 02:10

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問