Exemple #1
0
def train():
    '''
    Train CNN_tiny for a number of steps.
    '''
    with tf.Graph().as_default():
        # globalなstep数
        global_step = tf.Variable(0, trainable=False)

        # 教師データ
        image_input = ImageInput('./data/101Caltech_shuffles.txt')
        print("the number of train data: %d" % (len(image_input.image_paths)))

        images = tf.placeholder(tf.float32, [None, 224, 224, 3])
        labels = tf.placeholder(tf.float32, [None, 101])
        keep_conv = tf.placeholder(tf.float32)
        keep_hidden = tf.placeholder(tf.float32)

        # graphのoutput
        logits, transform_result = model.inference(images, keep_conv,
                                                   keep_hidden)

        # loss graphのoutputとlabelを利用
        # loss = model.loss(logits, labels)

        loss = tf.reduce_mean(
            tf.nn.softmax_cross_entropy_with_logits(logits, labels))
        predict_op = tf.argmax(logits, 1)

        # 学習オペレーション
        train_op = op.train(loss, global_step)

        # サマリー
        summary_op = tf.merge_all_summaries()

        # 初期化オペレーション
        init_op = tf.initialize_all_variables()

        # Session
        sess = tf.Session(config=tf.ConfigProto(
            log_device_placement=LOG_DEVICE_PLACEMENT))

        # saver
        #saver = tf.train.Saver(tf.all_variables())

        sess.run(init_op)
        # pretrainと全体を分けて保存
        pretrain_params = {}
        train_params = {}
        for variable in tf.trainable_variables():
            variable_name = variable.name
            #print("parameter: %s" %(variable_name))
            scope, name = variable_name.split("/")
            target, _ = name.split(":")
            if variable_name.find('spatial_transformer') < 0:
                print("pretrain parameter: %s" % (variable_name))
                pretrain_params[variable_name] = variable
            print("train parameter: %s" % (variable_name))
            train_params[variable_name] = variable
        saver_cnn = tf.train.Saver(pretrain_params)
        saver_transformers = tf.train.Saver(train_params)

        # pretrained_model
        if FLAGS.fine_tune:
            ckpt = tf.train.get_checkpoint_state(PRETRAIN_DIR)
            if ckpt and ckpt.model_checkpoint_path:
                print("Pretrained Model Loading.")
                saver_cnn.restore(sess, ckpt.model_checkpoint_path)
                print("Pretrained Model Restored.")
            else:
                print("No Pretrained Model.")

        # pretrained model from another type models.
        #    # saver
        #    print type(tf.all_variables())
        #    for variable in tf.trainable_variables():
        #        variable_name = variable.name
        #        variable_value = variable.eval(sess)
        #        if variable_name.find('softmax_linear') < 0 and variable_name.find('spatial_transformer') < 0:
        #            print("trained parameter: %s" %(variable_name))
        #            scope, name = variable_name.split("/")
        #            target, _ = name.split(":")
        #            with tf.variable_scope(scope, reuse=True):
        #                sess.run(tf.get_variable(target).assign(variable_value))
        #    trained_model = FLAGS.trained_model
        #    print trained_model

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

        # サマリーのライターを設定
        summary_writer = tf.train.SummaryWriter(TRAIN_DIR,
                                                graph_def=sess.graph_def)

        # max_stepまで繰り返し学習
        for step in xrange(MAX_STEPS):
            start_time = time.time()
            previous_time = start_time
            index = 0

            batches = image_input.get_batches(FLAGS.batch_size)
            for batch in batches:
                train = batch[0]
                label = batch[1]
                _, loss_value = sess.run([train_op, loss],
                                         feed_dict={
                                             images: train,
                                             labels: label,
                                             keep_conv: 0.8,
                                             keep_hidden: 0.5
                                         })
                if index % 10 == 0:
                    end_time = time.time()
                    duration = end_time - previous_time
                    num_examples_per_step = BATCH_SIZE * 10
                    examples_per_sec = num_examples_per_step / duration
                    print(
                        "%s: %d[epoch]: %d[iteration]: train loss %f: %d[examples/iteration]: %f[examples/sec]: %f[sec/iteration]"
                        % (datetime.now(), step, index, loss_value,
                           num_examples_per_step, examples_per_sec, duration))
                    index += 1
                    assert not np.isnan(
                        loss_value), 'Model diverged with loss = NaN'

                    # test_indices = np.arange(len(teX)) # Get A Test Batch
                    # np.random.shuffle(test_indices)
                    # test_indices = test_indices[0:5]
                    print "=" * 20
                    testx = train[0:2]
                    #print testx
                    testy = label[0:2]
                    print np.argmax(testy[0])
                    print np.argmax(testy[1])
                    output_vec, predict, cost_value = sess.run(
                        [logits, predict_op, loss],
                        feed_dict={
                            images: testx,
                            labels: testy,
                            keep_conv: 1.0,
                            keep_hidden: 1.0
                        })
                    print predict
                    print("test loss: %f" % (cost_value))
                    print "=" * 20
                    previous_time = end_time

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

                # 100回ごと
                if index % 100 == 0:
                    pass
                    summary_str = sess.run(summary_op,
                                           feed_dict={
                                               images: train,
                                               labels: label,
                                               keep_conv: 0.8,
                                               keep_hidden: 0.5
                                           })
                    # サマリーに書き込む
                    summary_writer.add_summary(summary_str, step)

            if step % 1 == 0 or (step * 1) == MAX_STEPS:
                pretrain_checkpoint_path = PRETRAIN_DIR + '/model.ckpt'
                train_checkpoint_path = TRAIN_DIR + '/model.ckpt'
                saver_cnn.save(sess,
                               pretrain_checkpoint_path,
                               global_step=step)
                saver_transformers.save(sess,
                                        train_checkpoint_path,
                                        global_step=step)
        coord.request_stop()
        coord.join(threads)
        sess.close()
