1

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

tf.nn.relu使用, ,...没关系,tf.nn.sigmoid网络会做它应该做的事情。

但如果我使用tf.nn.crelu,我有一个尺寸错误。

它返回类似的东西[max, min],宽度尺寸是两倍大。我需要做什么?将以下权重和偏差拟合到crelu?

4

1 回答 1

1

没错,如果您是手动构建网络,则需要调整下一层的尺寸以匹配tf.nn.crelu输出。从这个意义上说,tf.nn.crelu不能tf.nn.relu,tf.nn.elu等互换。

如果您使用高级 API,例如tensorflow slim ,情况会更简单。在这种情况下,层函数负责匹配尺寸,因此您可以tf.nn.relu轻松地替换为tf.nn.creluin code。但是,请记住,网络正在悄悄地变大两倍。

这是一个例子:

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在最后一层固定输出维度。完整的代码可以在这里找到

于 2017-12-09T17:19:54.187 回答