前提・実現したいこと
下記のコードを実行し、学習曲線を書いたところ、画像の結果となりました。
!明](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)
試したこと
ホールドアウト層の追加
回答2件
あなたの回答
tips
プレビュー