Tensorflow 以NN(单位为keras)指定连接

Tensorflow 以NN(单位为keras)指定连接,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我使用的是keras和tensorflow 1.4 我想明确指定两层之间连接的神经元。因此,当第一层的神经元I连接到第二层的神经元j,其他地方为零时,我有一个矩阵a,其中有1 我的第一次尝试是创建一个带有内核的自定义层,该层的大小与包含不可训练零的a相同,其中a包含零和可训练权重,其中a包含1。然后,期望的输出将是一个简单的点积。不幸的是,我没有设法弄明白如何实现一个部分可训练部分不可训练的内核 有什么建议吗 (用大量人工连接的神经元构建一个功能模型可能是一个解决办法,但不知何故是一个“丑陋”的

我使用的是keras和tensorflow 1.4

我想明确指定两层之间连接的神经元。因此,当第一层的神经元I连接到第二层的神经元j,其他地方为零时,我有一个矩阵a,其中有1

我的第一次尝试是创建一个带有内核的自定义层,该层的大小与包含不可训练零的a相同,其中a包含零和可训练权重,其中a包含1。然后,期望的输出将是一个简单的点积。不幸的是,我没有设法弄明白如何实现一个部分可训练部分不可训练的内核

有什么建议吗


(用大量人工连接的神经元构建一个功能模型可能是一个解决办法,但不知何故是一个“丑陋”的解决方案)

如果这个矩阵的形状正确,我能想到的最简单的方法是导出密集层,然后简单地在代码中添加矩阵乘以原始权重:

类自定义连接(密集):
定义初始值(自身、单位、连接,**kwargs):
#这是矩阵A
self.connections=连接
#使用所有常用参数初始化原始参数
超级(自定义连接,自连接)。\uuuuu初始\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
def呼叫(自我,输入):
#在调用原始调用之前更改内核:
self.kernel=self.kernel*self.connections
#调用原始计算:
超级(自定义连接、自连接)。呼叫(输入)
使用:

model.add(自定义连接(单位,矩阵))
add(CustomConnected(hidden_dim2,matrixB,activation='tanh'))#可以使用所有其他命名参数。。。
请注意,所有神经元/单位的末尾都添加了一个偏差。如果您不想要偏差,参数
use_bias=False
仍然有效。例如,您也可以使用向量B执行完全相同的操作,并使用
self.biases=self.biases*vectorB

测试提示:使用不同的输入和输出维度,以便确保矩阵A的形状正确


我刚刚意识到我的代码可能有缺陷,因为我正在更改原始密集层使用的属性。如果出现奇怪的行为或消息,您可以尝试其他调用方法:

def调用(自身,输入):
输出=K.dot(输入,self.kernel*self.connections)
如果使用self.u偏差:
输出=K.bias_add(输出,自偏置)
如果self.activation不是None:
输出=自激活(输出)
返回输出
其中
K
来自
import keras.backend as K

如果希望看到矩阵遮罩的权重,还可以进一步设置自定义的
get_weights()
方法。(在上述第一种方法中,这是不必要的)