前提・実現したいこと
以下のサイトからそのまま、Kerasで犬猫画像を学習させようとしていますが、学習画像数を増やすと手持ちのGPUではメモリの問題で落ちてしまいます。
https://employment.en-japan.com/engineerhub/entry/2017/04/28/110000
最終的に学習数を100万枚以上まで増やして学習させたいのですが、どんな方法がありえるでしょうか?一応、以下の策を考えていますが、他の提案あれば教えてほしいです。
(1と2はやっていることは同じ?)
- hdf5のweightのみを読み込んで画像を何回かに分けてfine tuningする
以下のように実現できそうですが、犬猫→各々の種類などのfine tuningではなくて、犬猫の新しい画像に対するtuningもこういうやり方で良いのでしょうか?
model.load_weights("./weight.**.hdf5", by_name=True)
- hdf5をモデルごと読み込んで画像を何回かに分けて再学習させる
以下のようにモデルを読み込んで新しい画像で学習→hdf5保存→読み込みを繰り返す?
model = load_model(filepath='./model.**.hdf5')
-
バッチ数を64から徐々に減らす
-
BMPではなくJPGなどの圧縮フォーマットに変える
→内部で持っているメモリは変わらないので意味なし?
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
python
1from keras.applications.inception_v3 import InceptionV3 2from keras.applications.inception_v3 import preprocess_input 3from keras.models import Sequential, Model 4from keras.layers import Dense, Dropout, Activation, Flatten 5from keras.layers import Convolution2D, MaxPooling2D, ZeroPadding2D, GlobalAveragePooling2D, AveragePooling2D 6from keras.preprocessing.image import ImageDataGenerator 7from keras.callbacks import ModelCheckpoint, CSVLogger, LearningRateScheduler, ReduceLROnPlateau 8from keras.optimizers import SGD 9from keras.regularizers import l2 10import matplotlib.image as mpimg 11from scipy.misc import imresize 12import numpy as np 13import keras.backend as K 14import math 15 16K.clear_session() 17img_size=299 18#訓練データ拡張 19train_datagen = ImageDataGenerator( 20featurewise_center=False, 21samplewise_center=False, 22featurewise_std_normalization=False, 23samplewise_std_normalization=False, 24rotation_range=10, 25width_shift_range=0.2, 26height_shift_range=0.2, 27horizontal_flip=True, 28vertical_flip=False, 29zoom_range=[.8, 1], 30channel_shift_range=30, 31fill_mode='reflect') 32 33test_datagen = ImageDataGenerator() 34 35#画像の読み込み 36def load_images(root,nb_img): 37all_imgs = [] 38all_classes = [] 39 40for i in range(nb_img): 41img_name = "%s/dog.%d.jpg" % (root, i + 1) 42img_arr = mpimg.imread(img_name) 43resize_img_ar = imresize(img_arr, (img_size, img_size)) 44all_imgs.append(resize_img_ar) 45all_classes.append(0) 46for i in range(nb_img): 47img_name = "%s/cat.%d.jpg" % (root, i + 1) 48img_arr = mpimg.imread(img_name) 49resize_img_ar = imresize(img_arr, (img_size, img_size)) 50all_imgs.append(resize_img_ar) 51all_classes.append(1) 52return np.array(all_imgs), np.array(all_classes) 53 54X_train, y_train = load_images('./train', 1000) 55X_test, y_test = load_images('./train', 400) 56train_generator = train_datagen.flow(X_train, y_train, batch_size=64, seed = 13) 57test_generator = test_datagen.flow(X_test, y_test, batch_size=64, seed = 13) 58 59#Inception v3モデルの読み込み。最終層は読み込まない 60base_model = InceptionV3(weights='imagenet', include_top=False) 61#最終層の設定 62x = base_model.output 63x = GlobalAveragePooling2D()(x) 64predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x) 65 66model = Model(inputs=base_model.input, outputs=predictions) 67 68#base_modelはweightsを更新しない 69for layer in base_model.layers: 70layer.trainable = False 71 72opt = SGD(lr=.01, momentum=.9) 73model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) 74 75checkpointer = ModelCheckpoint(filepath='model.{epoch:02d}-{val_loss:.2f}.hdf5', verbose=1, save_best_only=True) 76csv_logger = CSVLogger('model.log') 77 78reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, 79patience=5, min_lr=0.001) 80 81history = model.fit_generator(train_generator, 82steps_per_epoch=2000, 83epochs=10, 84validation_data=test_generator, 85validation_steps=800, 86verbose=1, 87callbacks=[reduce_lr, csv_logger, checkpointer])
補足情報(FW/ツールのバージョンなど)
Windows 10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/10 10:35