integer_value_sequence与sparse_binary_vector的区别
Created by: cszhou
问题1 在05.recommender_system的train.py代码中category_id与movie_title的数据形式应该是一致的,都是有多个nominal的可能值。具体来说就是,category_id对应category_dict中的多个取值,movie_title类似。 但是这两个选择了不同的数据类型integer_value_sequence与sparse_binary_vector,这个有什么区别。如果没有区别的话,在实际中要怎么选择。
def get_mov_combined_features():
movie_title_dict = paddle.dataset.movielens.get_movie_title_dict()
mov_id = paddle.layer.data(
name='movie_id',
type=paddle.data_type.integer_value(
paddle.dataset.movielens.max_movie_id() + 1))
mov_emb = paddle.layer.embedding(input=mov_id, size=32)
mov_fc = paddle.layer.fc(input=mov_emb, size=32)
mov_categories = paddle.layer.data(
name='category_id',
type=paddle.data_type.sparse_binary_vector( #Datatype: sparse_binary_vector
len(paddle.dataset.movielens.movie_categories())))
mov_categories_hidden = paddle.layer.fc(input=mov_categories, size=32)
mov_title_id = paddle.layer.data(
name='movie_title',
type=paddle.data_type.integer_value_sequence(len(movie_title_dict))) #Datatype: integer_value_sequence
mov_title_emb = paddle.layer.embedding(input=mov_title_id, size=32)
mov_title_conv = paddle.networks.sequence_conv_pool(
input=mov_title_emb, hidden_size=32, context_len=3)
问题2 在代码中
global MOVIE_TITLE_DICT
MOVIE_TITLE_DICT = dict()
for i, w in enumerate(title_word_set):
MOVIE_TITLE_DICT[w] = i
global CATEGORIES_DICT
CATEGORIES_DICT = dict()
for i, c in enumerate(categories_set):
CATEGORIES_DICT[c] = i
在给出的例子中nominal类型的数据都先建立一个nominal特征的dict用来存储nominal特征的全部可能,假设全部可能为len = length(dict)全集。然后得到每个nomial特征唯一的index。index的取值为[1, index]。 问,是否可以使用简单的hash得到index,而不用经过建dict,找唯一index这个步骤? 再具体的,如果我的nominal特征是user_id,user_id共有100个取值可能,第一个user_id的取值为999,第二个user_id取值为888。这些user_id是否可以直接以下面的形式使用。
user_id = paddle.layer.data(
name='user',
type=paddle.data_type.integer_value(100)) #使用的数据类型是integer_value
问题3 在问题2的例子中,使用的数据类型是integer_value,能否使用sparse_binary_vector。区别是什么?