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

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

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

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

Python

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

Q&A

解決済

1回答

1773閲覧

kerasによる交差検証(k-fold)

sayaka1202

総合スコア18

Keras

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

Python

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

0グッド

0クリップ

投稿2017/11/05 01:02

編集2017/11/05 01:06

###前提・実現したいこと

現在画像認識をこちらを参考にkerasで行おうと考えています.
その際,交差検証(K-fold)を利用したいと思っているのですが,どう記述すればよいかわかりません.
参考1参考2あたり目を通しましたが,flow_from_directory()を用いている時自分ではどうすればよいかわかりませんでした,手助けお願い致します.

###該当のソースコード

Python

1import os 2from keras.applications.inception_v3 import InceptionV3 3from keras.applications.inception_v3 import preprocess_input 4from keras.models import Sequential, Model 5from keras.layers import Dense, Dropout, Activation, Flatten 6from keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2D, GlobalAveragePooling2D, AveragePooling2D 7from keras.regularizers import l2 8from keras.utils import np_utils 9from keras.utils import plot_model 10from keras.preprocessing.image import ImageDataGenerator 11from keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard 12import matplotlib.pyplot as plt 13import keras.backend as K 14import keras.backend.tensorflow_backend as KTF 15import tensorflow as tf 16from keras.optimizers import SGD 17from sklearn.model_selection import KFold 18 19epoch = 10 20 21result_dir = '' 22train_dir = '' 23test_dir = '' 24save_dir = '' 25cp_fname = '' 26txt_name = '' 27acc_name = "" 28loss_name = "" 29if not os.path.exists(result_dir): 30 os.mkdir(result_dir) 31 32 33def plot_history(history): 34 savefile = acc_name 35 # 精度の履歴をプロット 36 plt.plot(history.history['acc'], "o-", label="accuracy") 37 plt.plot(history.history['val_acc'], "o-", label="val_acc") 38 plt.title('model accuracy') 39 plt.xlabel('epoch') 40 plt.ylabel('accuracy') 41 plt.legend(loc="lower right") 42 plt.savefig(savefile) 43 savefile = loss_name 44 #plt.show() 45 plt.clf() 46 47 # 損失の履歴をプロット 48 plt.plot(history.history['loss'], "o-", label="loss", ) 49 plt.plot(history.history['val_loss'], "o-", label="val_loss") 50 plt.title('model loss') 51 plt.xlabel('epoch') 52 plt.ylabel('loss') 53 plt.legend(loc='lower right') 54 plt.savefig(savefile) 55 #plt.show() 56 57 58def save_history(history, result_file): 59 loss = history.history['loss'] 60 acc = history.history['acc'] 61 val_loss = history.history['val_loss'] 62 val_acc = history.history['val_acc'] 63 nb_epoch = len(acc) 64 65 with open(result_file, "w") as fp: 66 fp.write("epoch\tloss\tacc\tval_loss\tval_acc\n") 67 for i in range(nb_epoch): 68 fp.write("%d\t%f\t%f\t%f\t%f\n" % (i, loss[i], acc[i], val_loss[i], val_acc[i])) 69 70 71if __name__ == '__main__': 72 classes = ['a', 'b', 'c', 'd'] 73 74 batch_size = 32 75 nb_classes = len(classes) 76 img_rows, img_cols = 299, 299 77 channels = 3 78 79 samples_per_epoch = 1600 80 nb_val_samples = 400 81 82 # 交差検証KFold法5分割 83 kf = KFold(n_splits=5, shuffle=True) 84 sum_accuracy = 0 85 accuracy = [] 86 87 # TensorBoard 88 old_session = KTF.get_session() 89 session = tf.Session('') 90 KTF.set_session(session) 91 KTF.set_learning_phase(1) 92 93 # CNNを構築 94 # Inception v3モデルの読み込み,最終層は読み込まない 95 base_model = InceptionV3(weights='imagenet', include_top=False) 96 # 最終層の設定 97 x = base_model.output 98 x = GlobalAveragePooling2D()(x) 99 100 predictions = Dense(nb_classes, kernel_initializer="glorot_uniform", activation="softmax", 101 kernel_regularizer=l2(.0005))(x) 102 103 104 model = Model(inputs=base_model.input, outputs=predictions) 105 plot_model(model, show_shapes=True, to_file=os.path.join(result_dir, 'model.png')) 106 model.summary() 107 108 # base_modelはweightsを更新しない 109 for layer in base_model.layers: 110 layer.trainable = False 111 112 model.compile(loss='categorical_crossentropy', 113 optimizer='adam', 114 metrics=['accuracy']) 115 116 117 # ディレクトリの画像を使ったジェネレータ 118 train_datagen = ImageDataGenerator( 119 samplewise_center=False, 120 featurewise_center=False, 121 featurewise_std_normalization=False, 122 samplewise_std_normalization=False, 123 rotation_range=20, 124 width_shift_range=0.1, 125 # height_shift_range=0.1, 126 horizontal_flip=True, 127 vertical_flip=False, 128 zoom_range=0.1, 129 channel_shift_range=20, 130 # fill_mode='nearest' 131 ) 132 133 test_datagen = ImageDataGenerator(rescale=1.0 // 255) 134 135 train_generator = train_datagen.flow_from_directory( 136 directory=train_dir, 137 target_size=(img_rows, img_cols), 138 color_mode='rgb', 139 classes=classes, 140 class_mode='categorical', 141 batch_size=batch_size, 142 shuffle=True, 143 save_to_dir=save_dir) 144 145 print(train_generator.class_indices) 146 147 test_generator = test_datagen.flow_from_directory( 148 directory=test_dir, 149 target_size=(img_rows, img_cols), 150 color_mode='rgb', 151 classes=classes, 152 class_mode='categorical', 153 batch_size=batch_size, 154 shuffle=True) 155 156 cp_cb = ModelCheckpoint(filepath=cp_fname, verbose=1, 157 save_best_only=True) 158 159 es_cb = EarlyStopping(monitor='val_loss', patience=3, verbose=1, mode='auto') 160 161 tb_cb = TensorBoard(log_dir="{}tensorlog".format(result_dir), histogram_freq=1, write_graph=True) 162 163 history = model.fit_generator( 164 train_generator, 165 steps_per_epoch=samples_per_epoch // batch_size, 166 epochs=epoch, 167 validation_data=test_generator, 168 validation_steps=nb_val_samples // batch_size, 169 callbacks=[cp_cb, es_cb, tb_cb]) 170 171 save_history(history, os.path.join(result_dir, txt_name)) 172 plot_history(history) 173 174 # TensorBoard 175 KTF.set_session(old_session) 176 177 K.clear_session()

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

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

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

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

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

guest

回答1

0

ベストアンサー

英語に抵抗がないのであれば、ここを参考にすればよいと思います。

いずれにしろ、ImageDataGeneratorの.flow_from_directory()を使うのは問題あるように感じます。
と言いますのも、KFoldをする理由というのは異なるデータセットで汎用性を確かめたいためです。
しかし、ImageDataGeneratorではもとは同じ画像を変形させたりして大量にデータを作成します。
この複製されたデータに対してKFoldしても過学習することになります。
ですので、ImageDataGeneratorに読み込ませる時点でデータを分ける必要があります。

train_originalというフォルダを用意して、train_fit, train_validにシンボリックリンクをはり、それぞれに対して2つのImageDataGeneratorを作成するべきです。
これをos.listdir(path), sklearn.model_selection.StratifiedKFold(), os.symlink(src, dst)を組み合わせることで作ることができます。

ポイントはもとの教師データを2つのフォルダに分けるための関数を作ることです。
それさえできれば、後はすんなり行くはずです。

投稿2017/11/08 07:44

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問