前提
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
回答1件
あなたの回答
tips
プレビュー