###前提・実現したいこと
tensorflowを使ったテストプログラムを作成し、機械学習に必要十分なデータ量がどれだけなのか、その感覚を掴みたい、またはそのデータ量を推定するための見当のつけ方を身につけたい。です。
###発生している問題・エラーメッセージ
現在、「4つの値を入力とし、そのうち2番目の値と4番目の値が一致していれば0、不一致なら1を出力する」というルールで入力データ・学習データを自動生成し、学習・評価するプログラムを回しています。
**これの精度が上がらず、なぜ上がらないのかご教授いただきたい。**というのが今回の質問になります。
以下は100個のデータを渡して10000回学習を行い、1000回ごと及び学習終了後にテストデータによる評価をした結果です。誤差の値も上下を繰り返しており、精度も90%にすら届きません。
loss: 0.694365 accuracy: 0.400000 loss: 0.691950 accuracy: 0.600000 loss: 0.700912 accuracy: 0.400000 loss: 0.695201 accuracy: 0.400000 loss: 0.691830 accuracy: 0.600000 loss: 0.703954 accuracy: 0.400000 loss: 0.691710 accuracy: 0.600000 loss: 0.686128 accuracy: 0.600000 loss: 0.694570 accuracy: 0.400000 loss: 0.695068 accuracy: 0.400000 loss: 0.690764 accuracy: 0.600000
###該当のソースコード
ソースコード自体にスクリプトのパスは書かず、コマンドラインからpythonコマンドを叩いています。
Python
1import numpy as np 2from numpy.random import randint 3import tensorflow as tf 4from pprint import pprint 5 6# パラメータ設定 7BATCH_SIZE = 100 # 1回の学習に用いるデータ数 8NUM_TESTS = 25 # テストデータのデータ数 9INPUT_DIMENSION = 4 # 入力データの次元数 10HIDDEN_DIMENSION = 2 # 隠れ層の次元数 11OUTPUT_CLASSES = 2 # 2クラスロジスティック回帰 12LEARNING_RATE = 0.2 # 学習率 13TRAIN_TIMES = 10000 # 学習回数 14 15# テストデータの生成 16# [1]と[3]の値は1か2のみで、この二つを比較し出力とする 17def createSuperviserData(nDatas): 18 inData = [] 19 outData = [] 20 for i in range(nDatas): 21 tmpIn = [ 22 float(randint(18, 81)), 23 float(randint(1, 3)), 24 float(randint(18, 81)), 25 float(randint(1, 3)), 26 ] 27 if tmpIn[1] == tmpIn[3]: 28 tmpOut = [1, 0] 29 else: 30 tmpOut = [0, 1] 31 inData.append(tmpIn) 32 outData.append(tmpOut) 33 return [inData, outData] 34 35# 推論モデル 36def inference(input_placeholder): 37 # 隠れ層を一つ設ける 38 with tf.name_scope('hidden'): 39 W = tf.Variable(tf.zeros([INPUT_DIMENSION, HIDDEN_DIMENSION]), name='weight') 40 b = tf.Variable(tf.zeros([HIDDEN_DIMENSION]), name='bias') 41 _h = tf.nn.relu(tf.matmul(input_placeholder, W) + b, name='inference') 42 43 W = tf.Variable(tf.zeros([HIDDEN_DIMENSION, OUTPUT_CLASSES]), name='weight') 44 b = tf.Variable(tf.zeros([OUTPUT_CLASSES]), name='bias') 45 y = tf.add(tf.matmul(_h, W), b, name='inference') 46 47 return y 48 49# 誤差。交差エントロピーを使う 50def loss(logits, labels): 51 labels = tf.to_int64(labels) 52 xentropy = tf.nn.softmax_cross_entropy_with_logits( 53 logits=logits, labels=labels) 54 xentropy_mean = tf.reduce_mean(xentropy, name='loss') 55 return xentropy_mean 56 57# 訓練モデル。勾配降下法 58def training(loss): 59 optimizer = tf.train.GradientDescentOptimizer(LEARNING_RATE) 60 train_step = optimizer.minimize(loss, name='training') 61 return train_step 62 63# モデルの精度確認 64def accuracy(logits, labels): 65 current_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)) 66 accuracy = tf.reduce_mean(tf.cast(current_prediction, tf.float32), name='accuracy') 67 return accuracy 68 69if __name__ == '__main__': 70 # プレースホルダーなどを定義 71 with tf.name_scope('superviser'): 72 inputs = tf.placeholder(tf.float32, shape=(None, INPUT_DIMENSION), name='x') 73 labels = tf.placeholder(tf.float32, shape=(None, OUTPUT_CLASSES), name='y') 74 test_input, test_output = createSuperviserData(NUM_TESTS) 75 test_feed_dict = {inputs: test_input, labels: test_output} 76 pprint({'test_input': test_input, 'test_output': test_output}) 77 78 # 演算用のモデルなどを定義 79 with tf.name_scope('main_op'): 80 logits = inference(inputs) 81 loss = loss(logits, labels) 82 train_op = training(loss) 83 accuracy = accuracy(logits, labels) 84 pprint({'inputs':inputs,'labels':labels,'logits':logits,'loss':loss, 85 'train_op':train_op,'accuracy':accuracy}) 86 print() 87 88 # 訓練開始 89 with tf.Session() as sess: 90 init = tf.global_variables_initializer() 91 init.run() 92 for i in range(TRAIN_TIMES): 93 x, y = createSuperviserData(BATCH_SIZE) 94 sess.run(train_op, feed_dict={inputs:x, labels:y}) 95 if i % (TRAIN_TIMES//10) == 0: 96 curLoss = sess.run(loss, feed_dict=test_feed_dict) 97 curAccuracy = sess.run(accuracy, feed_dict=test_feed_dict) 98 print('loss: %.6f accuracy: %.6f' % (curLoss, curAccuracy)) 99 print() 100 print('loss: %.6f' % sess.run(loss, feed_dict=test_feed_dict)) 101 print('accuracy: %.6f' % sess.run(accuracy, feed_dict=test_feed_dict)) 102
###試したこと
LEARNING_RATEとTRAIN_TIMESを中心に、パラメータを色々いじりながら試行を繰り返していますが、何が問題なのか見えていない状態です。
###補足情報(言語/FW/ツール等のバージョンなど)
Windows 10 にてVagrantでCentOS7の環境を用意し、そこでtensorflowのテストプログラムを作成しています。
[vagrant@localhost python]$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[vagrant@localhost python]$ pyenv versions
system
- anaconda3-4.0.0 (set by /home/vagrant/.pyenv/version)
[vagrant@localhost python]$ python -V
Python 3.5.3 :: Anaconda custom (64-bit)
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2017/06/27 09:52
退会済みユーザー
2017/06/27 15:01
2017/06/28 06:26
退会済みユーザー
2017/06/28 06:42