Próbuję zdefiniować niestandardowe op w tensorflow, w którym w pewnym momencie muszę zbudować macierz (z
), która zawierałaby sumy wszystkich kombinacji par rzędów dwóch macierzy (x
i y
). Ogólnie numery wierszy x
i y
są dynamiczne.Oceń wszystkie kombinacje par rzędów dwóch tensorów w tensorflow
W numpy jest dość prosta:
import numpy as np
from itertools import product
rows_x = 4
rows_y = 2
dim = 2
x = np.arange(dim*rows_x).reshape(rows_x, dim)
y = np.arange(dim*rows_y).reshape(rows_y, dim)
print('x:\n{},\ny:\n{}\n'.format(x, y))
z = np.zeros((rows_x*rows_y, dim))
print('for loop:')
for i, (x_id, y_id) in enumerate(product(range(rows_x), range(rows_y))):
print('row {}: {} + {}'.format(i, x[x_id, ], y[y_id, ]))
z[i, ] = x[x_id, ] + y[y_id, ]
print('\nz:\n{}'.format(z))
powraca:
x:
[[0 1]
[2 3]
[4 5]
[6 7]],
y:
[[0 1]
[2 3]]
for loop:
row 0: [0 1] + [0 1]
row 1: [0 1] + [2 3]
row 2: [2 3] + [0 1]
row 3: [2 3] + [2 3]
row 4: [4 5] + [0 1]
row 5: [4 5] + [2 3]
row 6: [6 7] + [0 1]
row 7: [6 7] + [2 3]
z:
[[ 0. 2.]
[ 2. 4.]
[ 2. 4.]
[ 4. 6.]
[ 4. 6.]
[ 6. 8.]
[ 6. 8.]
[ 8. 10.]]
Ja jednak nie mam pojęcia jak zaimplementować coś podobnego w tensorflow.
Przeważnie przechodziłam przez SO i tensorflow API w nadziei znalezienia funkcji, która dawałaby kombinacje elementów dwóch tensorów lub funkcję, która dawałaby permutacje elementów tensora, ale bez skutku.
Wszelkie sugestie są mile widziane.
To magia ... Tak więc, żeby to naprawić: najpierw rozszerzasz 'x' i' y', tak, że 'x_' ma kształt [1, 4, 2], a' y_' ma kształt [3, 1, 2]. A następnie, zdolność nadawania tf.add "określa" jak wypełnić wymiary na [3, 4, 2] (co jest kształtem 'tf.add (x_, y_)'), a na końcu , 'tf.reshape' zapewnia, że mamy 2 kolumny w' z'. "Odkrycie" jest kluczową częścią, i jak czytam [tutaj] (https://www.tensorflow.org/performance/xla/broadcasting): ... – ponadto
... "Gdy są dwie kompatybilne tablice napotkany, kształt wyniku ma maksymalną wartość spośród dwóch danych wejściowych dla każdego indeksu wymiarów. ", a następnie:" Powstaje specjalny przypadek, który jest również obsługiwany, gdzie każda z tablic wejściowych ma zdegenerowany wymiar przy innym indeksie. W przypadku, wynik jest "operacją zewnętrzną" .To subtelne. Dziękuję za tę odpowiedź! – ponadto