我想将辍学添加到tensorflow CIFAR10教程示例代码中,但遇到了一些困难。

Deep MNIST张量流教程包括一个删除示例,但是它使用了交互式图形,这与CIFAR10教程所使用的方法不同。同样,CIFAR10教程既不使用占位符,也不使用feed_dict将变量传递给优化器,MNIST模型使用该变量来传递失落概率以进行训练。

我正在尝试:

在cifar10_train.train()中,我定义了默认图下的丢失概率占位符;那是:

def train():
  """Train CIFAR-10 for a number of steps."""
  with tf.Graph().as_default():
    global_step = tf.Variable(0, trainable=False)
    keep_drop_prob = = tf.placeholder(tf.float32)


在下面,仍然在train()模块中,当我通过调用cifar10.inference()构建计算图时,我还传递了keep_drop_prob占位符,如下所示:

"""Build a Graph that computes the logits predictions from the
inference model."""
logits = cifar10.inference(images, keep_drop_prob)


现在,在cifar10.inference()模块中,我采用传递的keep_drop_prob占位符,并使用它来定义我的辍学层,如下所示:

drop1 = tf.nn.dropout(norm1, keep_drop_prob)


现在,我仍在train()模块内,在计算损失时定义并传递一个keep_drop_prob值,如下所示:

"""Calculate loss."""
loss = cifar10.loss(logits, labels, keep_drop_prob = 0.5)


然后在cifar10.loss()模块中,在计算交叉熵时,使用传递的keep_drop_prob值,如下所示:

"""Calculate the average cross entropy loss across the batch."""
labels = tf.cast(labels, tf.int64)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
    logits, labels, keep_drop_prob, name='cross_entropy_per_example')


现在,我不确定到目前为止我所做的是否正确,以及下一步需要做什么。

任何帮助将不胜感激!

最佳答案

我相信我已经找到了解决方案。

看来我走在正确的轨道上,但是在传递keep_drop_prob占位符时有些落伍。

要添加辍学,我已执行以下操作:

我在cifar10_train.train()模块内添加了keep_drop_prob占位符,如下所示:

def train():
  """Train CIFAR-10 for a number of steps."""
  with tf.Graph().as_default():
    global_step = tf.Variable(0, trainable=False)
    keep_drop_prob = = tf.placeholder(tf.float32)


在cifar10_train.train()模块中构建图形时,我将其传递给占位符,但还应定义其值

"""Build a Graph that computes the logits predictions from the
inference model."""
logits = cifar10.inference(images, keep_drop_prob=0.5)


在cifar10.inference()模块中,我现在获取传递的keep_drop_prob占位符,并使用它来定义我的辍学层,还将其传递给激活摘要以登录张量板:

drop1 = tf.nn.dropout(norm1, keep_drop_prob)
_activation_summary(drop1)


当我在张量板图中查看时,我在那里看到了辍学操作。我还可以在dropout op中询问keep_prob变量,并通过更改构建logits图时传递的值来影响其value属性。

我的下一个测试将是将keep_drop_prob设置为1并设置为0,并确保我从网络中获得了预期的结果。

我不确定这是实施辍学的最有效方法,但我相当确定它是可行的。

请注意,我只有一个keep_drop_prob占位符,可以传递到很多层辍学(每个卷积atm之后一层)。我认为tensorflow为每个辍学操作使用唯一的分布,而不是需要唯一的占位符。

编辑:不要忘记对eval模块进行必要的更改,但要为dropout传递值1。

关于tensorflow - 将DROPOUT添加到Tensorflow CIFAR10 Deep CNN示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40098914/

10-09 13:46