Keras:如何创建稀疏连接的图层?

时间:2019-01-10 09:47:54

标签: tensorflow keras neural-network keras-layer

我想拥有一个神经网络,其中输入层中的节点仅连接到隐藏层中的某些节点。在小的情况下,它应类似于以下内容: example

我最初的问题有9180个输入节点和230个隐藏节点(这些数字指的是我要作为输入的生物学数据)。我知道哪个输入节点连接到哪个隐藏节点,并且此信息位于形状(9180,230)的矩阵(1:存在连接,0:没有连接)中。

这是我如何创建模型的代码示例:

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 :(得分:1)

您可以将图层的权重乘以具有的二进制蒙版。 例如,假设您有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.        ]]

注意:您可以使用tensorflow低级API定义此结构。