Переменный динамический размер Тензор потока в CNN - PullRequest
0 голосов
/ 15 декабря 2018

Выходной слой моего CNN должен использовать функцию RBF, описываемую как «каждый нейрон выводит квадрат евклидова расстояния между его входным вектором и его вектором веса».Я реализовал это как

dense2 = tf.square(tf.norm(dense1 - tf.transpose(dense2_W)))

, где dense1 - тензор формы (?, 84).Я пытался объявить dense2_W, весовые коэффициенты, как переменную формы (84, 10), так как он выполняет классификацию чисел и должен иметь 10 выходных данных.Запустив код с партией 100 я получаю эту ошибку: InvalidArgumentError: Incompatible shapes: [100,84] vs. [10,84].Я считаю, что это связано с вычитанием.

Я обучаю сеть, повторяя этот код:

x_batch, y_batch = mnist.train.next_batch(100)
x_batch = tf.pad(x_batch, [[0,0],[2,2],[2,2],[0,0]]).eval()  # Pad 28x28 -> 32x32
sess.run(train_step, {X: x_batch, Y: y_batch})

, а затем проверяю его, используя весь набор тестов, таким образом, размер пакета в сети.должен быть динамическим.

Как я могу обойти это?Размер пакета должен быть динамическим, как в случае dense1, но я не понимаю, как создать переменную с динамическим размером и транспонировать ее (dense2_W).

1 Ответ

0 голосов
/ 15 декабря 2018

Вам нужны формы двух тензоров, чтобы соответствовать.Предполагая, что вы хотите разделить весовые коэффициенты в пакете, а также иметь отдельный набор весовых коэффициентов для каждого выходного класса, вы можете изменить форму обоих тензоров для правильной трансляции, например:

# broadcasting will copy the input to every output class neuron
input_dense = tf.expand_dims(dense1, axis=2)

# broadcasting here will copy the weights across the batch
weights = tf.expand_dims(tf.transpose(dense2_W), axis=0)

dense2 = tf.square(tf.norm(input_dense - weights, axis=1))

Полученный тензорdense2 должен иметь форму [batch_size, num_classes], которая в вашем случае равна [100, 10] (поэтому он будет хранить логиты для каждого экземпляра данных в количестве выходных классов)

РЕДАКТИРОВАТЬ: добавлен аргумент axis ввызов tf.norm, чтобы вычислить расстояние в скрытом измерении (не по всей матрице).

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