1

活性化関数としてreluを使用してテンソルフローで畳み込みネットワークを作成しましたが、学習していません(評価とトレーニングの両方のデータセットで損失が一定です)。さまざまなアクティベーション関数について、すべてが正常に機能します。

nn が作成されるコードは次のとおりです。

def _create_nn(self):
    current = tf.layers.conv2d(self.input, 20, 3, activation=self.activation)
    current = tf.layers.max_pooling2d(current, 2, 2)
    current = tf.layers.conv2d(current, 24, 3, activation=self.activation)
    current = tf.layers.conv2d(current, 24, 3, activation=self.activation)
    current = tf.layers.max_pooling2d(current, 2, 2)
    self.descriptor = current = tf.layers.conv2d(current, 32, 5, activation=self.activation)
    if not self.drop_conv:
        current = tf.layers.conv2d(current, self.layer_7_filters_n, 3, activation=self.activation)
    if self.add_conv:
        current = tf.layers.conv2d(current, 48, 2, activation=self.activation)

    self.descriptor = current

    last_conv_output_shape = current.get_shape().as_list()
    self.descr_size = last_conv_output_shape[1] * last_conv_output_shape[2] * last_conv_output_shape[3]

    current = tf.layers.dense(tf.reshape(current, [-1, self.descr_size]), 100, activation=self.activation)
    current = tf.layers.dense(current, 50, activation=self.last_activation)

    return current

self.activation は tf.nn.relu に設定され、self.last_activation は tf.nn.softmax に設定されます

損失関数とオプティマイザーはここで作成されます。

    self._nn = self._create_nn()

    self._loss_function = tf.reduce_sum(tf.squared_difference(self._nn, self.Y), 1)

    optimizer = tf.train.AdamOptimizer()
    self._train_op = optimizer.minimize(self._loss_function)

初期化子として渡すことで変数の初期化を変更しようとしtf.random_normal_initializer(0.1, 0.1)ましたが、損失関数は変更されませんでした。

このニューラル ネットワークを ReLu で動作させるための助けをいただければ幸いです。

編集:Leaky ReLuにも同じ問題があります

編集:同じエラーを複製できた小さな例:

x = tf.constant([[3., 211., 123., 78.]])
v = tf.Variable([0.5, 0.5, 0.5, 0.5])
h_d = tf.layers.Dense(4, activation=tf.nn.leaky_relu)
h = h_d(x)
y_d = tf.layers.Dense(4, activation=tf.nn.softmax)
y = y_d(h)
d = tf.constant([[.5, .5, 0, 0]])

h_d および y_d カーネルの勾配 (tf.gradients で計算) とバイアスが 0 に等しいか、0 に近い

4

2 に答える 2