Как выполнить часть графика в TensorFlow 1.X - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь реализовать алгоритм совместного обучения в TensorFlow 1.15: https://papers.nips.cc/paper/8072-co-teaching-robust-training-of-deep-neural-networks-with-extremely-noisy-labels.pdf.

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

Я не уверен, как это сделать, выполнение потери работает только в порядке, как и ожидалось, но выполнение шага обучения только с потерей возвращает ошибку, когда TensorFlow запрашивает заполнители ввода / вывода, что для меня мало смысла ...

Вот модель сети:

class GraphMLP:
    """
    MLP.
    """
    def __init__(self, settings, layers, params, act=Layers.ReLU()):

        # PLACEHOLDERS
        self.x = tf.placeholder(tf.float32, shape=[None, settings.sequence_length,  settings.input_dim], name='inputs')
        self.y = tf.placeholder(tf.float32, shape=[None, settings.forecast, settings.output_dim], name='target')
        self.step = tf.placeholder(tf.int32, name='step')
        self.is_training = tf.placeholder(tf.bool, name='is_training')
        self.keep_prob = tf.placeholder(tf.float32, name='keep_prob')
        self.weights = tf.placeholder(tf.float32, shape=[None], name='weights')

        # Reshape
        self.xr = tf.reshape(self.x, [-1, settings.sequence_length*settings.input_dim],name='reshape_input')
        self.yr = tf.reshape(self.y, [-1, settings.forecast*settings.output_dim],name='reshape_target')
        # Operations
        self.xc = self.xr
        for i, layer_type in enumerate(layers):
            if layer_type == 'dense':
                self.xc = Layers.Dense(params[i], activation=act, name='dense_'+str(i))(self.xc)
            if layer_type == 'dropout':
                self.xc = Layers.Dropout(1-self.keep_prob, name='drop_'+str(i))(self.xc, training=self.is_training)

        self.y_ = Layers.Dense(settings.output_dim, activation=None, name='outputs')(self.xc)

        # Loss
        with tf.name_scope('loss_ops'):
            self.diff = tf.square(tf.subtract(self.y_, self.yr))
            self.s_loss = tf.reduce_mean(self.diff, axis=1)
            self.w_loss = tf.reduce_mean(tf.multiply(self.s_loss, self.weights))
            tf.summary.scalar('w_loss', self.w_loss)
            tf.summary.scalar('loss', tf.reduce_mean(self.s_loss))
        # Train
        self.grad = tf.norm(tf.gradients(self.s_loss, self.y_),axis=2)
        self.acc_op, self.std_op = accuracy(self.y_, self.yr)
        self.train_step = train_fn(self.w_loss, settings.learning_rate)
        # Tensorboard
        self.merged = tf.summary.merge_all()

Вот пример того, что я пытаюсь сделать:

prct, batch_xs, batch_ys = SR1.sample_train_batch()
L1 = sess.run(M_1.s_loss, feed_dict = {M_1.x: batch_xs,
                                       M_1.y: batch_ys,
                                       M_1.weights: np.ones(sts.batch_size),
                                       M_1.keep_prob: sts.dropout,
                                       M_1.step: i,
                                       M_1.is_training: True})
prct, batch_xs, batch_ys = SR2.sample_train_batch()
L2 = sess.run(M_2.s_loss, feed_dict = {M_2.x: batch_xs,
                                       M_2.y: batch_ys,
                                       M_2.weights: np.ones(sts.batch_size),
                                       M_2.keep_prob: sts.dropout,
                                       M_2.step: i,
                                       M_2.is_training: True})
threshold = 0.9
filtered_from_L1 = np.mean(np.sort(L1)[:int(sts.batch_size*threshold)])
filtered_from_L2 = np.mean(np.sort(L2)[:int(sts.batch_size*threshold)])
L1 = sess.run(M_1.train_step, feed_dict = {M_1.w_loss: filtered_from_L1})
L2 = sess.run(M_2.train_step, feed_dict = {M_2.w_loss: filtered_from_L2})

Потеря работает нормально, и когда она достигает шага тренировки, она выдает следующую ошибку:

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'weights' with dtype float and shape [?]

Который, если я исправлю его, будет запрашивать входы, а затем выходы и т. Д. c ...

Любая подсказка о том, как выполнить эту задачу? Я хотел бы как можно больше сохранить два разных графика для моих сетей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...