我想实现本文提出的PI模型架构“半监督的时间限制 学习”。 https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjKiqyMmOfZAhXGz4MKHcFJCxEQFgguMAA&url=https%3A%2F%2Farxiv.org%2Fabs%2F1610.02242&usg=AOvVaw3VuNNeChU0O7WYXZQsfxOh
作者在theano中提供了代码,但不再支持theano,所以我在tensorflow中编写算法。 该论文涉及半监督模型,其中一批训练数据包含标记和未标记的样本。该算法有两个分支 - 一个用于标记,另一个用于未标记的样本。一个样本用作两个分支的输入,但是在ech分支中,输入经历随机增强。在标记的分支中,在标签和CNN的输出之间使用交叉熵损失,而对于未标记的分支,使用相同输入的两个随机增强版本的CNN的输出之间的均方损失。 p>
我正在使用cifar10数据集,我随机将一些样本的标签更改为10以表示未标注的样本。对于标记或未标记的样本,均方将始终是训练损失的一部分,但是如果样本未标记(即标签== 10),则交叉熵应为零。
我在代码
中提出了以下代码段sentinel = tf.Variable(-1, name='sentinel')
if tf.argmax(y_, axis=1)[0] != tf.constant(10):
sentinel = sentinel
else:
sentinel = 1
cross_entropy = tf.cond(tf.greater(sentinel, tf.constant(0)), lambda: tf.constant(0.0), lambda: tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=train_prediction)), name ='cross_entropy')
train_loss = cross_entropy
mean_sq_loss = tf.losses.mean_squared_error(train_prediction, train_prediction_b)
train_loss += unsup_weight * mean_sq_loss
train_op = tf.train.AdamOptimizer(config.adam_epsilon).minimize(train_loss)
但条件
if tf.argmax(y_, axis=1)[0] != tf.constant(10):
即使是,也不会评估为真 tf.argmax(y_,axis = 1)[0]等于10.
我使用哨兵来跟踪样品是否标记,但当我检查输出的批量大小为1时,即使样品未标记,哨兵也不会改变。我将不胜感激。 感谢