Как сделать внешний продукт в виде слоя с цепочкой?

Как я могу включить внешний продукт (предыдущего вектора признаков и самого себя) в качестве слоя в цепочку, особенно таким образом, который совместим с пакетной обработкой?


person jpeterson    schedule 22.11.2017    source источник
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
comment
Я не проверял, какой будет выходная форма для этого, но если это можно использовать в качестве слоя в нейронной сети, это выглядит правильно, спасибо. В идеале выходные данные должны иметь вид (размер_партии, количество_функций**2), где внешняя матрица продукта сглаживается для каждой точки данных в партии. Было бы еще лучше убрать лишние элементы из матрицы, но я не знаю, как лучше к этому подойти. - person jpeterson; 23.11.2017