Керас: Как создать разреженный слой? - PullRequest
0 голосов
/ 10 января 2019

Я хочу иметь нейронную сеть, где узлы входного слоя просто подключены к некоторым узлам скрытого слоя. В маленьком это должно выглядеть примерно так: example

Моя первоначальная проблема имеет 9180 входных узлов и 230 скрытых узлов (эти цифры относятся к биологическим данным, которые я беру в качестве входных данных). Я знаю, какой узел ввода подключен к какому скрытому узлу, и эта информация лежит в матрице (1: соединение установлено, 0: соединение отсутствует) формы (9180 230).

Вот пример кода, как я создаю свою модель:

import tensorflow as tf
import tensorflow.contrib.eager as tfe
import numpy as np

tf.enable_eager_execution()


model = tf.keras.Sequential([
  tf.keras.layers.Dense(2, activation=tf.sigmoid, input_shape=(2,)), 
  tf.keras.layers.Dense(2, activation=tf.sigmoid)
])

mask =np.array([[0, 1],[1,1]])


#define the loss function
def loss(model, x, y):
  y_ = model(x)
  return tf.losses.mean_squared_error(labels=y, predictions=y_)

#define the gradient calculation
def grad(model, inputs, targets):
  with tf.GradientTape() as tape:
    loss_value = loss(model, inputs, targets)
  return loss_value, tape.gradient(loss_value, model.trainable_variables) 

#create optimizer an global Step
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
global_step = tf.train.get_or_create_global_step()


#optimization step
loss_value, grads = grad(model, features, labels)
optimizer.apply_gradients(zip(grads, model.variables),global_step)

Я не хочу, чтобы во время обучения возникали новые связи. Мне нужен этот особый вид архитектуры скрытого слоя для анализа моей биологической проблемы.

1 Ответ

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

Вы можете умножить веса слоя на двоичную маску, которая у вас есть. Например, предположим, у вас есть 4 входа и 3 выхода. Теперь у вас есть весовая матрица между этими слоями (4,3). И у вас также есть маска матрицы, которая говорит о подключении. Теперь поточечно умножьте обе матрицы, и все готово.

weight =[[0.20472841, 0.16867633, 0.337205  ],
       [0.05087094, 0.07719579, 0.23244687],
       [0.86705386, 0.64144604, 0.11517534],
       [0.57614114, 0.26831522, 0.31417855]]

mask =[[1, 0, 1],
       [0, 0, 1],
       [0, 1, 1],
       [0, 0, 0]]

new_weight = multiply(weight, mask) #point wise
new_weight = [[0.20472841, 0.        , 0.337205  ],
               [0.        , 0.        , 0.23244687],
               [0.        , 0.64144604, 0.11517534],
               [0.        , 0.        , 0.        ]]

Примечание. Для определения этой структуры можно использовать низкоуровневый API-интерфейс tenorflow.

...