Tensorflow: переменная запуска в два раза отличается от результата

Я пытаюсь создать модель CNN в тензорном потоке и не могу понять проблему:

моя модель представляет собой стандартную трехмерную модель, построенную в функции convolutional_neural_network.

настроен как:

    self.prediction = self.convolutional_neural_network(self.x, img_sz, n_slices)
    self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y_,
                                                                  logits=self.prediction))
    optimizer = tf.train.AdamOptimizer(self.learning_rate).minimize(self.cost)
    correct_prediction = tf.equal(tf.argmax(self.prediction, 1), tf.argmax(self.y_, 1))
    self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

где self.y_ — это заполнитель, в который помещаются метки.

И в какой-то момент я пытаюсь выполнить этот фрагмент кода:

            feed_dict = {self.x: batch_img, self.y_: batch_label, self.keep_prob:
                    keep_rate, self.learning_rate: learning_rate}

            validation_cost = self.cost.eval(
                feed_dict = feed_dict )
            print "Validation cost: "+str(validation_cost)

            validation_cost = self.cost.eval(
                feed_dict = feed_dict)
            print "Validation cost: "+str(validation_cost)

где self.keep_prob: выпадение из модели

Это должно дать такой же результат, но это не так: он выводит:

Стоимость проверки: 1.05199,

Стоимость проверки: 0,115607

Может ли кто-нибудь дать мне некоторое представление о том, что происходит?

спасибо

ps: я уже удалил строку "оптимизатор", но она выводит другой результат

спасибо

ДОБАВЛЕН:

моя модель следующая:

def convolutional_neural_network(self, x, img_sz, n_slices):
    weights = {
        'W_conv1': self.weight_variable([6, 8, 8, 1, 32]),
        'W_conv2': self.weight_variable([2, 5, 5, 32, 48]),
        'W_fc': self.weight_variable([int(
            math.ceil(n_slices / 4) * (math.ceil(img_sz / 4) * math.ceil(img_sz / 4) *
                                        80)),
                                      512]),
        'W_fc2': self.weight_variable([512, 256]),
        'out': self.weight_variable([256, 2])
    }

    biases = {
        'b_conv1': self.bias_variable([32]),
        'b_conv2': self.bias_variable([48]),
        'b_fc': self.bias_variable([512]),
        'b_fc2': self.bias_variable([256]),
        'out': self.bias_variable([2])
    }

    self.x_im = tf.reshape(x, shape=[-1, n_slices, img_sz, img_sz, 1])

    conv1 = tf.tanh(self.conv3d(self.x_im, weights['W_conv1']) + biases['b_conv1'])
    conv1 =self.maxpool3d(conv1)

    conv2 = tf.tanh(self.conv3d(conv1, weights['W_conv2']) + biases['b_conv2'])
    conv2 = self.maxpool3d(conv2)


    fc = tf.reshape(conv4, [-1,int(math.ceil(n_slices/8)*math.ceil(img_sz/8)*math.ceil(
        img_sz/8))*80])
    fc = tf.tanh(tf.matmul(fc, weights['W_fc'])+biases['b_fc'])
    fc = tf.tanh(tf.matmul(fc, weights['W_fc2'])+biases['b_fc2'])
    fc = tf.nn.dropout(fc, self.keep_prob)

    output = tf.matmul(fc, weights['out'])+biases['out']
    return output

где x = tf.placeholder

Также упомяните, что batch_img и batch_label — это пустые массивы.

И:

