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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

解決済

Tensorflow画像識別実行結果がおかしい

pfirsich
pfirsich

総合スコア15

Python 3.x

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

4回答

0評価

3クリップ

5716閲覧

投稿2017/06/30 07:32

###前提・実現したいこと
プログラミング初心者です以下当然のことを記載していたらすいません。

TensorFlowでアニメゆるゆりの制作会社を識別する(http://kivantium.hateblo.jp/entry/2015/11/18/233834)のブログを参考に画像認識識別をしようと実行したところ下記のように同じ結果しかでません。

1番最初に動かした時はstep145くらいまで精度があがり最高0.992843までいきましたが、step146になった途端精度が0.0889571に下がりそれ以降全200step行いましたがずっとその精度が表示され、その後何度試しても下記のような結果がでてしまうようになりました。

正常に動かない原因は何でしょうか。

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

step 0 training accuracy 0.0889571 test accuracy 0.2 step 1 training accuracy 0.0889571 test accuracy 0.2 step 2 training accuracy 0.0889571 test accuracy 0.2 step 3 training accuracy 0.0889571 test accuracy 0.2 step 4 training accuracy 0.0889571 test accuracy 0.2 step 5 training accuracy 0.0889571 test accuracy 0.2 step 6 training accuracy 0.0889571 test accuracy 0.2 step 7 training accuracy 0.0889571 test accuracy 0.2 step 8 training accuracy 0.0889571 test accuracy 0.2 step 9 training accuracy 0.0889571 test accuracy 0.2 step 10 training accuracy 0.0889571 test accuracy 0.2 step 11 training accuracy 0.0889571 test accuracy 0.2 step 12 training accuracy 0.0889571 test accuracy 0.2 step 13 training accuracy 0.0889571 test accuracy 0.2 step 14 training accuracy 0.0889571 test accuracy 0.2 step 15 training accuracy 0.0889571 test accuracy 0.2 step 16 training accuracy 0.0889571 test accuracy 0.2 step 17 training accuracy 0.0889571 test accuracy 0.2 step 18 training accuracy 0.0889571 test accuracy 0.2 step 19 training accuracy 0.0889571 test accuracy 0.2

###該当のソースコード

import sys import cv2 import numpy as np import tensorflow as tf import tensorflow.python.platform NUM_CLASSES =10 IMAGE_SIZE = 28 IMAGE_PIXELS = IMAGE_SIZE*IMAGE_SIZE*3 flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_string('train', '/home/k123/anaconda2/envs/tensorflow/data/train2.txt', 'File name of train data') flags.DEFINE_string('test', '/home/k123/anaconda2/envs/tensorflow/data/test.txt', 'File name of train data') flags.DEFINE_string('train_dir', '/home/k123/anaconda2/envs/tensorflow/data/gazo', 'Directory to put the training data.') flags.DEFINE_integer('max_steps', 20, 'Number of steps to run trainer.') flags.DEFINE_integer('batch_size', 10, 'Batch size' 'Must divide evenly into the dataset sizes.') flags.DEFINE_float('learning_rate', 1e-4, 'Initial learning rate.') def inference(images_placeholder, keep_prob): # 重みを標準偏差0.1の正規分布で初期化 def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) # バイアスを標準偏差0.1の正規分布で初期化 def bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) # 畳み込み層の作成 def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') # プーリング層の作成 def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') # 入力を28x28x3に変形 x_image = tf.reshape(images_placeholder, [-1, 28, 28, 3]) # 畳み込み層1の作成 with tf.name_scope('conv1') as scope: W_conv1 = weight_variable([5, 5, 3, 32]) b_conv1 = bias_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # プーリング層1の作成 with tf.name_scope('pool1') as scope: h_pool1 = max_pool_2x2(h_conv1) # 畳み込み層2の作成 with tf.name_scope('conv2') as scope: W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # プーリング層2の作成 with tf.name_scope('pool2') as scope: h_pool2 = max_pool_2x2(h_conv2) # 全結合層1の作成 with tf.name_scope('fc1') as scope: W_fc1 = weight_variable([7*7*64, 1024]) b_fc1 = bias_variable([1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) # dropoutの設定 h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) # 全結合層2の作成 with tf.name_scope('fc2') as scope: W_fc2 = weight_variable([1024, NUM_CLASSES]) b_fc2 = bias_variable([NUM_CLASSES]) # ソフトマックス関数による正規化 with tf.name_scope('softmax') as scope: y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) # 各ラベルの確率のようなものを返す return y_conv def loss(logits, labels): # 交差エントロピーの計算 cross_entropy = -tf.reduce_sum(labels*tf.log(logits)) # TensorBoardで表示するよう指定 tf.scalar_summary("cross_entropy", cross_entropy) return cross_entropy def training(loss, learning_rate): train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss) return train_step def accuracy(logits, labels): correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) tf.scalar_summary("accuracy", accuracy) return accuracy if __name__ == '__main__': # ファイルを開く f = open(FLAGS.train, 'r') # データを入れる配列 train_image = [] train_label = [] for line in f: # 改行を除いてスペース区切りにする line = line.rstrip() l = line.split() # データを読み込んで28x28に縮小 img = cv2.imread(l[0]) img = cv2.resize(img, (28, 28)) # 一列にした後、0-1のfloat値にする train_image.append(img.flatten().astype(np.float32)/255.0) # ラベルを1-of-k方式で用意する tmp = np.zeros(NUM_CLASSES) tmp[int(l[1])] = 1 train_label.append(tmp) # numpy形式に変換 train_image = np.asarray(train_image) train_label = np.asarray(train_label) f.close() f = open(FLAGS.test, 'r') test_image = [] test_label = [] for line in f: line = line.rstrip() l = line.split() img = cv2.imread(l[0]) img = cv2.resize(img, (28, 28)) test_image.append(img.flatten().astype(np.float32)/255.0) tmp = np.zeros(NUM_CLASSES) tmp[int(l[1])] = 1 test_label.append(tmp) test_image = np.asarray(test_image) test_label = np.asarray(test_label) f.close() with tf.Graph().as_default(): # 画像を入れる仮のTensor images_placeholder = tf.placeholder("float", shape=(None, IMAGE_PIXELS)) # ラベルを入れる仮のTensor labels_placeholder = tf.placeholder("float", shape=(None, NUM_CLASSES)) # dropout率を入れる仮のTensor keep_prob = tf.placeholder("float") # inference()を呼び出してモデルを作る logits = inference(images_placeholder, keep_prob) # loss()を呼び出して損失を計算 loss_value = loss(logits, labels_placeholder) # training()を呼び出して訓練 train_op = training(loss_value, FLAGS.learning_rate) # 精度の計算 acc = accuracy(logits, labels_placeholder) # 保存の準備 saver = tf.train.Saver() # Sessionの作成 sess = tf.Session() # 変数の初期化 sess.run(tf.initialize_all_variables()) # TensorBoardで表示する値の設定 summary_op = tf.merge_all_summaries() summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph_def) # 訓練の実行 for step in range(FLAGS.max_steps): for i in range(len(train_image)//FLAGS.batch_size): # batch_size分の画像に対して訓練の実行 batch = FLAGS.batch_size*i # feed_dictでplaceholderに入れるデータを指定する sess.run(train_op, feed_dict={ images_placeholder: train_image[batch:batch+FLAGS.batch_size], labels_placeholder: train_label[batch:batch+FLAGS.batch_size], keep_prob: 0.5}) # 1 step終わるたびに精度を計算する train_accuracy = sess.run(acc, feed_dict={ images_placeholder: train_image, labels_placeholder: train_label, keep_prob: 1.0}) print('step %d training accuracy %g'%(step, train_accuracy)) # 1 step終わるたびにTensorBoardに表示する値を追加する summary_str = sess.run(summary_op, feed_dict={ images_placeholder: train_image, labels_placeholder: train_label, keep_prob: 1.0}) summary_writer.add_summary(summary_str, step) # 訓練が終了したらテストデータに対する精度を表示 print('test accuracy %g'%(sess.run(acc, feed_dict={ images_placeholder: test_image, labels_placeholder: test_label, keep_prob: 1.0}))) # 最終的なモデルを保存 save_path = saver.save(sess, "model0.ckpt")

###試したこと
◎画像の分類するクラス数を減らして実行したところ、トレーニング精度の数値が現在の0.889571から変わったもののやはり学習回数をいくらつんでも同じ精度しか表示されませんでした。
◎モデルファイル”model0.ckpt”を一回消して実行してみましたが変わりませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
ubuntu16.04/python3.5
画像形式はjpgまたはpngです。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/01 01:30

訓練用の画像と検証用の画像、それぞれの数(枚数)はいくつでしょうか?
pfirsich

2017/07/02 12:10

練習用1000枚、検証用3枚で実行しました。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。