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