def weight_variable(self, shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(self, shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

И тренировочный процесс:

def train_neural_network(self, data_img, labels,
                         batch_size, img_sz, n_slices, last_batch,
                         keep_rate, model_path):

    self.prediction = self.convolutional_neural_network(self.x, img_sz, n_slices)
    self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y_,
                                                         logits=self.prediction))
    optimizer = tf.train.AdamOptimizer(self.learning_rate).minimize(self.cost)
    correct_prediction = tf.equal(tf.argmax(self.prediction, 1), tf.argmax(self.y_, 1))
    self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    hm_epochs = 1000
    saver = tf.train.Saver(tf.trainable_variables())
    n_epoch = 0
    learning_rate = 1e-4
    model_path_train = 'model_train_3/my_model.ckpt'

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        if model_path:
            saver.restore(sess, model_path_train)
        while n_epoch < hm_epochs:
            if len(data_img)>last_batch+batch_size:
                with tf.device('/cpu:0'):
                    #batch_img, batch_label, last_batch = self.get_image(
                    #    data_img, labels, last_batch, batch_size, img_sz, n_slices
                    #)
                    batch_img, batch_label, last_batch = self.wrapper_image(data_img, labels, last_batch, batch_size)

                print "Batch label images: "+str(batch_label)
                batch_label = self.dense_to_one_hot(np.array(batch_label, dtype=np.int),
                                                    2).astype(np.float32)


                ####### at the end of EACH EPOCH ###
                n_epoch += 1
                print "n_epoch: "+str(n_epoch)

                _, c = sess.run(
                    [optimizer, self.cost], feed_dict={
                        self.x: batch_img, self.y_: batch_label, self.keep_prob: keep_rate,
                        self.learning_rate: learning_rate
                    }
                )


                c = self.cost.eval(feed_dict = {self.x: batch_img, self.y_: batch_label,
                                             self.keep_prob:
                        keep_rate, self.learning_rate: learning_rate})

                print "train cost: "+str(c)

                c = self.cost.eval(feed_dict = {self.x: batch_img, self.y_: batch_label,
                                             self.keep_prob:
                        keep_rate, self.learning_rate: learning_rate})

                print "train cost: "+str(c)
                if model_path:
                    saver.save(sess, model_path_train)

person Manel Guzmán    schedule 13.04.2018    source источник


Ответы (2)


Чаще всего это результат неправильного сохранения и восстановления либо переменной, либо, если вы используете пакетную нормализацию, то данных для нее. Результатом этого является то, что невосстановленная переменная инициализируется при каждом запуске со случайными весами, каждый раз давая вам другой результат.

В качестве быстрого теста вставьте tf.set_random_seed( 1 ) сразу после всех импортов и посмотрите, это фиксирует значение для разных прогонов. Если да, то моя теория еще более верна. Затем попробуйте распечатать среднее значение и стандартное отклонение для активаций каждого слоя, и вы увидите, где два прогона начинают расходиться.

person Peter Szoldan    schedule 14.04.2018
comment
Не могли бы вы объяснить, что вы имеете в виду под правом после всего импорта? Огромное спасибо - person Manel Guzmán; 15.04.2018
comment
Ну, я бы предположил, что у вас есть куча импортов в верхней части вашего кода, таких как import tensorflow as tf, import numpy as np и т. д. Сразу после них, до запуска любого осмысленного кода, установите случайное начальное число. - person Peter Szoldan; 15.04.2018
comment
Прежде всего, спасибо за ваш ответ. Однако добавление tf.set_random_seed( 1 ) не зафиксировало результат для двух последовательных запусков функции: validation_cost = self.cost.eval( feed_dict = feed_dict). Я добавлю больше информации о моей модели, чтобы проверить, сможете ли вы найти какой-нибудь ключ. Большое спасибо, ваша помощь очень ценна! - person Manel Guzmán; 16.04.2018
comment
Вы не можете просто опубликовать весь код? Или это просто слишком долго? В большинстве случаев ошибка находится где-то еще, чем вы думаете. - person Peter Szoldan; 16.04.2018
comment
Я отредактировал свое первоначальное описание, уменьшив копию своего кода, чтобы его было легче отслеживать. Я также проверил, что эта же ошибка воспроизводится. спасибо! - person Manel Guzmán; 16.04.2018
comment
Исправлено, я только что понял о вероятности выпадения. Было установлено значение 0,5, после чего модель активировала разные сети модели в каждом прогоне стоимости. Если я установлю keep prob = 1.0, результат будет одинаковым в двух последовательных запусках. Спасибо Петр за помощь - person Manel Guzmán; 18.04.2018
comment
Конечно. Опубликуйте это как ответ и примите его, чтобы, если кто-то ищет подобную проблему и попадет сюда, он легко нашел решение. - person Peter Szoldan; 18.04.2018

Исправлено, я только что понял о вероятности выпадения. Было установлено значение 0,5, после чего модель активировала разные сети модели в каждом прогоне стоимости. Если я установлю keep prob = 1.0, результат будет одинаковым в двух последовательных запусках. Спасибо Петр за помощь

person Manel Guzmán    schedule 18.04.2018