def train():
    '''
    Train Network for a number of steps.
    '''
    with tf.Graph().as_default():
        # globalなstep数
        global_step = tf.Variable(0, trainable=False)

        # 教師データ
        if FLAGS.training_data_type == 0:
            # directory feed inputs
            image_input = ImageInput('caltech_samples_random.txt')
            images = tf.placeholder(tf.float32,
                                    shape=(FLAGS.batch_size, FLAGS.crop_size,
                                           FLAGS.crop_size, FLAGS.image_depth))
            labels = tf.placeholder(tf.int32, shape=(FLAGS.batch_size, ))
            learning_rate_node = tf.placeholder(tf.float32, shape=[])
        elif FLAGS.training_data_type == 1:
            # tfrecords inputs
            images, labels = data_inputs.distorted_inputs(TF_RECORDS)

        # graphのoutput
        # net, logits = model.inference(images)
        logits = model.inference(images)

        # loss graphのoutputとlabelを利用
        loss = model.loss(logits, labels)

        # 学習オペレーション
        train_op = op.train(loss, global_step)

        # バリデーション用 --> evalに移動するべき
        # top_k_op = tf.nn.in_top_k(logits, labels, 1)

        # saver
        saver = tf.train.Saver(tf.all_variables())

        # サマリー
        summary_op = tf.merge_all_summaries()

        # 初期化オペレーション
        init_op = tf.initialize_all_variables()

        # Session
        sess = tf.Session(config=tf.ConfigProto(
            log_device_placement=LOG_DEVICE_PLACEMENT))
        sess.run(init_op)

        # 学習済みパラメータのロード
        if FINE_TUNING:
            print('fine tuning. trained_model: %s' % (FLAGS.trained_model))
            #net.load(FLAGS.trained_model, sess)

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

        # サマリーのライターを設定
        summary_writer = tf.train.SummaryWriter(TRAIN_DIR,
                                                graph_def=sess.graph_def)

        # max_stepまで繰り返し学習
        for step in xrange(MAX_STEPS):
            start_time = time.time()

            # directory feed inputs
            if FLAGS.training_data_type == 0:
                train_images, train_labels = image_input.batches(
                    FLAGS.batch_size)
                #print train_images
                print train_labels
                _, loss_value = sess.run(
                    [train_op, loss],
                    feed_dict={
                        images: train_images,
                        labels: train_labels,
                        learning_rate_node: FLAGS.learning_rate
                    })
            elif FLAGS.training_data_type == 1:
                # tfrecords inputs
                #print kernel1.eval(session=sess)
                _, loss_value = sess.run([train_op, loss])
            duration = time.time() - start_time

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

            # 10回ごと
            if step % 10 == 0:
                # stepごとの事例数 = mini batch size
                num_examples_per_step = BATCH_SIZE

                # 1秒ごとの事例数
                examples_per_sec = num_examples_per_step / duration

                # バッチごとの時間
                sec_per_batch = float(duration)

                # time, step数, loss, 1秒で実行できた事例数, バッチあたりの時間
                format_str = '$s: step %d, loss = %.2f (%.1f examples/sec; %.3f sec/batch)'
                print str(datetime.now()) + ': step' + str(
                    step) + ', loss= ' + str(loss_value) + ' ' + str(
                        examples_per_sec) + ' examples/sec; ' + str(
                            sec_per_batch) + ' sec/batch '

            # 100回ごと
            if step % 10 == 0:
                if FLAGS.training_data_type == 0:
                    summary_str = sess.run(summary_op,
                                           feed_dict={
                                               images: train_images,
                                               labels: train_labels
                                           })
                elif FLAGS.training_data_type == 1:
                    summary_str = sess.run(summary_op)
                # サマリーに書き込む
                #print sumary_str
                summary_writer.add_summary(summary_str, step)

            if step % 1000 == 0 or (step * 1) == MAX_STEPS:
                checkpoint_path = TRAIN_DIR + '/model.ckpt'
                saver.save(sess, checkpoint_path, global_step=step)

        coord.request_stop()
        coord.join(threads)
        sess.close()
