Использование пользовательского слоя для определения связности в tensorflow/tflearn

Вместо полносвязного слоя я хотел бы указать связность между узлами активации с помощью матрицы. Например:

У меня есть слой из 20 узлов, который подключен к слою из 10 узлов. Используя типичный полносвязный слой, моя матрица W имеет размер 20 x 10 с вектором b размера 10.

Моя активация выглядит примерно так: relu(Wx + b)

Если бы у меня была матрица единиц и нулей того же размера, что и W, назовем ее F, я мог бы выполнить попарное умножение между W и F, чтобы удалить связи между моим первым слоем (20 узлов) и моим вторым слоем (10 узлов). )

Вот мой текущий код:

F.shape
# (20, 10)
import tflearn
import tensorflow as tf

input = tflearn.input_data(shape=[None, num_input])

first = tflearn.fully_connected(input, 20, activation='relu')
# Here is where I want to use a custom function, that uses my F matrix
# I dont want the second layer to be fully connected to the first, 
# I want only connections that are ones (and not zeros) in F

# Currently:
second = tflearn.fully_connected(first, 10, activation='relu')
# What I want:
second = tflearn.custom_layer(first, my_fun)

Где my_fun дает мне: relu( (FW)X + b) и FW — попарное умножение

Как создать эту функцию? Кажется, я не могу найти примеры tflearn того, как это делается, но я также знаю, что tflearn также позволяет использовать базовые функции тензорного потока.


person kmace    schedule 17.01.2017    source источник


Ответы (1)


Это сложно сделать строго с tflearn, но если вы хотите включить базовые операции тензорного потока, это тривиально:

F.shape
# (20, 10)
import tflearn
import tensorflow as tf

input = tflearn.input_data(shape=[None, num_input])
tf_F = tf.constant(F, shape=[20, 10])

first = tflearn.fully_connected(input, 20, activation='relu')
# Here is where I want to use a custom function, that uses my F matrix
# I want only connections that are ones (and not zeros) in F

# Old:
# second = tflearn.fully_connected(first, 10, activation='relu')
# Solution:
W = tf.Variable(tf.random_uniform([20, 10]), name='Weights')
b = tf.Variable(tf.zeros([10]), name='biases')
W_filtered = tf.mul(tf_F, W)
second = tf.matmul( W_filtered, first) + b
person kmace    schedule 28.01.2017