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

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

ただいまの
回答率

89.87%

TypeErrorとArgumentError

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,476

rich

score 10

前提・実現したいこと

現在、以下の書籍で勉強しています。
https://books.google.co.jp/books?id=egMlDwAAQBAJ&printsec=frontcover&hl=ja&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false

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

一度目に動かすと、
TypeError: expected str, bytes or os.PathLike object, not NoneType
となり、二度目以降は
ArgumentError: argument --image_dir: conflicting option string: --image_dir
このようなエラーが出てしまいます。

追記
ArgumentError                             Traceback (most recent call last)
<ipython-input-20-3948841d33b1> in <module>()
     19 
     20 FLAGS = tf.app.flags.FLAGS
---> 21 tf.app.flags.DEFINE_string('image_dir', None, "学習画像のディレクトリ")
     22 
     23 tf.app.flags.DEFINE_integer('batch_size', 128, "ミニバッチのサイズ")
というようなエラーが出ています。
別のコードで、flags.pyというファイルで
in DEFINE_string(flag_name, default_value, docstring)
     78     docstring: A helpful message explaining the use of the flag.
     79   """
---> 80   _define_helper(flag_name, default_value, docstring, str)
     81 
     82 

n _define_helper(flag_name, default_value, docstring, flagtype)
     63                               default=default_value,
     64                               help=docstring,
---> 65                               type=flagtype)
     66 
     67 
というエラーが出ています。
また、argparse.pyというファイルでも6つエラーが出ています。
これらはArgumentErrorです。

該当のソースコード

import imghdr
import math
import os

import numpy as np
import tensorflow as tf
from PIL import Image

import util.current_time as current_time
from srcnn.image_loader_vvv import load_image
from srcnn.model import model915
from srcnn.model import model915_svs
from srcnn.model import model915_sigmoid
from srcnn.model import model955_sigmoid
from srcnn.model import model955_sigmoid_color
from srcnn.model import model955_sigmoid_bn_color

MODEL = model915_sigmoid

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('image_dir', None, "学習画像のディレクトリ")

tf.app.flags.DEFINE_integer('batch_size', 128, "ミニバッチのサイズ")
tf.app.flags.DEFINE_float('learning_rate', 0.001, "学習率")

tf.app.flags.DEFINE_string('train_dir', './train_sr',
                           "学習結果を保存するディレクトリ")

tf.app.flags.DEFINE_integer('scale', 2, "")

tf.app.flags.DEFINE_boolean('log_device_placement', False,
                            "opが実行されるデバイスを表示するかを選択")
tf.app.flags.DEFINE_integer('min_after_dequeue', 30000,
                            "dequeueをはじめるサンプル数")
tf.app.flags.DEFINE_integer('num_threads', 16, "処理するスレッド数")

tf.app.flags.DEFINE_integer('max_step', -1, "学習する最大ステップ数")


def __loss(sr_images, ground_truth):
  return tf.reduce_mean(
    tf.squared_difference(sr_images, ground_truth))


def __init_optimizer(learning_rate):
  opt = tf.train.AdamOptimizer(learning_rate)
  return opt


def __train(file_list, patches_count, train_dir):
  checkpoint_path = os.path.join(train_dir, 'model.ckpt')
  file_abort = os.path.join(train_dir, 'abort.now')

  print('batch_size %d' % FLAGS.batch_size)
  step_of_epoch = math.ceil(patches_count / FLAGS.batch_size)
  print('step of epoch %d' % step_of_epoch)

  images, ground_truths = load_image(
    file_list,
    MODEL.INPUT_SIZE, MODEL.OUTPUT_SIZE,
    channels=MODEL.CHANNELS,
    scale=FLAGS.scale,
    batch_size=FLAGS.batch_size // 4)

  capacity = FLAGS.min_after_dequeue + 4 * FLAGS.batch_size

  lr_image_batch, ground_truth_batch = tf.train.shuffle_batch(
    [images, ground_truths],
    batch_size=FLAGS.batch_size,
    capacity=capacity,
    enqueue_many=True,
    min_after_dequeue=FLAGS.min_after_dequeue,
    num_threads=FLAGS.num_threads)

  sr_images = MODEL.inference(lr_image_batch)

  summary_images = tf.concat([ground_truth_batch, sr_images], axis=1)
  tf.summary.image('images', summary_images, max_outputs=4)

  loss = __loss(sr_images, ground_truth_batch)
  tf.summary.scalar('total_loss', loss)

  global_step = tf.Variable(0, trainable=False)
  opt = __init_optimizer(FLAGS.learning_rate)
  train_op = opt.minimize(loss, global_step=global_step)

  config = tf.ConfigProto(
    allow_soft_placement=True,
    log_device_placement=FLAGS.log_device_placement)

  saver = tf.train.Saver(tf.global_variables(), max_to_keep=100)
  summary_op = tf.summary.merge_all()

  coord = tf.train.Coordinator()

  with tf.Session(config=config) as sess:
    checkpoint = tf.train.get_checkpoint_state(train_dir)
    if not (checkpoint and checkpoint.model_checkpoint_path):
      sess.run(tf.global_variables_initializer())
    else:
      saver.restore(sess, checkpoint.model_checkpoint_path)

    threads = tf.train.start_queue_runners(sess=sess, coord=coord)

    summary_writer = tf.summary.FileWriter(train_dir, sess.graph)

    step = 0

    try:
      while not coord.should_stop():
        start = current_time.in_millis()

        _, step, loss_value = sess.run(
          [train_op, global_step, loss]
        )

        assert not np.isnan(loss_value), \
          'Model diverged with loss = NaN'

        elapsed = current_time.in_millis() - start

        if step % 100 == 0:
          print('Step: %d, Loss: %.6f, Time: %dms / step' % (step, loss_value, elapsed))

        if step % 100 == 0:
          summary_str = sess.run(summary_op)
          summary_writer.add_summary(summary_str, step)

        if (step % 10000 == 0):
          saver.save(sess, checkpoint_path, global_step=step)
          if os.path.exists(file_abort):
            print('abort file(%s) detected.' % file_abort)
            break

        if FLAGS.max_step > 0 and FLAGS.max_step <= step:
          print('step limit %d reached' % FLAGS.max_step)
          saver.save(sess, checkpoint_path, global_step=step)
          break

    except tf.errors.OutOfRangeError:
      print('Done training -- epoch limit reached')
    finally:
      saver.save(sess, checkpoint_path, global_step=step)
      coord.request_stop()

    # Wait for threads to finish.
    coord.join(threads)


def __count_patches(image, patch_size):
  horizontal = math.ceil(image.width / patch_size)
  vertical = math.ceil(image.height / patch_size)
  return horizontal * vertical


def __check_size_and_count_patches(file_list, patch_size):
  count = 0
  result_list = []

  for file in file_list:
    with Image.open(file) as image:
      if image.height >= patch_size and image.width >= patch_size:
        result_list.append(file)
        count += __count_patches(image, patch_size)
      else:
        print('%s is dropped. %d:%d' % (file, image.height, image.width))

  return result_list, count


def main(argv=None):
  if not os.path.exists(FLAGS.train_dir):
    os.makedirs(FLAGS.train_dir)

  image_files = os.walk(FLAGS.image_dir)

  file_list = []
  for dirpath, dirs, files in image_files:
    png_files = list(filter(lambda f: f.lower().endswith('.jpg'), files))
    file_list.extend(list(map(lambda f: os.path.join(dirpath, f), png_files)))

  file_list = list(filter(lambda f: imghdr.what(f) == 'jpeg', file_list))
  file_list, patches_count = __check_size_and_count_patches(file_list, MODEL.INPUT_SIZE)

  print('%d, %d' % (len(file_list), patches_count))

  train_dir = os.path.join(FLAGS.train_dir, MODEL.NAME)
  if not os.path.exists(train_dir):
    os.makedirs(train_dir)

  __train(file_list, patches_count, train_dir)


if __name__ == '__main__':
  tf.app.run()

tf.app.flags.DEFINE_string('image_dir', None, "学習画像のディレクトリ")
この場合、image_dirは学習させる画像のディレクトリということでしょうか?
自分のPC内の画像ディレクトリはどこにかけば良いのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/08/21 22:20

    TypeError: expected str, bytes or os.PathLike object, not NoneTypeのエラーの時に、何行目でエラーが出たかありましたか?その数字があると皆さんの回答が得られやすいと思います。image_dirにはご察しの通りディレクトリ名が必要です。windowsなら"C:\pictures"みたいな感じです。

    キャンセル

回答 1

check解決した方法

+1

画像ディレクトリを追加して動かすことができました。
ArgumentErrorは2回以上実行すると起こってしまうエラーのようです。
ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる