我具有以下网络架构(下面仅显示网络的相关部分)
vocab_dimension = 1500
embed_dimension = 10
x = [Input(shape=(None, ), name='input', dtype='int32'),
Input(shape=(None, ), name='weights'),
Input(shape=(None, ), name='neg_examples', dtype='int32')]
embedding_layer = Embedding(input_dim=vocab_dimension, output_dim=embed_dimension)
def _weighted_sum(x):
return K.sum(x[0] * K.expand_dims(x[1], -1), axis=1, keepdims=True)
weighted_sum = Lambda(_weighted_sum, name='weighted_sum')
item_vecs = embedding_layer(x[2])
user_vecs = weighted_sum([embedding_layer(x[0]), x[1]])
这里的问题是我不想将权重作为输入传递,但我想像在关注层一样“学习”权重。
我知道可以通过这种方式创建注意力层
attention_probs = Dense(h, activation='softmax', name='attention_probs')(x[0])
weighted_sum = Lambda(_weighted_sum)([x[0], attention_probs])
h
等于输入长度的尺寸,我将其设置为5。但是,如果执行上述操作,则会出现以下错误
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
我认为这与输入参数的尺寸有关,但是我不确定如何解决此问题。
答案 0 :(得分:0)
如果您修复h
,则必须修复输入的长度。您将其设置为None
,但是只有在h==input_size
的情况下,尺寸才会匹配。奇怪的是,您甚至可以将未定义的大小传递给密集层,通常会遇到类似ValueError: The last dimension of the inputs to 'Dense' should be defined. Found 'None'.
请注意,在“输入”层中,您没有batch_size。因此,如果后端张量的大小应为(batch_size,dim1),则可以创建类似Input((dim1,))