TensorFlow: numpy.repeat() альтернатива
Я хочу сравнить предсказанные значения yp
с моей нейронной сетью по-разному, и поэтому я использовал (обратно в моей старой реализации numpy):
idx = np.repeat(np.arange(len(yp)), len(yp))
jdx = np.tile(np.arange(len(yp)), len(yp))
s = yp[[idx]] - yp[[jdx]]
В основном создайте индексирующую сетку, которую я тогда использую. idx=[0,0,0,1,1,1,...]
while jdx=[0,1,2,0,1,2...]
. Я не знаю, есть ли более простой способ сделать это...
Во всяком случае, TensorFlow имеет tf.tile()
, но, похоже, отсутствует tf.repeat()
.
idx = np.repeat(np.arange(n), n)
v2 = v[idx]
И я получаю сообщение об ошибке:
TypeError: Bad slice index [ 0 0 0 ..., 215 215 215] of type <type 'numpy.ndarray'>
Также не работает использование константы TensorFlow для индексации:
idx = tf.constant(np.repeat(np.arange(n), n))
v2 = v[idx]
-
TypeError: Bad slice index Tensor("Const:0", shape=TensorShape([Dimension(46656)]), dtype=int64) of type <class 'tensorflow.python.framework.ops.Tensor'>
Идея состоит в том, чтобы преобразовать мою RankNet в TensorFlow.
Ответы
Ответ 1
Вы можете достичь эффекта np.repeat()
, используя комбинацию tf.tile()
и tf.reshape()
:
idx = tf.range(len(yp))
idx = tf.reshape(idx, [-1, 1]) # Convert to a len(yp) x 1 matrix.
idx = tf.tile(idx, [1, len(yp)]) # Create multiple columns.
idx = tf.reshape(idx, [-1]) # Convert back to a vector.
Вы можете просто вычислить jdx
с помощью tf.tile()
:
jdx = tf.range(len(yp))
jdx = tf.tile(jdx, [len(yp)])
Для индексации вы можете попытаться использовать tf.gather()
для извлечения непересекающихся фрагментов из тензора yp
:
s = tf.gather(yp, idx) - tf.gather(yp, jdx)
Ответ 2
Похоже, ваш вопрос настолько популярен, что люди ссылаются на трекер TF. К сожалению, такая же функция еще не реализована в TF.
Вы можете реализовать его, объединив tf.tile, tf.resape, tf.squeeze. Вот способ преобразования примеров из np.repeat:
import numpy as np
import tensorflow as tf
x = [[1,2],[3,4]]
print np.repeat(3, 4)
print np.repeat(x, 2)
print np.repeat(x, 3, axis=1)
x = tf.constant([[1,2],[3,4]])
with tf.Session() as sess:
print sess.run(tf.tile([3], [4]))
print sess.run(tf.squeeze(tf.reshape(tf.tile(tf.reshape(x, (-1, 1)), (1, 2)), (1, -1))))
print sess.run(tf.reshape(tf.tile(tf.reshape(x, (-1, 1)), (1, 3)), (2, -1)))
В последнем случае, когда повторы различны для каждого элемента, вам, скорее всего, понадобится петли.
Ответ 3
На всякий случай кого-нибудь интересует 2D-метод для копирования матриц. Я думаю, что это может сработать:
TF_obj = tf.zeros([128, 128])
tf.tile(tf.expand_dims(TF_obj, 2), [1, 1, 2])