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

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

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

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

Q&A

解決済

1回答

636閲覧

少ないサンプル数での認識率の上げ方(Tensorflow)

yunipizza

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/08/19 06:29

編集2022/08/19 06:50

前提

google colaboratoryで画像認識を行っています。
Python、Tensorflowどちらも初心者なので次のステップが分からなくて困っています。
詳しい方ご教授していただけると幸いです。

実現したいこと

4人それぞれがxと書いた画像(50ピクセル×50ピクセル)を誰が書いた画像か正しく分類する
それぞれ20枚ずつ書いてもらったのでサンプル数は計80枚です

発生している問題

認識率が上がらなくて困っています。
サンプル数が少ないので転移学習などの措置をとるのか、もしくはサンプル数を増やすのか
どういった処置が有効なのかお聞きしたいです。

試したこと

下の解説を見ながら画像認識を行いました
https://fresopiya.com/2019/05/26/tensornn/
結果として、認識率が2~3割程度でしたイメージ説明

該当のソースコード

Python

1 2#ライブラリ準備 3import matplotlib.pyplot as plt 4import os 5import cv2 6import random,math 7import numpy as np 8import tensorflow as tf 9 10#ディレクトリ、タグ、イメージサイズの設定 11DATADIR = "./drive/MyDrive/x" 12CATEGORIES = ["0","1","2","3"] 13IMG_SIZE = 50 14data = [] 15def create_data(): 16 for class_num, category in enumerate(CATEGORIES): 17 path = os.path.join(DATADIR, category) 18 for image_name in os.listdir(path): 19 try: 20 img_array = cv2.imread(os.path.join(path, image_name), cv2.IMREAD_GRAYSCALE) # 画像読み込み 21 img_resize_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) # 画像のリサイズ 22 data.append([img_resize_array, class_num]) # 画像データ、ラベル情報を追加 23 except Exception as e: 24 pass 25 26create_data() 27random.shuffle(data) # データをシャッフル 28x_data = [] # 画像データ 29y_data = [] # ラベル情報 30# データセット作成 31for feature, label in data: 32 x_data.append(feature) 33 y_data.append(label) 34# numpy配列に変換 35x_data = np.array(x_data) 36y_data = np.array(y_data) 37 38 39#学習データと検証データに分ける 40train_size = math.floor(len(data) * 0.5) 41test_size = len(data)-train_size 42x_train = x_data[0:train_size] 43y_train = y_data[0:train_size] 44x_test = x_data[train_size:] 45y_test = y_data[train_size:] 46 47#画像データを[50×50]の2次元データから[1×2500]の一次元データへ変換 48x_train2 = [] 49x_test2 = [] 50 51for i in range(train_size): 52 x_train2.append(x_train[i].reshape(-1,)) 53 54for i in range(test_size): 55 x_test2.append(x_test[i].reshape(-1,)) 56#「0〜255」の値を「0〜1」へ変換 57x_train = np.array(x_train2)/255 58x_test = np.array(x_test2)/255 59 60#onehot表現に変換 61n_labels = len(np.unique(y_train)) 62y_train = np.eye(n_labels)[y_train] 63 64n_labels = len(np.unique(y_test)) 65y_test = np.eye(n_labels)[y_test] 66 67#② 68tf.compat.v1.disable_eager_execution() 69#画像データを入れる用のプレースホルダー 70x = tf.compat.v1.placeholder(tf.float32, [None, 2500]) 71#正解データを入れる用のプレースホルダー 72y = tf.compat.v1.placeholder(tf.float32, [None, 4]) 73 74#各パラメータの初期化 75w1 = tf.Variable(tf.random.truncated_normal (shape = [2500,150],stddev = 0.01)) 76b1 = tf.Variable(tf.random.truncated_normal (shape = [150],stddev = 0.01)) 77w2 = tf.Variable(tf.random.truncated_normal (shape = [150,4],stddev = 0.01)) 78b2 = tf.Variable(tf.random.truncated_normal (shape = [4],stddev = 0.01)) 79 80#Affine1層 81a1 = tf.matmul(x,w1)+b1 82#ReLU層 83z1 = tf.nn.relu(a1) 84#Affine2層 85a2 = tf.matmul(z1,w2)+b2 86#Softmax層 87out = tf.nn.softmax(a2) 88 89#誤差関数:クロスエントロピー関数 90cross_entropy = -tf.reduce_sum(y*tf.math.log(out)) 91#パラメータ最適化関数:Adam 92optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate = 0.01) 93#学習 94train = optimizer.minimize(cross_entropy, var_list=[w1,b1,w2,b2]) 95 96#認識精度 97correct_prediction = tf.equal(tf.argmax(out,1), tf.argmax(y,1)) 98accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 99#各値を格納するための配列 100accuracyListL = []#学習用データにおける認識精度 101accuracyListT = []#テスト用データにおける認識精度 102lossListL = []#学習用データにおける損失値 103lossListT = []#テストデータにおける損失値 104params = {}#学習後のパラメータの値を保存する辞書型配列 105 106with tf.compat.v1.Session() as sess: 107 sess.run(tf.compat.v1.initialize_all_variables())#変数の初期化 108 109 #バッチサイズの指定 110 batch_size = 10 111 112 for i in range(600): 113 #トレーニングデータからランダムにバッチサイズ分のデータを取得。 114 batch_mask = np.random.choice(train_size,batch_size) 115 x_batch = x_train[batch_mask] 116 y_batch = y_train[batch_mask] 117 118 #学習 119 sess.run(train,feed_dict = {x:x_batch,y:y_batch}) 120 121 #10バッチ毎に、認識精度と損失の平均値を配列に格納。 122 if i % 10 == 0: 123 #学習させたデータの認識精度 124 resultL = sess.run(accuracy,feed_dict = {x:x_batch,y:y_batch}) 125 #テストデータを用いて認識精度の計算 126 resultT = sess.run(accuracy,feed_dict = {x:x_test,y:y_test}) 127 128 #学習データの損失の平均値 129 resultL2 = sess.run(cross_entropy,feed_dict = {x:x_batch,y:y_batch})/batch_size 130 #テストデータの損失の平均値 131 resultT2 = sess.run(cross_entropy,feed_dict = {x:x_test,y:y_test})/test_size 132 #認識精度の推移 133 accuracyListL.append(resultL) 134 accuracyListT.append(resultT) 135 136 #損失値の推移 137 lossListL.append(resultL2) 138 lossListT.append(resultT2) 139 140 print('バッチ数:',i,'認識精度(学習)',resultL,'認識精度(テスト)',resultT,'損失値(学習)',resultL2,'損失値(テスト)',resultT2) 141 142 143 #学習終了後の各パラメータの取得 144 params['w1'] = sess.run(w1) 145 params['b1'] = sess.run(b1) 146 params['w2'] = sess.run(w2) 147 params['b2'] = sess.run(b2) 148 149#認識精度のグラフ 150plt.plot(accuracyListL) 151plt.plot(accuracyListT) 152xticks, strs= plt.xticks() 153plt.xticks(xticks,["%d" % x for x in 10*xticks]) 154plt.ylabel('accuracy') 155plt.xlabel('Number of butch') 156plt.legend(['train','Test'], loc='lower right') 157plt.show() 158

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

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

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

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

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

