Можно ли реализовать в Тензорфлоу следующий код? - PullRequest
0 голосов
/ 10 июля 2020

Приведенный ниже код представляет собой код Matlab, который я пытаюсь реализовать в TensorFlow. Я хотел бы знать, можно ли реализовать if-else во вложении для l oop в TensorFlow.

A = [100;200;300;300;100;200;200;100;300;300];
B = unique(A);
C = [4;5;6];

D = zeros(length(A),1);
for i = 1:length(A)
    for j = 1:length(B)
        if A(i) == B(j)
            D(i) = D(i)+A(i)*C(j);
        else
            D(i) = D(i)+0;
        end
    end
end

Предположим,

A_tf = tf.placeholder(tf.float32, shape=[None, self.a.shape[1]])
c = tf.Variable(tf.ones([len(np.unique(self.a))]))

на основе вашего TensorFlow кода, я создал приведенную ниже функцию в надежде, что она вернет #output 'd'

def d_tensor(self,a,c): 
    val,idx = tf.unique(a) 
    val = tf.sort(val) 
    sh = tf.shape(val)[0] 
    one_hot_a = tf.one_hot(idx,depth=sh ,dtype = tf.float32)  
    d= tf.reduce_sum(one_hot_a*val*c, axis=-1) 
return d 

Я получаю следующую ошибку: ValueError: Пытался преобразовать «глубину» в тензор и не удалось. Ошибка: невозможно преобразовать неизвестное измерение в тензор:?. Не знаю, как это понимать

1 Ответ

0 голосов
/ 10 июля 2020

Во-первых, я попытался понять ваш код, поэтому я просто реализовал его в classi c python с

a = [100,200,300,300,100,200,200,100,300,300]
b = sorted(set(a))
c = [4, 5, 6]

d = [0]*len(a)

for i in range(len(a)):
    j = b.index(a[i])
    d[i] = d[i] + a[i]*c[j]
    
print("a ", a)
print("b ", b)
print("c ", c)
print("d ", d)

, что дает мне результат

a  [100, 200, 300, 300, 100, 200, 200, 100, 300, 300]
b  [100, 200, 300]
c  [4, 5, 6]
d  [400, 1000, 1800, 1800, 400, 1000, 1000, 400, 1800, 1800]

Затем я попытался сделать то же самое в тензорном потоке и сделал

a = tf.convert_to_tensor([100,200,300,300,100,200,200,100,300,300])
b, idx = tf.unique(a)
b = tf.sort(b)
c = tf.convert_to_tensor([4, 5, 6])

one_hot_a = tf.one_hot(idx, depth=b.shape[0], dtype=tf.int32)
tf.reduce_sum(one_hot_a * b*c, axis=-1)

, который дает тот же результат:

<tf.Tensor: id=486, shape=(10,), dtype=int32, numpy=array([ 400, 1000, 1800, 1800,  400, 1000, 1000,  400, 1800, 1800])>

Может быть, вы можете дать нам некоторые данные, чтобы узнать, действительно ли это что вас ожидает?

...