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

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

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

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

Neural Network Console

Neural Network Consoleは、ソニー社が開発したディープラーニング・ツール。ニューラルネットワークを視覚的に設計することが可能で、学習や評価をスムーズに実現できます。また、ニューラルネットワークを自動的に構築する機能も備わっています。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Q&A

0回答

539閲覧

画像分類において精度を向上させる方法

ryo_fk

総合スコア0

Keras

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

Neural Network Console

Neural Network Consoleは、ソニー社が開発したディープラーニング・ツール。ニューラルネットワークを視覚的に設計することが可能で、学習や評価をスムーズに実現できます。また、ニューラルネットワークを自動的に構築する機能も備わっています。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

0グッド

0クリップ

投稿2022/12/21 06:45

前提

kerasを用いて、2 クラスの画像分類を行うプログラムを作成しています。

100枚強程画像の入ったフォルダから画像を読み取り、npyファイルに保存→CNNで学習→推論を行なっているのですが、lossが0.69前後、accuracyも0.50前後と精度が悪いです。

プログラムのミス、精度を上げる方法をご教授頂ければ幸いです。

実現したいこと

  • lossの減少
  • accuracyの向上

発生している問題・エラーメッセージ

Epoch 25/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6936 - accuracy: 0.4909 Epoch 26/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6935 - accuracy: 0.5048 Epoch 27/30 131/131 [==============================] - 5s 40ms/step - loss: 0.6933 - accuracy: 0.5074 Epoch 28/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6934 - accuracy: 0.5048 Epoch 29/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6933 - accuracy: 0.5067 Epoch 30/30 131/131 [==============================] - 5s 39ms/step - loss: 0.6935 - accuracy: 0.5000 1/1 [==============================] - 0s 78ms/step 判別した画像 >>> ./god_judge/IMG_0206.jpeg 判別精度([良好,不良]) >>> [[0.5187298 0.48127016]] 判別結果 >>> 良好胚

該当のソースコード

pyhotn

