我有大量的消费产品,每个消费产品都分配了多个类别。例如,一件夹克可以同时属于“运动”和“户外”类别。
[类别很多(〜1000),我想创建一个低维的嵌入,可以用来比较产品的相似性。
我从创建代表每个产品的一组一次性编码开始:
import pandas as pd
df = pd.read_csv("/tmp/one-hot.csv")
df.head()
# Sports Mens Womens Outdoor
# Product 1 1 1 0 1 ...
# Product 2 0 0 1 1 ...
# ...~30000 more products
...,然后创建Keras嵌入层。由于有1000种可能的类别,因此总词汇量为1000(对吗?)。我将投影到10个维度,每个乘积矢量的长度为1000。
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding, Flatten
model = Sequential()
model.add(Embedding(1000, 10, input_length=1000))
model.compile('rmsprop', 'mse')
model.summary()
# Model: "sequential_17"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# embedding_17 (Embedding) (None, 1000, 10) 10000
# =================================================================
# Total params: 10,000
# Trainable params: 10,000
# Non-trainable params: 0
output = model.predict(df)
print(output.shape)
print(output.ndim)
# (30000, 1000, 10)
# 3
我正在努力理解输出形状。我曾期望一个2d向量(30,000、10),其中每一行都是单个乘积,其值是嵌入值。
是错误地设置了嵌入层,还是我误解了输出向量代表什么?
Embedding
实例存在两个问题:
您设置了input_length=1000
,它是为整数值序列而不是输入的维数。这会影响输入和输出中的时间步数,因此您应该将此参数设置为未设置:
model.add(Embedding(1000, 10))