繁体   English   中英

如何使用具有分类功能的RNN嵌入层-RecoSys的分类任务

[英]How to use Embedding layer for RNN with a categorical feature - Classification Task for RecoSys

我想为分类特征(项目ID)构建一个具有嵌入层的模型(RNN >> LSTM),我的训练集如下所示:

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)

我得到此模型摘要:

在此处输入图片说明

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

但是之后,此错误出现:

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

我的错误在哪里,如何解决?

嵌入层将正整数(索引)转换为固定大小(Docs)的密集向量。 因此,您的train_x不是单热编码的,而是代表其在vocab中的索引的整数。 它是与分类特征相对应的整数。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM