Python 如何使用RNN的嵌入层和RecoSys的分类特征分类任务
我想构建一个模型(RNN>>LSTM),其中包含一个用于分类功能(项目ID)的嵌入层,我的培训集看起来是这样的: 列车x=[[184563.1]、[184324.1]、[187853.1]、[174963.1]、[181663.1]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、…] 我预测第六项ID: 序列y=[0,1,2,…,12691] 我有12692个唯一的项目ID,时间步长长度=5,这是一个分类任务 这是我迄今为止所做工作的简要总结:(如果我错了,请纠正我)Python 如何使用RNN的嵌入层和RecoSys的分类特征分类任务,python,tensorflow,lstm,recurrent-neural-network,embedding,Python,Tensorflow,Lstm,Recurrent Neural Network,Embedding,我想构建一个模型(RNN>>LSTM),其中包含一个用于分类功能(项目ID)的嵌入层,我的培训集看起来是这样的: 列车x=[[184563.1]、[184324.1]、[187853.1]、[174963.1]、[181663.1]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、[…]、…] 我预测第六项ID: 序列y=[0,1,2,…,12691] 我有12692个唯一的项目ID,时间步长长度=5,这是一个分类任务 这是我迄今为止所做工作的简要总结:(如果我错了,请纠正我)
model=Sequential()
添加(嵌入(输入尺寸=12692,输出尺寸=250,输入长度=5))
添加(LSTM(128,返回序列=True)
模型。添加(辍学(0.2))
添加(BatchNormalization())
model.add(LSTM(128,返回序列=True))
模型。添加(辍学(0.1))
添加(BatchNormalization())
型号.添加(LSTM(128))
模型。添加(辍学(0.2))
添加(BatchNormalization())
添加(密集(32,activation='relu'))
模型。添加(辍学(0.2))
model.add(密集型(12692,activation='softmax'))
opt=tf.keras.optimizers.Adam(lr=0.001,衰减=1e-6)
model.compile(
损失=“稀疏”\u分类”\u交叉熵',
优化器=opt,
指标=[‘准确度’])
打印(model.summary())
历史=model.fit(
列车x,列车y,
批次大小=64,
时代,
验证\数据=(验证\ x,验证\ y))
分数=模型。评估(验证x,验证y,详细=0)
我得到这个模型摘要:
培训131204个样本,验证107904个样本
但在此之后,出现以下错误:
ValueError:检查输入时出错:预期嵌入_输入为2维,但得到了具有形状的数组(131204、512692)
我的错误在哪里?解决方案是什么?嵌入层将正整数(索引)转换为固定大小的密集向量。因此,您的
train_x
不是一个热编码的整数,而是表示其在词汇表中的索引的整数。它将是与分类特征相对应的整数
序列x.形状
将是(样本x 5的编号)
-->每个代表分类特征的索引
train_y.shape
将是(样本编号)
-->每个代表时间序列中第六项的索引
工作样本
谢谢你的回答。如果你也能解释这3点那就太好了:1.为什么输入中的“+1”_dim=12692+1?2.正如你在这个例子中看到的,如果我想包括价格(数字),我只考虑itemID作为一个特性作为第二个特性,我应该如何将这两个特性结合起来作为模型的输入?3.您对改进模型有什么建议,比如使用:TimeDistributed或GRU?1。第一个itemID表示为1而不是0,因此它将是
vocab_size+1
(我在回答中给出的文档链接中也提到了这一点)2.为其他功能创建一个输入层,并将嵌入层的输出与输入层合并。3.您必须进行实验。一般来说,使用GRU进行训练比使用LSTM更快,但从性能点(精度)来看,两者几乎相同。
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)