鉴于我对此不太熟悉,以下内容很可能是一个愚蠢的问题(标题同样重要,欢迎提出任何修改建议)。我正在尝试使Keras模型能够与多个输入一起使用,但始终会遇到输入维的问题。我的网络设置很可能几乎没有什么意义,但我首先想产生一种可行的方法(即执行),然后尝试不同的设置。这是我现在拥有的:
sent = Input(shape=(None,inputdim))
pos = Input(shape=(None,1))
l1 = LSTM(40)(sent)
l2 = LSTM(40)(pos)
out = concatenate([l1, l2])
output = Dense(1, activation='sigmoid')(out)
model = Model(inputs=[sent, pos], outputs=output)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
print('X1 shape:', np.shape(X1_train))
print('X1 Input shape:', np.shape(sent))
print('X2 shape:', np.shape(X2_train))
print('X2 Input shape:', np.shape(pos))
model.fit([X1_train, X2_train], Y_train, batch_size=1, epochs=nrEpochs)
这使我得到以下输出/错误:
Using TensorFlow backend.
INFO: Starting iteration 1 of 1...
INFO: Starting with training of LSTM network.
X1 shape: (3065,)
X1 Input shape: (?, ?, 21900)
X2 shape: (3065, 1)
X2 Input shape: (?, ?, 1)
Traceback (most recent call last):
...
ValueError: Error when checking input: expected input_1 to have 3 dimensions,
but got array with shape (3065, 1)
如果我正确理解了东西(我一点也不知道:),Input
基本上会将输入转换为张量,并添加第三维(在我的情况下),但是我输入的是model.fit()
时的模型仍然是二维的。任何关于如何做到这一点的想法都非常欢迎。
答案 0 :(得分:0)
您应该更好地了解LSTM是如何工作的。 LSTM(作为所有递归神经网络单位,如GRU和RNN)期望输入的形状如下:batch,time_steps,token_dimensions。
如果您不了解嵌入以及如何在Keras中使用它们,可以在这里https://keras.io/layers/embeddings/
只是让您了解代码的外观,就像我在此处粘贴如何修改代码以使其正常工作一样:
sent = Input(shape=(time_steps,))
pos = Input(shape=(time_steps2,))
lstm_in = Embeddings(vocab_size, 300)(sent) #now you have batch x time_steps x 300 tensor
lstm_in2 = Embeddings(vocab_size2, 100)(pos)
l1 = LSTM(40)(lstm_in)
l2 = LSTM(40)(lstm_in2)
out = concatenate([l1, l2])
output = Dense(1, activation='sigmoid')(out)
model = Model(inputs=[sent, pos], outputs=output)
请注意,两个输入可以具有不同数量的时间步长。如果第二个只有一个,则通过密集层而不是LSTM。