我有一系列九个2000
维向量作为两个双向LSTM的输出。我将它们合并以获得九个4000维
向量。
我需要获取每个4000维向量,并将它们分别输入到共享的全连接层中。我该如何做?目前我正在重塑合并的输出以输入到共享的全连接层中。但我不知道这是否必要?
当我尝试构建整个网络以接受多个输入并产生多个输出时,如此链接中所述,我遇到了这个错误。
代码可以在这里找到。
# 我们可以将两个向量连接起来:N=3merge_cv = merge([top_out, btm_out], mode='concat')#concat_axis=2 or -1 (last dim axis)cv = Reshape((9,1, 4000))(merge_cv) # 我们希望得到9个每个维度为4000的向量用于下面的sharedfc_out#每个单元格的输出类别数n_classes = 80sharedfc_out= Dense(output_dim=n_classes,input_dim=4000,activation='relu')#部分计数#pc = np.ndarray(shape=(1,n_classes), dtype=float) #cells_pc = np.array([[pc for j in range(N)] for i in range(N)])outpc=[]for i in range(N): for j in range(N): # cells_pc[i][j] = sharedfc_out(cv[N*i+j]) outpc.append(sharedfc_out(cv[0][N*i+j]))# out=merge(outpc,mode='concat')# out2=Reshape(720)(out)model = Model(input=cells_in, output=outpc)
双向LSTM输出的维度
>>> merge_cv.shapeTensorShape([Dimension(1), Dimension(None), Dimension(4000)])>>> cv.shapeTensorShape([Dimension(None), Dimension(9), Dimension(1), Dimension(4000)])
对于最后一行,我得到了类型错误。
TypeError Traceback (most recent call last) in ()----> 1 model = Model(input=cells_in, output=outpc)/home/jkl/anaconda3/lib/python3.5/site-packages/keras/engine/topology.py in __init__(self, input, output, name) 1814 cls_name = self.__class__.__name__ 1815 raise TypeError('Output tensors to a ' + cls_name + ' must be '-> 1816 'Keras tensors. Found: ' + str(x)) 1817 # Build self.output_layers: 1818 for x in self.outputs:TypeError: Output tensors to a Model must be Keras tensors. Found: Tensor("Relu_9:0", shape=(1, 80), dtype=float32)
回答:
最后发现问题出在错误的列表切片上,这导致将None
作为层传递给列表,然后合并成一个输入。修复这个问题并使切片一致后,问题就解决了。