Как я могу включить внешний продукт (предыдущего вектора признаков и самого себя) в качестве слоя в цепочку, особенно таким образом, который совместим с пакетной обработкой?
Как сделать внешний продукт в виде слоя с цепочкой?
comment
Пожалуйста, добавьте необходимые теги и будьте немного более пояснительны в своем вопросе.
- person Anuj   schedule 22.11.2017
comment
Перейдите по этой ссылке, чтобы узнать, как задать вопрос
- person Anuj   schedule 22.11.2017
Ответы (2)
F.matmul
тоже очень удобно.
В зависимости от входных форм вы можете комбинировать его с F.expand_dims
(конечно, F.reshape
тоже работает) или использовать аргументы transa
/transb
.
Подробнее см. в официальной документации по функциям.
Код
import chainer.functions as F
import numpy as np
print("---")
x = np.array([[[1], [2], [3]], [[4], [5], [6]]], 'f')
y = np.array([[[1, 2, 3]], [[4, 5, 6]]], 'f')
print(x.shape)
print(y.shape)
z = F.matmul(x, y)
print(z)
print("---")
x = np.array([[[1], [2], [3]], [[4], [5], [6]]], 'f')
y = np.array([[[1], [2], [3]], [[4], [5], [6]]], 'f')
print(x.shape)
print(y.shape)
z = F.matmul(x, y, transb=True)
print(z)
print("---")
x = np.array([[1, 2, 3], [4, 5, 6]], 'f')
y = np.array([[1, 2, 3], [4, 5, 6]], 'f')
print(x.shape)
print(y.shape)
z = F.matmul(
F.expand_dims(x, -1),
F.expand_dims(y, -1),
transb=True)
print(z)
Выход
---
(2, 3, 1)
(2, 1, 3)
variable([[[ 1. 2. 3.]
[ 2. 4. 6.]
[ 3. 6. 9.]]
[[ 16. 20. 24.]
[ 20. 25. 30.]
[ 24. 30. 36.]]])
---
(2, 3, 1)
(2, 3, 1)
variable([[[ 1. 2. 3.]
[ 2. 4. 6.]
[ 3. 6. 9.]]
[[ 16. 20. 24.]
[ 20. 25. 30.]
[ 24. 30. 36.]]])
---
(2, 3)
(2, 3)
variable([[[ 1. 2. 3.]
[ 2. 4. 6.]
[ 3. 6. 9.]]
[[ 16. 20. 24.]
[ 20. 25. 30.]
[ 24. 30. 36.]]])
person
niboshi
schedule
22.11.2017
Вы можете использовать F.reshape
и F.broadcast_to
для явной обработки массива.
Предположим, у вас есть 2-мерный массив h
с формой (мини-пакет, функция). Если вы хотите рассчитать внешний продукт h
и h
, попробуйте код ниже. Это то, что вы хотите сделать?
import numpy as np
from chainer import functions as F
def outer_product(h):
s0, s1 = h.shape
h1 = F.reshape(h, (s0, s1, 1))
h1 = F.broadcast_to(h1, (s0, s1, s1))
h2 = F.reshape(h, (s0, 1, s1))
h2 = F.broadcast_to(h2, (s0, s1, s1))
h_outer = h1 * h2
return h_outer
# test code
h = np.arange(12).reshape(3, 4).astype(np.float32)
h_outer = outer_product(h)
print(h.shape)
print(h_outer.shape, h_outer.data)
person
corochann
schedule
22.11.2017
Я не проверял, какой будет выходная форма для этого, но если это можно использовать в качестве слоя в нейронной сети, это выглядит правильно, спасибо. В идеале выходные данные должны иметь вид (размер_партии, количество_функций**2), где внешняя матрица продукта сглаживается для каждой точки данных в партии. Было бы еще лучше убрать лишние элементы из матрицы, но я не знаю, как лучше к этому подойти.
- person jpeterson; 23.11.2017