嘿,伙计们,我已经建立了一个LSTM模型,可以工作,现在我尝试(不成功)添加一个嵌入层作为第一层。
这个解决方案不适合我。在提问之前,我还阅读了以下问题:尺寸、昏暗等.、理解Keras LSTM和煤角样例。
我的输入是一种由27个字母组成的语言字符的一次热编码(1和0)。我选择将每个单词表示为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与bidirectional_31层不兼容:预期的ndim=3,found ndim=4
如何修复输出形状?你的想法将不胜感激。
发布于 2019-03-04 04:43:17
我的输入是一种由27个字母组成的语言字符的一次热编码(1和0)。
您不应该将一次热编码传递给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)https://stackoverflow.com/questions/54976385
复制相似问题