Почему tf.losses.softmax_cross_entropy сходится к ненулевому значению (7.116) в модели vgg? - PullRequest
0 голосов
/ 27 декабря 2018

Я обучил модель vgg классифицировать подмножество набора данных лица с 1000 классов (идентификаторов).Я использовал

  • размер изображения 224x224,

  • tf.losses.softmax_cross_entropy

  • AdamOptimizer

Однако потеря модели сходится к ненулевому значению (7.116 ~ 7.117).

Мой код: (функции чтения данных не отображаются)

def create_model(images, label_indices, class_num=1000):
    onehot_labels = tf.one_hot(label_indices, class_num)
    with tf.name_scope("vgg_network"):
        # https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/slim/python/slim/nets/vgg.py
        logits, endpoints = vgg_16(images, num_classes=class_num,global_pool=True)
    with tf.name_scope("softmax_cross_entropy_loss"):
        #loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=label_indices, logits=logits))
        loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits)
    with tf.name_scope("accuracy"):
        accuracy = tf.metrics.accuracy(labels=label_indices, predictions=tf.argmax(logits, axis=1))

    with tf.name_scope("training_network"):
        tvars = [var for var in tf.trainable_variables()]
        optim = tf.train.AdamOptimizer(a.lr, a.beta1)
        grads_and_vars = optim.compute_gradients(loss, var_list=tvars, colocate_gradients_with_ops=True)
        train_op = optim.apply_gradients(grads_and_vars)

        with tf.control_dependencies([train_op]):
            ema = tf.train.ExponentialMovingAverage(decay=0.99)
            update_losses = ema.apply([loss])

        global_step = tf.train.get_or_create_global_step()
        incr_global_step = tf.assign(global_step, global_step+1)
    return Model(
        logits=logits,
        onehot_labels=onehot_labels,
        accuracy=accuracy,
        label_indices=label_indices,
        loss=ema.average(loss),
        #loss=loss,
        grads_and_vars=None,
        train=tf.group(update_losses, incr_global_step),
        )

def main():
    ################ check directory #########################################
    if not os.path.exists(a.output_dir):    
        os.makedirs(a.output_dir)
    ################ read TFRecord dataset ###################################
    input_batch, iterator  = read_tfrecord()

    ################ creat model  ############################################
    model = create_model(input_batch.images, input_batch.labels, a.class_num)

    ################ configuration ###########################################
    logdir = a.output_dir
    sv = tf.train.Supervisor(logdir=logdir, save_summaries_secs=0, saver=None)
    sess_config = tf.ConfigProto(allow_soft_placement=True)
    sess_config.gpu_options.allow_growth = True

    ############### session ######################################################
    with sv.managed_session(config=sess_config) as sess:
        max_steps = 2**32
        start = time.time()
        fetches = {
                    "train": model.train,
                    "global_step": sv.global_step,
                }
        fetches["label_indices"] = model.label_indices
        fetches["loss"] = model.loss
        fetches["accuracy"] = model.accuracy
        for step in range(max_steps):
            results = sess.run(fetches)

            if step % 49 == 0:
                train_epoch = math.ceil(results["global_step"] / input_batch.steps_per_epoch)
                train_step = (results["global_step"] - 1) % input_batch.steps_per_epoch + 1
                rate = (step + 1) * a.batch_size / (time.time() - start)
                remaining = (max_steps - step) * a.batch_size / rate
                print("progress  epoch %d  step %d  image/sec %0.1f  remaining %dm" % (train_epoch, train_step, rate, remaining / 60))
                print("loss", results["loss"])
                print("accuracy", results["accuracy"])

Я получил такие результаты:

progress  epoch 0  step 450242  image/sec 4.3  remaining 133877094m
loss 6.9084997
accuracy (0.0, 0.0)
progress  epoch 1  step 49  image/sec 26.3  remaining 21736389m
loss 6.6496363
accuracy (0.56377554, 0.5525)
progress  epoch 1  step 98  image/sec 27.7  remaining 20691865m
loss 6.3198533
accuracy (0.36862245, 0.36489898)
progress  epoch 1  step 147  image/sec 28.2  remaining 20324250m
loss 6.1094604
accuracy (0.28146258, 0.2795608)

..... .....

кривая потерь

Точность продолжала уменьшаться (фактически до нуля), и потери в конечном итоге сходимы примерно до 7,116.

Я проверил выходные логиты VGG после конвергенции модели и получил выходные логиты между -20,6152 и -21,026.

В чем проблема в моем коде?Я бы добавил код чтения данных, если это необходимо.

...