python - 如何使用具有分类特征的 RNN 的嵌入层 - RecoSys 的分类任务

标签 python tensorflow lstm recurrent-neural-network embedding

我想构建一个模型 (RNN >> LSTM),其中包含一个用于分类特征(项目 ID)的嵌入层,我的训练集看起来是这样的:

train_x = [[[184563.1], [184324.1], [187853.1], [174963.1], [181663.1]], [[…],[…],[…],[…],[… ]], …]

我预测第六个元素ID:

train_y = [0,1,2, …., 12691]

我有 12692 个唯一的项目 ID,时间步长 = 5,这是一个分类任务。

这是我到目前为止所做的简要总结:(如果我错了请纠正我)

  1. 分类特征的单热编码:

train_x = [[[1 0 0 … 0 0 0], [0 1 0 … 0 0 0], [0 0 1 … 0 0 0], […], […]], [ […]、[…]、[…]、[…]、[…]]、…]

  1. 构建模型:
model = Sequential()

model.add(Embedding(input_dim=12692 , output_dim=250, input_length=5))

model.add(LSTM(128, return_sequences=True)
model.add(Dropout(0.2)) 
model.add(BatchNormalization())

model.add(LSTM(128, return_sequences=True))
model.add(Dropout(0.1)) 
model.add(BatchNormalization())

model.add(LSTM(128))
model.add(Dropout(0.2)) 
model.add(BatchNormalization())

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(12692, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)
model.compile(
      loss='sparse_categorical_crossentropy',
      optimizer=opt,
      metrics=['accuracy'])

print(model.summary())

history = model.fit(
      train_x, train_y,
      batch_size=64,
      epochs=epochs,
      validation_data=(validation_x, validation_y))

score = model.evaluate(validation_x, validation_y, verbose=0)

我得到这个模型摘要:

enter image description here

训练 131204 个样本,验证 107904 个样本

但是之后,出现这个错误:

ValueError:检查输入时出错:预期 embedding_input 具有 2 个维度,但得到形状为 (131204, 5, 12692) 的数组

我的错误在哪里,解决方案是什么?

最佳答案

嵌入层将正整数(索引)转换为固定大小的密集向量 (Docs) .所以你的 train_x 不是单热编码的,而是代表它在词汇表中的索引的整数。它将是对应于分类特征的整数。

train_x.shape 将是 (No:of sample X 5) --> 每个代表分类特征的索引

train_y.shape 将是 (No:of sample) --> 每个代表您的时间序列中第六项的索引。

工作样本

import numpy as np
import keras
from keras.layers import Embedding, LSTM, Dense
n_samples = 100

train_x = np.random.randint(0,12692,size=(n_samples ,5))
train_y = np.random.randint(0,12692,size=(n_samples))


model = keras.models.Sequential()

model.add(Embedding(input_dim=12692+1, output_dim=250, input_length=5))
model.add(LSTM(128, return_sequences=True))
model.add(LSTM(32))
model.add(Dense(32, activation='relu'))
model.add(Dense(12692, activation='softmax'))

opt = keras.optimizers.Adam(lr=0.001, decay=1e-6)
model.compile(
      loss='sparse_categorical_crossentropy',
      optimizer=opt,
      metrics=['accuracy'])

print(model.summary())

history = model.fit(
      train_x, train_y,
      batch_size=64,
      epochs=32)

关于python - 如何使用具有分类特征的 RNN 的嵌入层 - RecoSys 的分类任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57570851/

相关文章:

Python - BeautifulSoup - 如何检查 ResultSet 是否包含元素

python - Tensorflow:tf.case 参数化可调用,案例列表在 for 循环中定义

TensorFlow:在输入处获取梯度时性能缓慢

python - 在 Keras 中使用大于 2 Gb 的数据集

tensorflow 警告-找到未跟踪的函数,例如lstm_cell_6_layer_call_and_return_conditional_losses

python - 变分自动编码器 : InvalidArgumentError: Incompatible shapes: [100, 5] 与 [100]

python - 尝试 numba 的巨大错误

python - 选择具有多年观察的指数

python - 访问 pandas 组作为新数据框

keras - keras 中用于文本分类的 convolution2d 的尺寸误差