1import cv2 2import sys 3from PIL import Image 4import os 5import tensorflow as tf 6import datetime 7import random 8import glob 9import numpy as np 10import h5py 11from PIL import ImageFile 12import matplotlib.pyplot as plt 13import keras 14from keras.models import Sequential 15from keras.layers import Convolution2D, MaxPooling2D 16from keras.layers import Activation, Dropout, Flatten, Dense 17from keras.optimizers import RMSprop 18from keras.utils import np_utils 19from keras.models import load_model 20from keras.callbacks import EarlyStopping 21from tensorflow.keras.utils import plot_model, to_categorical 22from tensorflow.keras import datasets, layers, models 23 24 25# indexを教師ラベルとして割り当て(0にはgod、1にはbad) 26classes = ["god", "bad"] 27num_classes = len(classes) 28image_size = 64 29num_testdata = 50 30 31X_train = [] 32X_test = [] 33y_train = [] 34y_test = [] 35 36for index, classlabel in enumerate(classes): 37 38 #学習用ファイルのインポート 39 files = glob.glob("god_learn/*.jpeg") 40 #files = glob.glob("bad_learn/*.jpeg") 41 image = cv2.imread(files[0]) 42 #print(files) 43 for i, file in enumerate(files): 44 image = Image.open(file) 45 image = image.convert("RGB") 46 image = image.resize((image_size, image_size)) 47 data = np.asarray(image) 48 49 #print(image) 50 #print(data) 51 if i < num_testdata: 52 X_test.append(data) 53 y_test.append(index) 54 else: 55 56 # angleに代入される値 57 # -20 58 # -15 59 # -10 60 # -5 61 # 0 62 # 5 63 # 10 64 # 15 65 # 画像を5度ずつ回転 66 for angle in range(-20, 20, 5): 67 68 img_r = image.rotate(angle) 69 data = np.asarray(img_r) 70 X_train.append(data) 71 y_train.append(index) 72 # FLIP_LEFT_RIGHT は 左右反転 73 img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) 74 data = np.asarray(img_trains) 75 X_train.append(data) 76 y_train.append(index) # indexを教師ラベルとして割り当てる.0にはgodを指定し、1にはbadを指定 77 78X_train = np.asanyarray(X_train) 79X_test = np.asanyarray(X_test) 80y_train = np.asanyarray(y_train) 81y_test = np.asanyarray(y_test) 82 83xy = (X_train, X_test, y_train, y_test) 84np.save('./imori.npy', xy) 85classes = ["god", "bad"] 86num_classes = len(classes) 87image_size = 64 88 89#データを読み込む 90def load_data(): 91 X_train, X_test, y_train, y_test = np.load('./imori.npy', allow_pickle=True) 92 # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) 93 X_train = X_train.astype("float") / 255 94 X_test = X_test.astype("float") / 255 95 # to_categorical()にてラベルをone hot vector化 96 y_train = np_utils.to_categorical(y_train, num_classes) 97 y_test = np_utils.to_categorical(y_test, num_classes) 98 99 return X_train, y_train, X_test, y_test 100 101#モデルの学習 102def train(X, y, X_test, y_test): 103 model = Sequential() 104 105 #conv2D(64,(3,3)) →3✖️3のフィルタを64枚使う 106 model.add(Convolution2D(32,3, 3, padding='same',input_shape=X.shape[1:])) 107 model.add(Activation('relu')) 108 model.add(Convolution2D(32,(3, 3))) 109 model.add(Activation('relu')) 110 model.add(MaxPooling2D(pool_size=(2,2))) 111 model.add(Dropout(0.1)) 112 113 model.add(Convolution2D(64,3, 3, padding='same')) 114 model.add(Activation('relu')) 115 model.add(Convolution2D(64,(3, 3))) 116 model.add(Activation('relu')) 117 model.add(MaxPooling2D(pool_size=(2,2))) 118 model.add(Dropout(0.1)) 119 120 model.add(Flatten()) 121 model.add(Dense(512)) 122 model.add(Activation('relu')) 123 model.add(Dropout(0.5)) 124 model.add(Dense(2)) # 識別のため、2クラス分類のため2を指定 125 model.add(Activation('softmax')) 126 127 128 # HDF5ファイルにKerasのモデルを保存 129 #ls:学習率(一度にどのくらいパラメータを変化させるか) decay:各更新の学習減衰率 130 adam = RMSprop(lr=0.01, decay=1e-6) 131 model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy']) 132 #学習回数を50回に設定 133 model.fit(X, y, batch_size=64, epochs=30) 134 135 # HDF5ファイルにKerasのモデルを保存 136 model.save('./cnn.h5') 137 138 139 140 return model 141 142def main(): 143#読み込み 144 X_train, y_train, X_test, y_test = load_data() 145# モデルの学習 146 model = train(X_train, y_train, X_test, y_test) 147 148main() 149 150#推論 151 152cnn = "./cnn.h5" 153 154#判別したい画像のインポート 155pic = "./god_judge/IMG_0206.jpeg" 156#pic = "./bad_judge/IMG_0209.jpeg" 157 158imsize = (64, 64) 159 160def load_image(path): 161 img = Image.open(path) 162 img = img.convert('RGB') 163 # 学習時に、(64, 64, 3)で学習したので、画像の縦・横は今回 変数imsizeの(64, 64)にリサイズします。 164 img = img.resize(imsize) 165 # 画像データをnumpy配列の形式に変更 166 img = np.asarray(img) 167 img = img / 255.0 168 return img 169 #print(img) 170 171model = load_model(cnn) 172img = load_image(pic) 173#print(img) 174prd = model.predict(np.array([img])) 175prelabel = np.argmax(prd, axis=1) 176print("判別した画像 >>>", pic) 177print("判別精度([良好,不良]) >>>", prd) 178 179if prelabel == 0: 180 print("判別結果 >>> 良好胚") 181elif prelabel == 1: 182 print("判別結果 >>> 不良胚")

試したこと

  • バッチサイズ、学習回数の変更
  • 中間層の追加
  • 学習率、学習減衰率の変更

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

PondVillege

2022/12/21 09:29

そのコードを上から下まで実行してもgod_learnに入ってるデータしか使われないように見えますが,Jupyter Notebook等で操作それているのですか?再現性が無いので回答が得られないものと思われます
ryo_fk

2022/12/21 10:49

コメント頂きありがとうございます。 vscでコードを書いてコマンドラインから操作しています。私が素人故にご迷惑お掛けして申し訳ないです。 もう少し見直してみます。
PondVillege

2022/12/21 14:02 編集

ということは,imori.npyにはgod_learnに入っているデータしか扱えていない.ということになるんじゃないでしょうか.godに対する反例としてbadを入力していない現状では,ニューラルネットは何ら学習しませんので,見直しのほどお願いします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問