如何使用具有分类特征的 RNN 的嵌入层 - RecoSys 的分类任务
How to use Embedding layer for RNN with a categorical feature - Classification Task for RecoSys
我想构建一个模型 (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,这是一个分类任务。
这是我到目前为止所做的简要总结:(如果我错了请纠正我)
- One-hot-encoding 分类特征:
train_x = [[[1 0 0 ... 0 0 0], [0 1 0 ... 0 0 0], [0 0 1 ... 0 0 0], [... ]、[…]]、[[…]、[…]、[…]、[…]、[…]]、…]
- 构建模型:
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
不是单热编码的,而是代表它在词汇表中的索引的整数。它将是对应于分类特征的整数。
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)
我想构建一个模型 (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,这是一个分类任务。
这是我到目前为止所做的简要总结:(如果我错了请纠正我)
- One-hot-encoding 分类特征:
train_x = [[[1 0 0 ... 0 0 0], [0 1 0 ... 0 0 0], [0 0 1 ... 0 0 0], [... ]、[…]]、[[…]、[…]、[…]、[…]、[…]]、…]
- 构建模型:
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
不是单热编码的,而是代表它在词汇表中的索引的整数。它将是对应于分类特征的整数。
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)