Подтвердить что ты не робот

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.

4b9b3361

Ответ 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])