如何在TensorFlow中使用tf.nn.crelu?

我在我的简单神经网络中尝试使用不同的激活函数。

无论使用tf.nn.relu还是tf.nn.sigmoid,网络都能正常工作。

但是当我使用tf.nn.crelu时,会出现维度错误。

它返回类似[max, min]的结果,并且宽度维度变为原来的两倍。我应该怎么做?将后续的权重和偏置调整到crelu的输出上吗?


回答:

你说的没错,如果你手动构建网络,你需要调整后续层的维度以匹配tf.nn.crelu的输出。从这个意义上说,tf.nn.crelu能与tf.nn.relutf.nn.elu等互换使用。

如果你使用高层API,例如tensorflow slim,情况会简单很多。在这种情况下,层函数会自动处理维度的匹配,所以你可以在代码中轻松地用tf.nn.crelu替换tf.nn.relu。然而,请注意网络的大小会悄无声息地变为原来的两倍。

这里有一个例子:

with slim.arg_scope([slim.conv2d, slim.fully_connected],
                    activation_fn=tf.nn.crelu,
                    normalizer_fn=slim.batch_norm,
                    normalizer_params={'is_training': is_training, 'decay': 0.95}):
    conv1 = slim.conv2d(x_image, 16, [5, 5], scope='conv1')
    pool1 = slim.max_pool2d(conv1, [2, 2], scope='pool1')
    conv2 = slim.conv2d(pool1, 32, [5, 5], scope='conv2')
    pool2 = slim.max_pool2d(conv2, [2, 2], scope='pool2')
    flatten = slim.flatten(pool2)
    fc = slim.fully_connected(flatten, 1024, scope='fc1')
    drop = slim.dropout(fc, keep_prob=keep_prob)
    logits = slim.fully_connected(drop, 10, activation_fn=None, scope='logits')

slim.arg_scope简单地将所有提供的参数应用于底层层,特别是activation_fn。另外,请注意在最后一层设置activation_fn=None以修正输出维度。完整代码可以在这里找到

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注