gpt4 book ai didi

python - Keras GRU/LSTM层输入维度错误

转载 作者:行者123 更新时间:2023-12-01 09:08:41 25 4
gpt4 key购买 nike

我对深度学习有点陌生,我一直在尝试使用深度学习方法进行自然语言处理并使用路透社数据集创建一个简单的情感分析器。这是我的代码:

import numpy as np
from keras.datasets import reuters
from keras.preprocessing.text import Tokenizer
from keras.models import Sequential
from keras.layers import Dense, Dropout, GRU
from keras.utils import np_utils
max_length=3000
vocab_size=100000
epochs=10
batch_size=32
validation_split=0.2
(x_train, y_train), (x_test, y_test) = reuters.load_data(path="reuters.npz",
num_words=vocab_size,
skip_top=5,
maxlen=None,
test_split=0.2,
seed=113,
start_char=1,
oov_char=2,
index_from=3)

tokenizer = Tokenizer(num_words=max_length)

x_train = tokenizer.sequences_to_matrix(x_train, mode='binary')
x_test = tokenizer.sequences_to_matrix(x_test, mode='binary')
y_train = np_utils.to_categorical(y_train, 50)
y_test = np_utils.to_categorical(y_test, 50)


model = Sequential()
model.add(GRU(50, input_shape = (49,1), return_sequences = True))
model.add(Dropout(0.2))
model.add(Dense(256, input_shape=(max_length,), activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(50, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.summary()

history = model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=validation_split)

score = model.evaluate(x_test, y_test)
print('Test Accuracy:', round(score[1]*100,2))

我不明白的是,为什么每次我尝试使用 GRU 或 LSTM 单元而不是密集单元时,我都会收到此错误:

ValueError: Error when checking input: expected gru_1_input to have 3 dimensions, but got array with shape (8982, 3000)

我在网上看到添加 return_sequences = True 可以解决该问题,但如您所见,问题仍然存在于我的情况中。

这种情况我该怎么办?

最佳答案

问题是 x_train 的形状是 (8982, 3000) 因此这意味着(考虑到预处理阶段)有 8982 个句子被编码为 one-hot词汇大小为 3000 的向量。另一方面,GRU(或 LSTM)层接受序列作为输入,因此其输入形状应为(batch_size、num_timesteps 或equence_length、feature_size)。目前,您拥有的特征是句子中特定单词的存在 (1) 或不存在 (0)。因此,要使其与 GRU 配合使用,您需要向 x_trainx_test 添加第三个维度:

x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)

然后删除该 return_sequences=True 并将 GRU 的输入形状更改为 input_shape=(3000,1)。通过这种方式,您可以告诉 GRU 层您正在处理长度为 3000 的序列,其中每个元素都包含一个特征。 (作为旁注,我认为您应该将 vocab_size 传递给 Tokenizernum_words 参数。这表示词汇中的单词数。相反,将 max_length 传递给 load_datamaxlen 参数,以限制句子的长度。)

但是,我认为如果您使用Embedding layer,您可能会得到更好的结果。作为第一层,位于 GRU 层之前。这是因为目前对句子进行编码的方式没有考虑句子中单词的顺序(它只关心它们的存在)。因此,向 GRU 或 LSTM 层(依赖于序列中元素的顺序)提供这种表示形式是没有意义的。

关于python - Keras GRU/LSTM层输入维度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com