Создание переменной более высокого ранга, сложенной поверх предыдущего в map_fn в TensorFlow - PullRequest
0 голосов
/ 24 апреля 2020

Я строю многообъектный трекер, используя RTM DNet. Я хочу точно настроить каждый обнаруженный объект, и для этого мне нужно сгенерировать разные весовые матрицы для каждого объекта, расположенного друг над другом в полностью связанном слое. Я использую map_fn следующим образом:

    y = tf.placeholder(tf.float32, [None, None])


    def dense_layers(nest):
        samples_flat = tf.layers.flatten(nest[0])
        Y = tf.expand_dims(nest[1], 1)

        W4 = tf.get_variable('fc4/kernel' +tf.as_string(), shape=(1024, 512),
                             initializer=tf.contrib.layers.variance_scaling_initializer())
        b4 = tf.get_variable('fc4/bias', shape=(1, 512), initializer=tf.zeros_initializer())
        Z4 = tf.add(tf.matmul(samples_flat, W4), b4)
        fc4 = tf.nn.relu(Z4)

        W5 = tf.get_variable('fc5/kernel', shape=(512, 512),
                             initializer=tf.contrib.layers.variance_scaling_initializer())
        b5 = tf.get_variable('fc5/bias', shape=(1, 512), initializer=tf.zeros_initializer())
        Z5 = tf.add(tf.matmul(fc4, W5), b5)
        fc5 = tf.nn.relu(Z5)

        W6 = tf.get_variable('fc6/kernel', shape=(512, 1),
                             initializer=tf.contrib.layers.xavier_initializer())
        b6 = tf.get_variable('fc6/bias', shape=(1, 1), initializer=tf.zeros_initializer())
        fc6 = tf.add(tf.matmul(fc5, W6), b6)
        AL = tf.nn.sigmoid(fc6)

        loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=fc6, labels=Y))

        dAL = -(tf.divide(Y, AL) - tf.divide((tf.constant(1.0) - Y), (tf.constant(1.0) - AL)))
        dZ6 = tf.multiply(dAL, tf.multiply(AL, (tf.subtract(tf.constant(1.0), AL))))
        dW6 = tf.matmul(tf.transpose(fc5), dZ6)
        db6 = tf.expand_dims(tf.reduce_mean(dZ6, 0), 0)

        dA5 = tf.matmul(dZ6, tf.transpose(W6))
        dZ5 = tf.identity(dA5)
        dZ5 = tf.where(Z5 > 0, dA5, tf.multiply(tf.constant(0.0), dA5))
        dW5 = tf.matmul(tf.transpose(fc4), dZ5)
        db5 = tf.expand_dims(tf.reduce_mean(dZ5, 0), 0)

        dA4 = tf.matmul(dZ5, tf.transpose(W5))
        dZ4 = tf.identity(dA4)
        dZ4 = tf.where(Z4 > 0, dA4, tf.multiply(tf.constant(0.0), dA4))
        dW4 = tf.matmul(tf.transpose(samples_flat), dZ4)
        db4 = tf.expand_dims(tf.reduce_mean(dZ4, 0), 0)


        train_op = [
            W4.assign_sub(lr * dW4), W5.assign_sub(lr * dW5), W6.assign_sub(lr * dW6),
            b4.assign_sub(lr * db4), b5.assign_sub(lr * db5), b6.assign_sub(lr * db6)
        ]

        pred = tf.where(AL > 0.5, (AL*0)+1, AL*0)
        correct_pred = tf.equal(pred, Y)

        accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

        return accuracy, loss, fc6, W4, W5, W6, train_op

    accuracy, loss, fc6, W4, W5, W6, train_op= tf.map_fn(lambda nest: dense_layers(nest), (input, y),
                                               dtype=(tf.float32, tf.float32, tf.float32,
                                                      tf.float32, tf.float32, tf.float32,[tf.float32]*6))

Здесь я получаю матрицу весов более высокого порядка [no_of_objects, previous_layer_units, next_layer_units], однако они копируются несколько раз и являются одинаковыми. Кто-нибудь знает решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...