Как я могу реализовать локально связанный слой в чистом Numpy - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы построить локально связанную матрицу весов, которая представляет локально связанную нейронную сеть в чистом python / numpy без систем глубокого обучения, таких как Torch или TensorFlow.

enter image description here

Весовая матрица представляет собой неквадратную 2D-матрицу с размером (number_input, number_output). (в моем случае автоэнкодер; ввод> скрытый)

Итак, функцию, которую я хотел бы построить, взять размер матрицы и размер рецептивного поля (номер локального соединения) и дать соответствующую матрицу весов. Я уже создал такую ​​функцию, но для размера ввода 8 и размера вывода 4 (и RF = 4) вывод моей функции:

[[ 0.91822845 0.          0.          0.        ]
[-0.24264655 -0.54754138  0.          0.        ]
[ 0.55617366  0.12832513 -0.28733965  0.        ]
[ 0.27993286 -0.33150324  0.06994107  0.61184121]
[ 0.          0.04286912 -0.20974503 -0.37633903]
[ 0.          0.         -0.10386762  0.33553009]
[ 0.          0.          0.          0.09562682]
[ 0.          0.          0.          0.        ]]

но я бы хотел:

[[ 0.91822845 0.          0.          0.        ]
[-0.24264655 -0.54754138  0.          0.        ]
[ 0.55617366  0.12832513  0.          0.        ]
[ 0          -0.33150324  0.06994107  0         ]
[ 0.          0.04286912 -0.20974503  0.        ]
[ 0.          0.         -0.10386762  0.33553009]
[ 0.          0.          0.11581854  0.09562682]
[ 0.          0.          0.          0.03448418]]

Вот мой код Python:

import numpy as np

def local_weight(input_size, output_size, RF):
    input_range = 1.0 / input_size ** (1/2)
    w = np.zeros((input_size, output_size))
    for i in range(0, RF):
        for j in range(0, output_size):
            w[j+i, j] = np.random.normal(loc=0, scale=input_range, size=1)
    return w

print(local_weight(8, 4, 4))

Я с нетерпением жду вашего ответа!

1 Ответ

0 голосов
/ 15 января 2019

Хитрость заключается в том, чтобы работать на небольшом планшете более комфортно (или контролировать пределы).

Затем вы должны определить шаг, который вы предпримете по отношению к входу (он не больше, чем вход / выход). Как только это будет сделано, вам просто нужно заполнить пробелы, а затем удалить прокладку.

import math
import numpy as np
def local_weight(input_size, output_size, RF):
    input_range = 1.0 / input_size ** (1/2)
    padding = ((RF - 1) // 2)
    w = np.zeros(shape=(input_size + 2*padding, output_size))
    step = float(w.shape[0] - RF) / (output_size - 1)
    for i in range(output_size):
        j = int(math.ceil(i * step))
        j_next = j + RF
        w[j:j_next, i] = np.random.normal(loc=0, scale=input_range, size=(j_next - j))
    return w[padding:-padding, :]

Надеюсь, это то, что вы ищете.

EDIT: Я думаю, что реализация была ошибочной. Я переопределяю функцию, мы идем по частям.

  1. Я рассчитываю радиус восприимчивого поля (заполнение).

  2. Определите размер W.

  3. Я рассчитываю шаг, удаляя область заполнения, чтобы всегда оставаться внутри.

  4. Я рассчитываю вес.

  5. Снять прокладку.

...