質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1236閲覧

CNNの精度が最初から90%を超えてしまっていて、正しく学習できているのか分からない

GK.1225

総合スコア22

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/02 12:43

編集2020/12/02 14:20

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/02 13:45 編集

対象の画像はあからさまに判別しやすいものでしょうか?
GK.1225

2020/12/02 14:23

ご質問ありがとうございます。学習対象の画像の例として2つ追記しました、見ていただけると幸いです。 二つの画像には特徴に大きな差があると考えているため、判別はしやすいと考えています。
jbpb0

2020/12/03 08:21

学習の教師データのラベル(y_train)のみ、わざと逆にしてみたら、いかがでしょうか? 逆にした教師データでちゃんと学習されたら、当然正しいy_valではほとんど正解できないので、val_Accuracyは上がりませんよね 二値分類なので、keras.utils.to_categorical()の結果は [1. 0.] か [0. 1.] しかないので、model.fit()の直前に y_train = 1 - y_train を入れたら、反転させられると思います(たぶん)
GK.1225

2020/12/03 08:40

アドバイスありがとうござます。 早速行ってみたところVal_accuracyは全く上がらず,lossも大きいままでした。
jbpb0

2020/12/03 08:52

それはつまり、CNNは間違ったy_trainに忠実に学習した、ってことですよね やっぱり、ちゃんと学習されているのではないですかね
jcs502ulf

2020/12/04 03:42

・(訓練、検証に使っていない)未知画像で推論させる ・訓練データに検証データを加えて学習させてみる の結果はどうなるでしょうか?
GK.1225

2020/12/04 07:37

ご質問ありがとうございます。(テストデータ(渦巻銀河400枚、楕円銀河400枚))でevaluateを行った所、 検証誤差: 0.153 検証正解率: 0.95 になりました。 訓練データに検証データを加えてみましたが、正解率は90%を超えたままでした。
jcs502ulf

2020/12/04 07:54

もし、訓練データに検証データが含まれた状態で学習すると、(一概には言えないかもしれませんが) ・未知画像の正解率が検証データのそれより低い(汎化性能が低い) ・trainとvalの学習曲線がほぼ同じカーブを描く というのが経験則であります。 これに該当しないということは、判別しやすいということかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問