Keras:如何创建稀疏连接层?
Keras: How to create a sparsely connected layer?
我想要一个神经网络,其中输入层中的节点仅连接到隐藏层中的某些节点。在小它应该看起来类似于这样:
我的原始问题有 9180 个输入节点和 230 个隐藏节点(这些数字指的是我作为输入的生物数据)。我知道哪个输入节点连接到哪个隐藏节点,并且此信息位于形状为 (9180,230).
的矩阵中(1:有连接,0:there 为无连接)
这是我如何创建模型的代码示例:
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)
我不希望在训练过程中出现新的连接。
因为我需要这种特殊的隐藏层架构来分析我的生物学问题。
您可以将层的权重与您拥有的二进制掩码相乘。
例如,假设您有 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 low-level API来定义这个结构。
我想要一个神经网络,其中输入层中的节点仅连接到隐藏层中的某些节点。在小它应该看起来类似于这样:
我的原始问题有 9180 个输入节点和 230 个隐藏节点(这些数字指的是我作为输入的生物数据)。我知道哪个输入节点连接到哪个隐藏节点,并且此信息位于形状为 (9180,230).
的矩阵中(1:有连接,0:there 为无连接)这是我如何创建模型的代码示例:
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)
我不希望在训练过程中出现新的连接。 因为我需要这种特殊的隐藏层架构来分析我的生物学问题。
您可以将层的权重与您拥有的二进制掩码相乘。 例如,假设您有 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 low-level API来定义这个结构。