我想拥有一个神经网络,其中输入层中的节点仅连接到隐藏层中的某些节点。在小的情况下,它应类似于以下内容:
我最初的问题有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)
我不希望在培训期间出现新的联系。 因为我需要这种特殊的隐藏层架构来分析我的生物学问题。
答案 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定义此结构。