Как использовать tf.nn.crelu в тензорном потоке?

Я пробую разные функции активации в моей простой нейронной сети.

Не имеет значения, используя tf.nn.relu, tf.nn.sigmoid... сеть делает то, что должна делать.

Но если я использую tf.nn.creluУ меня ошибка измерения.

Возвращает что-то вроде [max, min] и размер ширины в два раза больше. Что мне нужно сделать? Подгонка следующих весов и смещений к выходу crelu?

1 ответ

Решение

Вы правы, если вы строите сеть вручную, вам нужно отрегулировать размеры следующего слоя, чтобы соответствовать tf.nn.crelu выход. В этом смысле, tf.nn.crelu не взаимозаменяем с tf.nn.relu, tf.nn.elu, так далее.

Ситуация проще, если вы используете высокоуровневый API, например, tenorflow slim. В этом случае функции слоя заботятся о соответствии размеров, поэтому вы можете заменить tf.nn.relu легко с tf.nn.crelu в коде. Однако имейте в виду, что сеть постепенно увеличивается в два раза.

Вот пример:

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 в последнем слое, чтобы исправить выходной размер. Полный код можно найти здесь.

Другие вопросы по тегам