def train():
    '''
    Train CNN_tiny for a number of steps.
    '''
    with tf.Graph().as_default():
        # globalなstep数
        global_step = tf.Variable(0, trainable=False)

        # 教師データ
        image_input = ImageInput('./data/101Caltech_shuffles.txt')
        print("the number of train data: %d" % (len(image_input.image_paths)))

        images = tf.placeholder(tf.float32, [None, 224, 224, 3])
        labels = tf.placeholder(tf.float32, [None, 101])
        keep_conv = tf.placeholder(tf.float32)
        keep_hidden = tf.placeholder(tf.float32)

        # graphのoutput
        logits, transform_result = model.inference(images, keep_conv, keep_hidden)

        # loss graphのoutputとlabelを利用
        # loss = model.loss(logits, labels)
        
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, labels))
        predict_op = tf.argmax(logits, 1)

        # 学習オペレーション
        train_op = op.train(loss, global_step)

        # サマリー
        summary_op = tf.merge_all_summaries()

        # 初期化オペレーション
        init_op = tf.initialize_all_variables()

        # Session
        sess = tf.Session(config=tf.ConfigProto(log_device_placement=LOG_DEVICE_PLACEMENT))

        # saver
        #saver = tf.train.Saver(tf.all_variables())

        sess.run(init_op)    
        # pretrainと全体を分けて保存
        pretrain_params = {}
        train_params = {}
        for variable in tf.trainable_variables():
            variable_name = variable.name
            #print("parameter: %s" %(variable_name))
            scope, name = variable_name.split("/")
            target, _ = name.split(":")
            if variable_name.find('spatial_transformer') <  0:
                print("pretrain parameter: %s" %(variable_name))
                pretrain_params[variable_name] = variable
            print("train parameter: %s" %(variable_name))
            train_params[variable_name] = variable
        saver_cnn = tf.train.Saver(pretrain_params)
        saver_transformers = tf.train.Saver(train_params)

        # pretrained_model
        if FLAGS.fine_tune:
            ckpt = tf.train.get_checkpoint_state(PRETRAIN_DIR)
            if ckpt and ckpt.model_checkpoint_path:
                print("Pretrained Model Loading.")
                saver_cnn.restore(sess, ckpt.model_checkpoint_path)
                print("Pretrained Model Restored.")
            else:
                print("No Pretrained Model.")       

        # pretrained model from another type models.
        #    # saver
        #    print type(tf.all_variables())
        #    for variable in tf.trainable_variables():
        #        variable_name = variable.name
        #        variable_value = variable.eval(sess)
        #        if variable_name.find('softmax_linear') < 0 and variable_name.find('spatial_transformer') < 0:
        #            print("trained parameter: %s" %(variable_name))
        #            scope, name = variable_name.split("/")
        #            target, _ = name.split(":")
        #            with tf.variable_scope(scope, reuse=True):
        #                sess.run(tf.get_variable(target).assign(variable_value))
        #    trained_model = FLAGS.trained_model
        #    print trained_model

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

        # サマリーのライターを設定
        summary_writer = tf.train.SummaryWriter(TRAIN_DIR, graph_def=sess.graph_def)
 
        # max_stepまで繰り返し学習
        for step in xrange(MAX_STEPS):
            start_time = time.time()
            previous_time = start_time
            index = 0

            batches = image_input.get_batches(FLAGS.batch_size)
            for batch in batches:
                train = batch[0]
                label = batch[1]
                _, loss_value = sess.run([train_op, loss], feed_dict={images: train, labels: label, keep_conv: 0.8, keep_hidden: 0.5})
                if index % 10 == 0:
                    end_time = time.time()
                    duration = end_time - previous_time
                    num_examples_per_step = BATCH_SIZE * 10
                    examples_per_sec = num_examples_per_step / duration
                    print("%s: %d[epoch]: %d[iteration]: train loss %f: %d[examples/iteration]: %f[examples/sec]: %f[sec/iteration]" % (datetime.now(), step, index, loss_value, num_examples_per_step, examples_per_sec, duration))
                    index += 1
                    assert not np.isnan(loss_value), 'Model diverged with loss = NaN'

                    # test_indices = np.arange(len(teX)) # Get A Test Batch
                    # np.random.shuffle(test_indices)
                    # test_indices = test_indices[0:5]
                    print "="*20
                    testx = train[0:2]
                    #print testx
                    testy = label[0:2]
                    print np.argmax(testy[0])
                    print np.argmax(testy[1])
                    output_vec, predict, cost_value = sess.run([logits, predict_op, loss], feed_dict={images: testx, labels: testy, keep_conv: 1.0, keep_hidden: 1.0})
                    print predict
                    print("test loss: %f" % (cost_value))
                    print "="*20
                    previous_time = end_time

                index += 1
                assert not np.isnan(loss_value), 'Model diverged with loss = NaN'
                
                # 100回ごと
                if index % 100 == 0:
                    pass
                    summary_str = sess.run(summary_op, feed_dict={images: train, labels: label, keep_conv: 0.8, keep_hidden: 0.5})
                    # サマリーに書き込む
                    summary_writer.add_summary(summary_str, step)
            
            if step % 1 == 0 or (step * 1) == MAX_STEPS:
                pretrain_checkpoint_path = PRETRAIN_DIR + '/model.ckpt'
                train_checkpoint_path = TRAIN_DIR + '/model.ckpt'
                saver_cnn.save(sess, pretrain_checkpoint_path, global_step=step)
                saver_transformers.save(sess, train_checkpoint_path, global_step=step)
        coord.request_stop()
        coord.join(threads)
        sess.close()