meg_

2022/08/19 07:14

> 4人それぞれがxと書いた画像(50ピクセル×50ピクセル)を誰が書いた画像か正しく分類する それらは質問者さんが目視で見て判別できる画像なのでしょうか?
yunipizza

2022/08/19 07:47

目視で完全に判別するのは難しいですが、文字の大きさ はらいの強さ等の点で違う特徴は若干分かりました
meg_

2022/08/19 08:10

目視で判別の難しい画像で訓練データ数が少ない場合は機械学習でも判別が難しいケースもあるかと思います。
yunipizza

2022/08/19 08:25 編集

なるほど、CNNで筆跡認識を行っていた方がいたので簡単なのだと思っていました。 元々のサンプル数を増やしてみたいと思います!ご教授ありがとうございます
guest

回答1

0

ベストアンサー

色々試すことができると思います。

まず、教師データ80枚のうち、train_size = math.floor(len(data) * 0.5)とあるので、学習データとテストデータを40枚ずつに分けていますが、一般的な割合は7:3や8:2なので、もう少し学習データの割合を増やしたほうが良いと思います。

また、学習曲線を見るとまだまだ学習が収束していないので、現在600エポックを1000やそれ以上に増やして様子をみるのも良いと思います。

その次のステップとして、

  • ReLU以外の活性化関数に変える
  • Adamの学習率を変える
  • Adam以外のオプティマイザーに変える

などもできます。
更には、

  • 層を増やす
  • データ拡張(Data Augmentation)を使う
  • 畳み込み層を使う

などなど、試すことは数多くあります。
このあたりは、ディープラーニングの基礎として参考書に必ず載っていますので参考にしてください。

投稿2022/08/19 07:20

jcs502ulf

総合スコア307

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

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

yunipizza

2022/08/19 07:49

色々な選択肢を提示していただき感謝です;; 一つ一つ調べながらやってみます!基礎についても学んでみます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問