Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (39978, 20, 20)
Posted
技术标签:
【中文标题】Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (39978, 20, 20)【英文标题】:Keras Embedding layer - ValueError: Error when checking input: expected to have 2 dimensions, but got (39978, 20, 20) 【发布时间】:2020-05-04 17:59:45 【问题描述】:我正在尝试在 keras 中创建一个 LSTM/GRU 模型,以将给定的文章分类为 4 个类之一。
input > embedding layer > LSTM/GRU layer > [context vector] > Dense(softmax activation) > output class
在训练输入数据中有39978篇文章,每篇文章有20个句子,每个句子有20个词。目标变量有4个目标类。
x_train.shape
是 (39978, 20, 20)
和
y_train.shape
是(39978, 4)
embedding_matrix.shape
是 (27873, 100)
embedding_matrix 是在具有 glove.6B.100d.txt
我正在尝试创建如下所示的顺序模型
vocab_size = len(tokenizer.word_index.keys()) # 27873
MAX_SENT_LENGTH = 20
model = Sequential()
embedding_dimentations = embedding_matrix.shape[1]
e = Embedding(vocab_size,
embedding_dimentations,
weights=[embedding_matrix],
input_length=MAX_SENT_LENGTH,
trainable=False)
model.add(e)
model.add(Bidirectional(GRU(embedding_dimentations, dropout=0.25, recurrent_dropout=0.25)))
model.add(Dense(4, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
如果我合适的话,就在上面的模型上
batch_size = 128
epochs = 3
print('Training.....')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_split=.2)
我收到以下错误
ValueError:检查输入时出错:预期 embedding_6_input 为 2 维,但得到的数组形状为 (39978, 20, 20)
我尝试在 Embedding() 中指定输入形状元组,但它不起作用。有人能指出我正确的方向吗?
谢谢
【问题讨论】:
【参考方案1】:vocab_size = len(tokenizer.word_index.keys()) # 27873
MAX_SENT_LENGTH = 20
embedding_dimentations = embedding_matrix.shape[1]
model = Sequential()
encoder_inputs = Input(shape=(20, 20))
x1 = Reshape((400,))(encoder_inputs)
x2 = Embedding(vocab_size,
embedding_dimentations,
weights=[embedding_matrix],
input_length=400,
trainable=False)(x1)
# should use Bidirectional GRU
encoder = GRU(embedding_dimentations, dropout=0.25, recurrent_dropout=0.25, return_state=True)
encoder_outputs, state_h = encoder(x2)
predictions = Dense(4, activation='softmax')(encoder_outputs)
model = Model(inputs=encoder_inputs, outputs=predictions)
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
在 Embedding 层之前使用 Reshape 层将数据转换为正确的形状。这种方法对我有用。
【讨论】:
以上是关于Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (39978, 20, 20)的主要内容,如果未能解决你的问题,请参考以下文章
添加层到 resnet[keras] 的顶部:ValueError: Input 0 is incompatible with layer conv2d_transpose_1: expected n
ValueError:检查输入时出错:预期 keras_layer_input 有 4 个维度,但得到了形状为 (10, 1) 的数组
尝试从 Keras 运行顺序模型时出现 ValueError
Python | Keras:ValueError:检查目标时出错:预期conv2d_3有4个维度,但得到了有形状的数组(1006,5)