def train():
    '''
    Train Network for a number of steps.
    '''
    with tf.Graph().as_default():
        # globalなstep数
        global_step = tf.Variable(0, trainable=False)

        # 教師データ
        if FLAGS.training_data_type == 0:
            # directory feed inputs
            image_input = ImageInput('caltech_samples_random.txt')
            images  = tf.placeholder(tf.float32, shape=(FLAGS.batch_size, FLAGS.crop_size, FLAGS.crop_size, FLAGS.image_depth))
            labels = tf.placeholder(tf.int32, shape=(FLAGS.batch_size,))
            learning_rate_node = tf.placeholder(tf.float32, shape=[])
        elif FLAGS.training_data_type == 1:
            # tfrecords inputs
            images, labels = data_inputs.distorted_inputs(TF_RECORDS)

        # graphのoutput
        # net, logits = model.inference(images)
        logits = model.inference(images)

        # loss graphのoutputとlabelを利用
        loss = model.loss(logits, labels)

        # 学習オペレーション
        train_op = op.train(loss, global_step)

        # バリデーション用 --> evalに移動するべき
        # top_k_op = tf.nn.in_top_k(logits, labels, 1)

        # saver
        saver = tf.train.Saver(tf.all_variables())

        # サマリー
        summary_op = tf.merge_all_summaries()

        # 初期化オペレーション
        init_op = tf.initialize_all_variables()

        # Session
        sess = tf.Session(config=tf.ConfigProto(log_device_placement=LOG_DEVICE_PLACEMENT))
        sess.run(init_op)

        # 学習済みパラメータのロード
        if FINE_TUNING:
            print('fine tuning. trained_model: %s' % (FLAGS.trained_model))
            #net.load(FLAGS.trained_model, sess)

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

        # サマリーのライターを設定
        summary_writer = tf.train.SummaryWriter(TRAIN_DIR, graph_def=sess.graph_def)
   
        # max_stepまで繰り返し学習
        for step in xrange(MAX_STEPS):
            start_time = time.time()
            
            # directory feed inputs
            if FLAGS.training_data_type == 0:
                train_images, train_labels = image_input.batches(FLAGS.batch_size)
                #print train_images
                print train_labels
                _, loss_value = sess.run([train_op, loss], feed_dict={images: train_images, labels:train_labels, learning_rate_node: FLAGS.learning_rate})
            elif FLAGS.training_data_type == 1:
                # tfrecords inputs
                #print kernel1.eval(session=sess)
                _, loss_value = sess.run([train_op, loss])
            duration = time.time() - start_time

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

            # 10回ごと
            if step % 10 == 0:
                # stepごとの事例数 = mini batch size
                num_examples_per_step = BATCH_SIZE

                # 1秒ごとの事例数
                examples_per_sec = num_examples_per_step / duration
                
                # バッチごとの時間
                sec_per_batch = float(duration)

                # time, step数, loss, 1秒で実行できた事例数, バッチあたりの時間
                format_str = '$s: step %d, loss = %.2f (%.1f examples/sec; %.3f sec/batch)'
                print str(datetime.now()) + ': step' + str(step) + ', loss= '+ str(loss_value) + ' ' + str(examples_per_sec) + ' examples/sec; ' + str(sec_per_batch) + ' sec/batch '

            # 100回ごと
            if step % 10 == 0:
                if FLAGS.training_data_type == 0:
                    summary_str = sess.run(summary_op, feed_dict={images: train_images, labels:train_labels})
                elif FLAGS.training_data_type == 1:
                    summary_str = sess.run(summary_op)
                # サマリーに書き込む
                #print sumary_str
                summary_writer.add_summary(summary_str, step)

            if step % 1000 == 0 or (step * 1) == MAX_STEPS:
                checkpoint_path = TRAIN_DIR + '/model.ckpt'
                saver.save(sess, checkpoint_path, global_step=step)

        coord.request_stop()
        coord.join(threads)
        sess.close()