CNNで2分類を行っています。
20epochで学習を行い、accuracyとlossの推移が下の図になります。
Lossはtrain,valともに少なくなっている推移のため正しく学習できているのではないかと考えているのですが、val_Accuracyが1エポック目から(表示では0.0の部分になります) 90%を超えてしまっているのが気になっています。
検証データに訓練データが混ざってしまっているようなことはないはずなのですが、正しく学習できているのか分からず、質問をしようと考えました。
ご教授お願いします。
追記
用いているデータの枚数は訓練データ(1500,1500) 検証(250,250)で行っています。
追記2(データの内容)
渦巻銀河の画像(例)
楕円銀河の画像(例)
学習結果の推移
import os import pickle import numpy as np import keras import time import glob import matplotlib.pyplot as plt from keras.preprocessing.image import load_img, img_to_array from keras.models import Sequential from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, BatchNormalization, Activation, Dropout, Flatten from keras.optimizers import Adam from keras.utils import plot_model from keras import optimizers from sklearn.model_selection import train_test_split from keras.callbacks import EarlyStopping, ModelCheckpoint from keras.optimizers import Adam BATCH_SIZE = 64 NUM_CLASSES = 2 EPOCHS = 20 handwritten_number_names = ['Eliptical', 'Spiral'] #2 各種設定 train_data_path = '/content/データセット(ScとEr)' # ここを変更。Colaboratoryにアップロードしたzipファイルを解凍後の、データセットのフォルダ名を入力 image_size = 180 # ここを変更。必要に応じて変更してください。「28」を指定した場合、縦28横28ピクセルの画像に変換します。 color_setting = 1 #ここを変更。データセット画像のカラー:「1」はモノクロ・グレースケール。「3」はカラー。 folder = ['Er', 'Sc'] # ここを変更。データセット画像のフォルダ名(クラス名)を半角英数で入力 class_number = len(folder) print('今回のデータで分類するクラス数は「', str(class_number), '」です。') #3 データセットの読み込みとデータ形式の設定・正規化・分割 X_image = [] Y_label = [] start_time = time.time() for index, name in enumerate(folder): read_data=train_data_path+"/"+name files = glob.glob(read_data + '/*.jpeg') #ここを変更。png形式のファイルを利用する場合のサンプルです。 print('--- 読み込んだデータセットは', read_data, 'です。') for i, file in enumerate(files): if color_setting == 1: img = load_img(file, color_mode = 'grayscale' ,target_size=(image_size, image_size)) elif color_setting == 3: img = load_img(file, color_mode = 'rgb' ,target_size=(image_size, image_size)) array = img_to_array(img) X_image.append(array) Y_label.append(index) print('Computation time(計算時間):{0:.3f} sec(秒)'.format(time.time() - start_time)) X_image = np.array(X_image) Y_label = np.array(Y_label) X_image = X_image.astype('float32')/255 Y_label = keras.utils.to_categorical(Y_label, class_number) train_images, valid_images, train_labels, valid_labels = train_test_split(X_image, Y_label, test_size=0.20) x_train = train_images y_train = train_labels x_test = valid_images y_test = valid_labels train_images, valid_images, train_labels, valid_labels = train_test_split(x_test, y_test, test_size=0.50) x_test = train_images y_test = train_labels x_val = valid_images y_val = valid_labels model = Sequential() model.add(Conv2D(32, (3, 3), padding='same',input_shape=(image_size, image_size, color_setting), activation='relu')) #model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) #model.add(Dropout(0.5)) model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(Dropout(0.5)) #model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.5)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(128, activation='relu')) model.add(Dense(class_number, activation='softmax')) model.summary() model.compile(loss='binary_crossentropy',optimizer=optimizers.Adam(lr=1e-5),metrics=['accuracy']) print('反復学習回数:', EPOCHS) fit_record=model.fit(x_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, verbose=1, validation_data=(x_val, y_val)) # 青い線で誤差の履歴をプロットします、検証時誤差は黒い線で plt.plot(fit_record.history['loss'], "-D", color="blue", label="train_loss", linewidth=2) plt.plot(fit_record.history['val_loss'], "-D", color="black", label="val_loss", linewidth=2) plt.title('LOSS') plt.xlabel('Epochs') plt.ylabel('Loss') plt.legend(loc='upper right') plt.show() # 緑の線で精度の履歴をプロットします、検証時制度は黒い線で plt.plot(fit_record.history['accuracy'],"-o", color="green", label="train_accuracy", linewidth=2) plt.plot(fit_record.history['val_accuracy'],"-o",color="black", label="val_accuracy", linewidth=2) plt.title('ACCURACY') plt.xlabel('Epochs') plt.ylabel('Accuracy') plt.legend(loc="lower right") plt.show()
あなたの回答
tips
プレビュー