Я строю многообъектный трекер, используя 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], однако они копируются несколько раз и являются одинаковыми. Кто-нибудь знает решение этой проблемы?