def pyramid_hash_layer(x, hash_size, dict_size, num_hash=16, emb_size=256, min_win_size=2, max_win_size=4, shared=True): emb_list = [] for win_size in six.moves.xrange(min_win_size, max_win_size + 1): print("pyramid_hash_layer input shape ", x.shape) seq_enum = fluid.layers.sequence_enumerate(x, win_size) print("seq_enum.shape ", seq_enum.shape) xxhash = fluid.layers.hash(seq_enum, hash_size=hash_size, num_hash=num_hash) print("xxhash.shape ", xxhash.shape) pool = layers.fused_embedding_seq_pool( input=xxhash, size=[hash_size, emb_size // num_hash], is_sparse=True, param_attr=fluid.ParamAttr( name='PyramidHash_emb_0', learning_rate=640, initializer=fluid.initializer.Uniform(low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, dtype='float32') # emb = layers.embedding( # input=xxhash, size=[hash_size, emb_size // num_hash], is_sparse=True, # param_attr=fluid.ParamAttr( # name='PyramidHash_emb_0', # learning_rate=640, # initializer=fluid.initializer.Uniform(low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, # dtype='float32') # print(emb.name, emb.shape) # reshape_emb = layers.reshape(x=emb, shape=[-1, emb_size], inplace=True) # pool = fluid.layers.sequence_pool(input=reshape_emb, pool_type='sum') emb_list.append(pool) return emb_list
def emb_layer(x, dict_size, emb_size=256, shared=True): print("emb_layer input shape ", x.shape) pool = layers.fused_embedding_seq_pool( input=x, size=[dict_size, emb_size], is_sparse=True, param_attr=fluid.ParamAttr(name='EmbeddingWithVSum_emb_0', learning_rate=640, initializer=fluid.initializer.Uniform( low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, dtype='float32') # emb = layers.embedding( # input=x, size=[dict_size, emb_size], is_sparse=True, # param_attr=fluid.ParamAttr( # name='EmbeddingWithVSum_emb_0', # learning_rate=640, # initializer=fluid.initializer.Uniform(low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, # dtype='float32') # pool = fluid.layers.sequence_pool(input=emb, pool_type='sum') return pool
def emb_layer(self, x, dict_size, emb_size=256, shared=True): pool = layers.fused_embedding_seq_pool( input=x, size=[dict_size, emb_size], is_sparse=True, param_attr=fluid.ParamAttr( name='EmbeddingWithVSum_emb_0', learning_rate=640, initializer=fluid.initializer.Uniform( low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, dtype='float32') return pool
def pyramid_hash_layer(self, x, hash_size, dict_size, num_hash=16, emb_size=256, min_win_size=2, max_win_size=4, shared=True, name=''): emb_list = [] for win_size in six.moves.xrange(min_win_size, max_win_size + 1): seq_enum = fluid.layers.sequence_enumerate(x, win_size) xxhash = fluid.layers.hash(seq_enum, hash_size=hash_size * num_hash, num_hash=num_hash) pool = layers.fused_embedding_seq_pool( input=xxhash, size=[hash_size * num_hash, emb_size // num_hash], is_sparse=True, param_attr=fluid.ParamAttr( name='PyramidHash_emb_0', learning_rate=640, initializer=fluid.initializer.Uniform( low=-math.sqrt(6.0 / (emb_size * dict_size)), high=math.sqrt(6.0 / (emb_size * dict_size)), seed=0)) if shared else None, dtype='float32') self.var_append(seq_enum, name + "seq_enum_w" + str(win_size)) self.var_append(xxhash, name + "xxhash_w" + str(win_size)) self.var_append(pool, name + "pool_w" + str(win_size)) emb_list.append(pool) return emb_list