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

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

ただいまの
回答率

90.33%

  • Python 3.x

    7401questions

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

  • TensorFlow

    758questions

オリジナルデータを用いて顔識別をしたいのですが、学習を開始すると動作が停止してしまいます。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 318

Potack

score 1

前提・実現したいこと

ここに質問したいことを詳細に書いてください
画像認識を勉強しています。
tensorflowにより、オリジナルデータを用いて、顔識別を行おうとしていますが、エラーを出さずにプログラムの動作が停止してしまいます。
原因の調査をよろしくお願いします。

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

 _, loss_value, accuracy_value = sess.run([train_op, loss, accuracy], feed_dict={keep_prob: 0.5})
動作停止

該当のソースコード

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 14 14:16:48 2017

@author: Owner
"""

import tensorflow as tf

import os
from enum import Enum


class Channel(Enum):
  os.chdir(r"D:\WinPython-64bit-3.5.3.1Qt5\face\data")
  KOHNO = 0
  FUKAMI = 1
  NAKAHIRA = 2

LOG_DIR = 'log'

def load_data(csvpath, batch_size, image_size, class_count, shuffle=False, min_after_dequeue=1000):

  queue = tf.train.string_input_producer([csvpath], shuffle=shuffle)
  reader = tf.TextLineReader()
  key, value = reader.read(queue)
  imagepath, label = tf.decode_csv(value, [['imagepath'], [0]])

  jpeg = tf.read_file(imagepath)
  image = tf.image.decode_jpeg(jpeg, channels=3)
  image = tf.image.resize_images(image, [image_size, image_size])
  # 平均が 0 になるようにスケーリングする。
  image = tf.image.per_image_standardization(image)

  # ラベルの値を one-hot 表現に変換する。
  label = tf.one_hot(label, depth=class_count, dtype=tf.float32)

  capacity = min_after_dequeue + batch_size * 3

  if shuffle:
    images, labels = tf.train.shuffle_batch([image, label], batch_size=batch_size, num_threads=3, capacity=capacity, min_after_dequeue=min_after_dequeue)
  else:
    images, labels = tf.train.batch([image, label], batch_size=batch_size, capacity=capacity)

  return images, labels

class CNN:
  def __init__(self, image_size=48, class_count=2, color_channel_count=3):
    self.image_size = image_size
    self.class_count = class_count
    self.color_channel_count = color_channel_count

  # 推論のための関数。
  def inference(self, x, keep_prob, softmax=False):
    # 重みを格納するための tf.Variable を生成する。
    def weight_variable(shape):
      initial = tf.truncated_normal(shape, stddev=0.1)

      return tf.Variable(initial)

    # バイアスを格納するための tf.Variable を生成する。
    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')

    # [2x2] の大きさ、移動量 2 でプーリングを行う。
    def max_pool_2x2(x):
      return tf.nn.max_pool(x,
        ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],
        padding='SAME')

    x_image = tf.reshape(
      x,
      [-1, self.image_size, self.image_size, self.color_channel_count])

    with tf.name_scope('conv1'):
      W_conv1 = weight_variable([5, 5, self.color_channel_count, 32])
      b_conv1 = bias_variable([32])
      h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

    with tf.name_scope('pool1'):
      h_pool1 = max_pool_2x2(h_conv1)

    with tf.name_scope('conv2'):
      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)

    with tf.name_scope('pool2'):
      h_pool2 = max_pool_2x2(h_conv2)

    with tf.name_scope('fc1'):
      W_fc1 = weight_variable(
        [int(self.image_size / 4) * int(self.image_size / 4) * 64, 1024])
      b_fc1 = bias_variable([1024])
      h_pool2_flat = tf.reshape(
        h_pool2,
        [-1, int(self.image_size / 4) * int(self.image_size / 4) * 64])
      h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
      h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

    with tf.name_scope('fc2'):
      W_fc2 = weight_variable([1024, self.class_count])
      b_fc2 = bias_variable([self.class_count])
      y = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

    if softmax:
      with tf.name_scope('softmax'):
        y = tf.nn.softmax(y)

    return y

  # 推論結果と正解の誤差を計算するための損失関数。
  def loss(self, y, labels):
    # 交差エントロピーを計算する。
    # tf.nn.softmax_cross_entropy_with_logits の引数 logits には
    # ソフトマックス関数を適用した変数を与えないこと。
    cross_entropy = tf.reduce_mean(
      tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=labels))
    tf.summary.scalar('cross_entropy', cross_entropy)

    return cross_entropy

  # 学習のための関数
  def training(self, cross_entropy, learning_rate=1e-4):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

    return train_step

  # 正答率 (accuracy) を求める。
  def accuracy(self, y, labels):
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(labels, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.summary.scalar('accuracy', accuracy)

    return accuracy


os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_integer('image_size', 48, 'Image size.')
flags.DEFINE_integer('step_count', 1000, 'Number of steps.')
flags.DEFINE_integer('batch_size', 50, 'Batch size.')
flags.DEFINE_float('learning_rate', 1e-4, 'Initial learning rate.')

def main():
  with tf.Graph().as_default():
    cnn = CNN(image_size=FLAGS.image_size, class_count=len(Channel))
    images, labels = load_data(
      r"D:\WinPython-64bit-3.5.3.1Qt5\face\data\train\data.csv",
      batch_size=FLAGS.batch_size,
      image_size=FLAGS.image_size,
      class_count=len(Channel),
      shuffle=True)
    keep_prob = tf.placeholder(tf.float32)
    logits = cnn.inference(images, keep_prob)
    loss = cnn.loss(logits, labels)
    train_op = cnn.training(loss, FLAGS.learning_rate)
    accuracy = cnn.accuracy(logits, labels)

    saver = tf.train.Saver()
    init_op = tf.global_variables_initializer()
    #summary_op = tf.summary.merge_all()
    #summary_writer = tf.summary.FileWriter("./"+LOG_DIR, graph=sess.graph)
    count = 1
    sess = tf.Session()
    sess.run(init_op)
    for step in range(1, FLAGS.step_count + 1):
        print("a")
        _, loss_value, accuracy_value = sess.run([train_op, loss, accuracy], feed_dict={keep_prob: 0.5})
        print(count)
        count *= 1

        if step % 10 == 0:
          print("step {step}: training accuracy {accuracy_value}".format(**locals()))
          #summary = sess.run(summary_op, feed_dict={keep_prob: 1.0})
          #summary_writer.add_summary(summary, step)


    save_path = saver.save(sess, os.path.join(LOG_DIR, 'model.ckpt'))
if __name__ == '__main__':
  main()

試したこと

tf.reshapeのパラメータ変更, 指定ディレクトリのパス変更等

補足情報(言語/FW/ツール等のバージョンなど)

環境 Windows10, Spyder(Python3.5)
モジュール tensorflow ver1.0.1

参考ソースコードURL
https://qiita.com/QUANON/items/b35003d347edb1cd9ec3#_reference-e18e3376dd2be6ba67d0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

feed_dict={keep_prob: 0.5}
データを与えていないからではないでしょうか。


TFRecordsなら
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
などが足りてないのでしょうか。
http://tensorflow.classcat.com/2016/02/13/tensorflow-how-tos-reading-data/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • Python 3.x

    7401questions

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

  • TensorFlow

    758questions