自作の画像を使ってCNNで機械学習をしています。現在のディレクトリ構成は
・main.py
・training.py
・image--a--画像フォルダ(クラス分の数)
となっており、main.pyでimage/a/のフォルダ内にある全ての画像フォルダ内の画像にそれぞれラベルをつけた後、.npz形式に出力します。画像フォルダはクラス分存在します。
その.npzファイルをあとで読み込み、ランダムにシャッフルして訓練、テストを行っています(現在の動作はうまくいっているので、コードは問題ないはずです)。
この形式を、
image--train--画像フォルダ(クラス分の数)
image--test --画像フォルダ(クラス分の数)
とし、あらかじめtrainとtestが分かれた状態で学習をさせるよう変更したいです。
というのもクラスによって水増し画像を入れたり入れなかったり調整したいと考えているからです。test側の画像には水増し画像は入れませんので、train_test_splitを使って混ぜてしまうのではなく、事前に分けておくべきだと考えました。
複数npzファイルを生成して繋げればよいのでしょうか?ご教授いただきたいです。
python
1コード 2#main.py 3import os, glob,random 4import cv2 5import numpy as np 6folda="a" 7outfile = "image_2/deepl_"+folda+".npz" 8max_photo=10000 9photo_size_t=400 10photo_size_y=400 11x=[] 12y=[] 13path="./image_2/"+folda 14files =os.listdir(path) 15files_dir=[f for f in files if os.path.isdir(os.path.join(path,f))] 16 17def main(): 18 n=0 19 for i in files_dir: 20 glob_files(path+"/"+i,n) 21 n+=1 22 np.savez(outfile,x=x,y=y) 23 print("保存しました"+outfile,len(x)) 24 25 26def glob_files(path,label): 27 files=glob.glob(path+"/*.png") 28 random.shuffle(files) 29 num=0 30 for f in files: 31 if num >=max_photo:break 32 num+=1 33 img=cv2.imread(f) 34 img=cv2.resize(img,(photo_size_t,photo_size_y)) 35 img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 36 img=np.asarray(img) 37 x.append(img) 38 y.append(label) 39 print(num) 40 print(files) 41 42if __name__=="__main__": 43 main()
python
1コード 2#training.py 3import cnn_model 4import keras 5import matplotlib.pyplot as plt 6import numpy as np 7from sklearn.model_selection import train_test_split 8import main 9im_rows=400 10im_cols=400 11im_color=3 12in_shape=(im_rows,im_cols,im_color) 13nb_classes=3 14photos=np.load("image_2/deepl_"+main.folda+".npz") 15x=photos["x"] 16y=photos["y"] 17x=x.reshape(-1,im_rows,im_cols,im_color) 18x=x.astype("float32")/255 19 20y=keras.utils.np_utils.to_categorical(y.astype("int32",nb_classes)) 21 22x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8,random_state=0) 23 24model=cnn_model.get_model(in_shape,nb_classes) 25 26hist=model.fit(x_train,y_train,batch_size=10,epochs=50,verbose=1,validation_split=0.1,validation_data=(x_test,y_test)) 27score=model.evaluate(x_test,y_test,verbose=1) 28print("正解率=",score[1],"loss=",score[0]) 29print(hist) 30plt.plot(hist.history["accuracy"]) 31plt.plot(hist.history["val_accuracy"]) 32plt.title("Accuracy") 33plt.legend(["train","test"],loc="upper left") 34plt.savefig("accc_valacc.png") 35plt.show() 36plt.plot(hist.history["loss"]) 37plt.plot(hist.history["val_loss"]) 38plt.title("Loss") 39plt.legend(["train","test"],loc="upper left") 40plt.savefig('loss-valloss.png') 41 42modelname="./image_2/deepl_"+main.folda+".hdf5" 43model.save_weights(modelname)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。