損失関数の可視化及び認識精度の推移

python

1from google.colab import drive 2drive.mount('/content/drive')3 4%cd '/content/drive/MyDrive/test'5 6import os 7import cv2 8import numpy as np 9import glob as glob 10from sklearn.model_selection import train_test_split 11from keras.utils import np_utils 12#フォルダ名をクラス名にする13path = "./images"14folders = os.listdir(path)15classes = [f for f in folders if os.path.isdir(os.path.join(path, f))]16n_classes = len(classes)17 18#画像とラベルの格納19X = []20Y = []21 22for label,class_name in enumerate(classes):23 files = glob.glob("./images/" + class_name +"/*.jpg")24 for file in files:25 img = cv2.imread(file)26 img = cv2.resize(img,dsize = (224,224))27 X.append(img)28 Y.append(label)29 30X = np.array(X)31X = X.astype('float32')32X /= 255.033X[0]34 35#ラベルの変換36Y = np.array(Y)37Y = np_utils.to_categorical(Y,n_classes)38Y[:5]39 40#学習データとテストデータに分ける41X_train, X_test, y_train, y_test = train_test_split(X, Y,test_size = 0.2)42print(X_train.shape)43print(X_test.shape)44print(y_train.shape)45print(y_test.shape)46 47from keras.applications.vgg16 import VGG16 48from keras.models import Sequential 49from keras.models import model_from_json 50from keras.models import Model 51from keras.layers import Input, Activation, Dense, Flatten, Dropout 52from keras.optimizers import Adam 53 54#vgg1655input_tensor = Input(shape=(224, 224, 3))56base_model = VGG16(weights='imagenet', input_tensor=input_tensor,include_top=False)57 58#後付け59top_model = Sequential()60top_model.add(Flatten(input_shape=base_model.output_shape[1:]))61top_model.add(Dense(n_classes, activation='softmax'))62 63#結合64model = Model(inputs=base_model.input, outputs = top_model(base_model.output))65 66#学習させない層67for layer in model.layers[:15]:68 layer.trainable = False69 70print('# layers = ', len(model. layers))71 72model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])73model.summary()74 75#trainデータで学習76model.fit(X_train,y_train,epochs = 20,batch_size = 16)77 78#テストデータで精度確認79score = model.evaluate(X_test,y_test,batch_size = 16)80 81#ここからグラフ化しようとしてエラーがでたコード82# 使用する評価関数を指定83metrics = ['loss', 'accuracy'] 84 85# グラフを表示するスペースを用意86plt.figure(figsize=(10, 5)) 87 88for i in range(len(metrics)):89 90 metric = metrics[i]91 92 plt.subplot(1, 2, i+1) # figureを1×2のスペースに分け、i+1番目のスペースを使う93 plt.title(metric) # グラフのタイトルを表示94 95 plt_train = history.history[metric] # historyから訓練データの評価を取り出す96 plt_test = history.history['val_' + metric] # historyからテストデータの評価を取り出す97 98 plt.plot(plt_train, label='training') # 訓練データの評価をグラフにプロット99 plt.plot(plt_test, label='test') # テストデータの評価をグラフにプロット100 plt.legend() # ラベルの表示101 102plt.show() # グラフの表示103#ここまで(グラフ化エラー)104 105import pickle 106#クラス名の保存107pickle.dump(classes,open("classes.sav","wb"))108#モデルの保存109model.save("./cnn.h5")110 111from keras.models import load_model 112import pickle 113import cv2 114 115#モデルとクラス名の読み込み116model = load_model("./cnn.h5")117classes = pickle.load(open("classes.sav","rb"))118 119#sample画像の前処理120img = cv2.imread('sample.jpg')121img = cv2.resize(img,dsize = (224,224))122img = img.astype('float32')123img /= 225.0124img = img[None, ...]125result = model.predict(img)126 127np.set_printoptions(precision = 3, suppress = True)128result*100129 130#確率が一番大きいクラス131pred = result.argmax()132pred 133 134#クラス名の呼び出し135classes[pred]

コメントを投稿

0 コメント