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
Пример #2
0
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
Пример #3
0
    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
Пример #4
0
    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