打一个「;“非完全连接”;keras中的(单连通?)神经网络

打一个「;“非完全连接”;keras中的(单连通?)神经网络,keras,neural-network,deep-learning,keras-layer,Keras,Neural Network,Deep Learning,Keras Layer,我不知道我要找的东西的名字,但我想在keras中创建一个层,每个输入乘以它自己的独立权重和偏差。例如,如果有10个输入,将有10个权重和10个偏差,每个输入将乘以其权重并与其偏差相加,得到10个输出 例如,这里有一个简单的密集网络: from keras.layers import Input, Dense from keras.models import Model N = 10 input = Input((N,)) output = Dense(N)(input) model = Mode

我不知道我要找的东西的名字,但我想在keras中创建一个层,每个输入乘以它自己的独立权重和偏差。例如,如果有10个输入,将有10个权重和10个偏差,每个输入将乘以其权重并与其偏差相加,得到10个输出

例如,这里有一个简单的密集网络:

from keras.layers import Input, Dense
from keras.models import Model
N = 10
input = Input((N,))
output = Dense(N)(input)
model = Model(input, output)
model.summary()
如您所见,此模型有110个参数,因为它是完全连接的:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 10)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                110       
=================================================================
Total params: 110
Trainable params: 110
Non-trainable params: 0
_________________________________________________________________
我想用类似于
output=SinglyConnected()(input)
的东西替换
output=densite(N)(input)
,这样模型现在有20个参数:10个权重和10个偏差。

创建一个自定义层:

类单连接(层):
#创造者
定义初始(自我,**kwargs):
超级(单连接、自连接)。\uuuuu初始化(**kwargs)
#创建权重
def构建(自我,输入_形状):
权重形状=(1,)*(len(输入形状)-1)
权重形状=权重形状+(输入形状[-1])#(…,输入)
self.kernel=self.add_weight(name='kernel',
形状=重量+形状,
初始值设定项class='uniform',
可培训=真实)
self.bias=self.add_weight(name='bias',
形状=重量+形状,
初始值设定项='零',
可培训=真实)
自建=真实
#操作:
def呼叫(自我,输入):
返回(输入*self.kernel)+self.bias
#输出形状
def计算输出形状(自身、输入形状):
返回输入形状
#用于保存模型-仅在_init中有参数时才需要__
def get_配置(自身):
config=super(SingleConnected,self).get_config()
返回配置
使用图层:

model.add(SingleConnected())

如何使自定义层支持稀疏输入?如果常规
Dense
层支持稀疏输入,我认为这也将支持稀疏输入。