前提・実現したいこと
こちらのコードを参考に、kerasで4分割交差検証を行うコードを書きました。
参考にしたコードではモデルを保存していなかったので、以下の通りcallbackを追加したところ、学習は問題なく行えたのですがモデルは保存されていませんでした。
大変お手数ですが、どう修正したらモデルが保存されるようになるか、アドバイスしていただけますととても助かります。
どうぞよろしくお願いいたします。
該当のソースコード(学習データ準備部分は省略しております)
python
1import keras 2from keras.utils import to_categorical 3from sklearn.model_selection import KFold 4import numpy as np 5from keras.models import Model 6from keras.layers import Dense, GlobalAveragePooling2D,Input,Dropout,Activation 7from keras.applications.resnet50 import ResNet50 8from keras.preprocessing.image import ImageDataGenerator 9from keras.optimizers import Adam 10from keras import callbacks 11from keras import backend as K 12from keras.engine.topology import Layer 13import tensorflow as tf 14from keras.preprocessing.image import load_img, img_to_array, array_to_img 15import os 16import glob 17import cv2 18from PIL import Image 19import matplotlib.pyplot as plt 20%matplotlib inline 21 22input_shape = (299, 299, 3) 23classes = 7 24batchsize = 12 25epochs=10 26 27# k-fold CV 28history = [] 29kf = None 30kf = KFold(n_splits=4, random_state=1234) 31 32callbacks_list = [ 33 callbacks.ModelCheckpoint( 34 filepath="model.ep{epoch:02d}.h5", 35 save_weights_only=False, 36 save_best_only=True), 37 38callbacks.EarlyStopping(monitor='loss', patience=3, verbose=1)] 39 40for train_index, val_index in kf.split(x_train, y_train): 41 base_model=keras.applications.densenet.DenseNet121(input_shape=input_shape, 42 weights='imagenet', 43 include_top=False) 44 45 c = base_model.output 46 c = GlobalAveragePooling2D()(c) 47 c = keras.layers.Lambda(lambda xx: 5*(xx)/K.sqrt(K.sum(xx**2)))(c) 48 c = Dense(classes, activation='softmax')(c) 49 model = Model(inputs=base_model.input,outputs=c) 50 model.summary() 51 model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy']) 52 #model.fit(x=x_train[train_index], y=y_train[train_index], batch_size=batchsize, epochs=epochs, verbose=1, callbacks=callbacks_list) 53 model.fit(x=x_train[train_index], y=keras.utils.to_categorical(y_train[train_index], classes), batch_size=batchsize, epochs=epochs, verbose=1, callbacks=callbacks_list) 54 #history.append(model.evaluate(x=x_train[val_index], y=y_train[val_index], batch_size=batchsize)) 55 history.append(model.evaluate(x=x_train[val_index], y=keras.utils.to_categorical(y_train[val_index], classes), batch_size=batchsize)) 56history = np.asarray(history) 57loss = np.mean(history[:, 0]) 58acc = np.mean(history[:, 1]) 59print(f'loss: {loss} ± {np.std(history[:, 0])} | acc: {acc} ± {np.std(history[:, 1])}')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/30 08:23