1

私は単純なニューラルネットワークで異なる起動機能を試しています。tensorflowでtf.nn.creluを使用するには?

tf.nn.relutf.nn.sigmoidを使用しても問題ありません。ネットワークが行うべきことを行います。

しかし、私がtf.nn.creluを使用している場合は、寸法誤差があります。

[max, min]のようなものが返され、幅の寸法が2倍大きくなります。 私は何をしなければなりませんか?次の重みと偏りをcreluの出力に当てはめますか?

+0

CReLu活性化の陽性部分のみを選択するReLUと、活性化の陰性部分のみを選択するReLUとを連結する。その結果、この非線形性は活性化の深さを2倍にすることに注意してください。あなたはここでもっと読むことができます。 https://www.tensorflow.org/api_docs/python/tf/nn/crelu –

+0

はい、これはそれが何をしています。どのように使用するのですか? – j35t3r

+0

下のリンクをチェックすることができますか?例の実装が含まれています(チェーンャーからのcreluを使用しますが、テンソルフローと非常によく似ています)https://programtalk.com/vs2/python/10099/chainer/tests/chainer_tests/functions_tests/ activation_tests/test_crelu.py / –

答えて

1

ネットワークを手動で構築する場合は、次のレイヤーのサイズをtf.nn.crelu出力に合わせて調整する必要があります。あなたは高レベルAPIを使用する場合は、この意味では、tf.nn.crelu等、tf.nn.relutf.nn.eluとの互換性がないある

状況は、例えば、単純ですtensorflow slim。この場合、レイヤー機能は一致する寸法を処理しているため、tf.nn.relutf.nn.creluと簡単に置き換えてコードに置き換えることができます。しかし、ネットワークは黙って2倍になっています。

はここに例を示します

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も書き留めます。完全なコードはfound hereです。

関連する問題