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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

解決済

機械学習の精度が上がらない

gittib_gittib
gittib_gittib

総合スコア102

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

1回答

0評価

4クリップ

27281閲覧

投稿2017/06/20 05:24

編集2017/06/28 06:29

###前提・実現したいこと
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

import numpy as np from numpy.random import randint import tensorflow as tf from pprint import pprint # パラメータ設定 BATCH_SIZE = 100 # 1回の学習に用いるデータ数 NUM_TESTS = 25 # テストデータのデータ数 INPUT_DIMENSION = 4 # 入力データの次元数 HIDDEN_DIMENSION = 2 # 隠れ層の次元数 OUTPUT_CLASSES = 2 # 2クラスロジスティック回帰 LEARNING_RATE = 0.2 # 学習率 TRAIN_TIMES = 10000 # 学習回数 # テストデータの生成 # [1]と[3]の値は1か2のみで、この二つを比較し出力とする def createSuperviserData(nDatas): inData = [] outData = [] for i in range(nDatas): tmpIn = [ float(randint(18, 81)), float(randint(1, 3)), float(randint(18, 81)), float(randint(1, 3)), ] if tmpIn[1] == tmpIn[3]: tmpOut = [1, 0] else: tmpOut = [0, 1] inData.append(tmpIn) outData.append(tmpOut) return [inData, outData] # 推論モデル def inference(input_placeholder): # 隠れ層を一つ設ける with tf.name_scope('hidden'): W = tf.Variable(tf.zeros([INPUT_DIMENSION, HIDDEN_DIMENSION]), name='weight') b = tf.Variable(tf.zeros([HIDDEN_DIMENSION]), name='bias') _h = tf.nn.relu(tf.matmul(input_placeholder, W) + b, name='inference') W = tf.Variable(tf.zeros([HIDDEN_DIMENSION, OUTPUT_CLASSES]), name='weight') b = tf.Variable(tf.zeros([OUTPUT_CLASSES]), name='bias') y = tf.add(tf.matmul(_h, W), b, name='inference') return y # 誤差。交差エントロピーを使う def loss(logits, labels): labels = tf.to_int64(labels) xentropy = tf.nn.softmax_cross_entropy_with_logits( logits=logits, labels=labels) xentropy_mean = tf.reduce_mean(xentropy, name='loss') return xentropy_mean # 訓練モデル。勾配降下法 def training(loss): optimizer = tf.train.GradientDescentOptimizer(LEARNING_RATE) train_step = optimizer.minimize(loss, name='training') return train_step # モデルの精度確認 def accuracy(logits, labels): current_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)) accuracy = tf.reduce_mean(tf.cast(current_prediction, tf.float32), name='accuracy') return accuracy if __name__ == '__main__': # プレースホルダーなどを定義 with tf.name_scope('superviser'): inputs = tf.placeholder(tf.float32, shape=(None, INPUT_DIMENSION), name='x') labels = tf.placeholder(tf.float32, shape=(None, OUTPUT_CLASSES), name='y') test_input, test_output = createSuperviserData(NUM_TESTS) test_feed_dict = {inputs: test_input, labels: test_output} pprint({'test_input': test_input, 'test_output': test_output}) # 演算用のモデルなどを定義 with tf.name_scope('main_op'): logits = inference(inputs) loss = loss(logits, labels) train_op = training(loss) accuracy = accuracy(logits, labels) pprint({'inputs':inputs,'labels':labels,'logits':logits,'loss':loss, 'train_op':train_op,'accuracy':accuracy}) print() # 訓練開始 with tf.Session() as sess: init = tf.global_variables_initializer() init.run() for i in range(TRAIN_TIMES): x, y = createSuperviserData(BATCH_SIZE) sess.run(train_op, feed_dict={inputs:x, labels:y}) if i % (TRAIN_TIMES//10) == 0: curLoss = sess.run(loss, feed_dict=test_feed_dict) curAccuracy = sess.run(accuracy, feed_dict=test_feed_dict) print('loss: %.6f accuracy: %.6f' % (curLoss, curAccuracy)) print() print('loss: %.6f' % sess.run(loss, feed_dict=test_feed_dict)) print('accuracy: %.6f' % sess.run(accuracy, feed_dict=test_feed_dict))

###試したこと
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)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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