前提・実現したいこと
現在では、ホールドアウト法を用いたCNNによる画像分類までは実装できております。
ホールドアウト法では検証する度に大きく精度が変わるため、k-分割交差検証を用いたいです。
どのように実装すれば宜しいでしょうか。
該当のソースコード
python3
1import keras 2from keras.models import Sequential 3from keras.layers import Dense,Dropout,Flatten 4from keras.layers import Conv2D,MaxPooling2D 5from keras.optimizers import RMSprop 6from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img 7import numpy as np 8 9#cnnのモデルを定義する 10 11def def_model(in_shape,nb_classes): 12 model=Sequential() 13 model.add(Conv2D(32, 14 kernel_size=(3,3), 15 activation="relu", 16 input_shape=in_shape)) 17 model.add(Conv2D(32,(3,3),activation="relu")) 18 model.add(MaxPooling2D(pool_size=(2,2))) 19 model.add(Dropout(0.25)) 20 21 model.add(Conv2D(64,(3,3),activation="relu")) 22 model.add(Conv2D(64,(3,3),activation="relu",name="relu_conv2")) 23 #最後の畳み込み層の名称を後ほど使うので定義しておく。 24 model.add(MaxPooling2D(pool_size=(2,2))) 25 model.add(Dropout(0.25)) 26 27 model.add(Flatten()) 28 model.add(Dense(512,activation="relu")) 29 model.add(Dropout(0.5)) 30 model.add(Dense(nb_classes,activation="softmax")) 31 32 return model 33 34#コンパイル済みのcnnのモデルを返す 35 36def get_model(in_shape,nb_classes): 37 model=def_model(in_shape,nb_classes) 38 model.compile( 39 loss="categorical_crossentropy", 40 optimizer=RMSprop(), 41 metrics=["accuracy"]) 42 return model 43 44datagen = ImageDataGenerator( 45 rotation_range=45, 46 vertical_flip=True, 47 horizontal_flip=True, 48 fill_mode='nearest') 49 50def images_gen(x_list,y_list): 51 x_list_add=[] 52 y_list_add=[] 53 for x ,y in zip(x_list,y_list):#xは(3, 150, 150)で受け取る 54 x = x.reshape((1,) + x.shape) #(1, 3, 150, 150)に変換する 55 56 batch_list=[] 57 i = 0 58 for batch in datagen.flow(x, batch_size=1): 59 batch=batch.astype(np.uint8)#データ型を揃える 60 batch=batch.reshape((32, 32, 3)) 61 x_list_add.append(batch) 62 y_list_add.append(y) 63 i += 1 64 if i > 9:#1枚から10枚作る 65 break 66 x_np_add=np.array(x_list_add) 67 y_np_add=np.array(y_list_add) 68 69 70 return x_np_add,y_np_add 71
python3
1import cnn_model 2import keras 3import matplotlib.pyplot as plt 4import numpy as np 5from sklearn.model_selection import train_test_split 6 7#入力と出力を指定 8im_rows=32 9im_cols=32 10im_color=3 11in_shape=(im_rows,im_cols,im_color) 12nb_classes=3 13 14#写真データを読み込み 15photos=np.load("./photos.npz") 16x=photos["x"] 17y=photos["y"] 18 19#読み込んだデータを三次元配列に変換 20x=x.reshape(-1,im_rows,im_cols,im_color) 21 22#学習用とテスト用に分ける 23x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8) 24 25#ここで水増し 26x_train_add,y_train_add=cnn_model.images_gen(x_train,y_train) 27 28x_train_add=x_train_add.astype("float32")/255 29x_test=x_test.astype("float32")/255 30 31#ラベルデータをone-hotベクトルに直す 32y_train_add=keras.utils.np_utils.to_categorical(y_train_add.astype("int32"),nb_classes) 33y_test=keras.utils.np_utils.to_categorical(y_test.astype("int32"),nb_classes) 34 35model=cnn_model.get_model(in_shape,nb_classes) 36 37#学習を実行 38hist=model.fit(x_train_add,y_train_add, 39 batch_size=32, 40 epochs=20, 41 verbose=1, 42 validation_data=(x_test,y_test)) 43 44#モデルを評価 45score=model.evaluate(x_test,y_test,verbose=1) 46print("正解率=",score[1],"loss=",score[0]) 47 48#学習の様子をグラフへ描写 49#正解率の推移をプロット 50plt.plot(hist.history["acc"]) 51plt.plot(hist.history["val_acc"]) 52plt.title("Accuracy") 53plt.legend(["train","test"],loc="upper left") 54plt.show() 55 56#ロスの推移をプロット 57plt.plot(hist.history["loss"]) 58plt.plot(hist.history["val_loss"]) 59plt.title("Loss") 60plt.legend(["train","test"],loc="upper left") 61plt.show() 62 63model.save_weights("./photos.hdf5")
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。