【问题标题】:Keras Embedding layer - ValueError: Error when checking input: expected to have 2 dimensions, but got (39978, 20, 20)Keras 嵌入层 - ValueError:检查输入时出错:预期有 2 个维度,但得到了 (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() 中指定输入形状元组,但它不起作用。有人能指出我正确的方向吗?

谢谢

【问题讨论】:

    标签: python keras nlp keras-layer


    【解决方案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 层将数据转换为正确的形状。这种方法对我有用。

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2018-01-09
      相关资源
      最近更新 更多