伙计们,我已经建立了一个可以工作的LSTM模型,现在我正在尝试(未成功)将Embedding层添加为第一层。
此solution对我不起作用。 在询问之前,我还阅读了以下问题: Keras input explanation: input_shape, units, batch_size, dim, etc, Understanding Keras LSTMs和keras examples。
我的输入是一种包含27个字母的语言的字符的单点编码(一和零)。我选择将每个单词表示为10个字符的序列。每个单词的输入大小是(10,27)
,我有465个,所以它是X_train.shape (465,10,27)
,我也有大小为y_train.shape (465,1)
的标签。我的目标是训练模型,并同时建立角色嵌入。
现在这是可以编译和拟合的模型。
main_input = Input(shape=(10, 27))
rnn = Bidirectional(LSTM(5))
x = rnn(main_input)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
添加嵌入层后:
main_input = Input(shape=(10, 27))
emb = Embedding(input_dim=2, output_dim = 10)(main_input)
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
输出:ValueError:输入0与双向双向31不兼容:预期ndim = 3,发现ndim = 4
如何固定输出形状? 您的想法将不胜感激。
答案 0 :(得分:1)
我的输入是一种包含27个字母的语言的字符的单点编码(一和零)。
您不应将单一编码方式传递到Embedding
中。 Embedding
层将整数索引映射到n维向量。因此,您应该直接传递预先热销的索引。
即之前,您有一个像[[0, 1, 0], [1, 0, 0], [0, 0, 1]]
这样的单输入,它是由一组像[1, 0, 2]
这样的整数创建的。而不是传递(10, 27)
的向量,而是传递(10,)
的原始向量。
main_input = Input(shape=(10,)) # only pass in the indexes
emb = Embedding(input_dim=27, output_dim = 10)(main_input) # vocab size is 27
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)