Jeśli rozwikłać k Am^2 wektor i się rozwinąć X, by następnie dostać:
m**2
Wektor k
((n-m)**2, m**2)
Matryca unrolled_X
gdzie unrolled_X
może być uzyskane za pomocą następującego kodu Python:
from numpy import zeros
def unroll_matrix(X, m):
flat_X = X.flatten()
n = X.shape[0]
unrolled_X = zeros(((n - m) ** 2, m**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and ((i/n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_X[i - skipped, j * m + l] = flat_X[i + j * n + l]
else:
skipped += 1
return unrolled_X
Rozwinięcie X, a nie k pozwala na uzyskanie bardziej zwartej reprezentacji (mniejsze macierze) niż odwrotnie dla każdego X - ale musisz rozwinąć każdy X. Wolisz rozwinąć k w zależności od tego, co chcesz zrobić.
Tutaj, unrolled_X
nie jest rzadki, natomiast unrolled_k
będzie rzadki, ale o rozmiarze ((n-m+1)^2,n^2)
jako @ Salvador Dali wspomniano.
Rozwijanie k
można zrobić tak:
from scipy.sparse import lil_matrix
from numpy import zeros
import scipy
def unroll_kernel(kernel, n, sparse=True):
m = kernel.shape[0]
if sparse:
unrolled_K = lil_matrix(((n - m)**2, n**2))
else:
unrolled_K = zeros(((n - m)**2, n**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and((i/n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_K[i - skipped, i + j * n + l] = kernel[j, l]
else:
skipped += 1
return unrolled_K
Nie musiałyby być jakieś przekształcenia na końcu jest prawidłowy? Ten ostatni wektor to 4 x 1, ale wynikiem splotu będzie 2 x 2 – jvans
@jvans tak, w końcu powinieneś zmienić swój wektor. Jest tu napisane: ** przekształcić powstały wektor (który będzie miał rozmiar (n-m + 1)^2 X 1) na macierz kwadratową n-m + 1 ** –