示例#1
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2019)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    single_cate_feats = cate_feats[:, 0:params.cate_field_size]
    multi_cate_feats = cate_feats[:, params.cate_field_size:params.cate_field_size + params.multi_feats_size]
    attention_cate_feats = cate_feats[:, params.cate_field_size + params.multi_feats_size:]

    # init_embedding
    feats_emb = my_layer.emb_init(name='feats_emb', feat_num=params.cate_feats_size, embedding_size=params.embedding_size)
    # single_category -> embedding
    single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
    single_cate_emb = tf.reshape(single_cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])
    # attention
    attention_emb = attention_alg(params, feats_emb, multi_cate_feats, single_cate_feats, attention_cate_feats)
    # multi_category -> embedding
    multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats)
    # deep input dense
    if len(params.multi_feats_range) > 0:
        dense = tf.concat([cont_feats, vector_feats, single_cate_emb, multi_cate_emb, attention_emb], axis=1, name='dense_vector')
    else:
        dense = tf.concat([cont_feats, vector_feats, single_cate_emb, attention_emb], axis=1, name='dense_vector')
    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        dense = tf.layers.dense(inputs=dense, units=params.hidden_units[i], activation=tf.nn.relu)
    out = tf.layers.dense(inputs=dense, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
def model_fn(features, labels, mode, params):
    tf.set_random_seed(2019)

    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    feats_emb = my_layer.emb_init(name='feats_emb',
                                  feat_num=params.cate_feats_size,
                                  embedding_size=params.embedding_size)
    # category -> Embedding
    cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats)
    cate_emb = tf.reshape(
        cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])

    # deep input dense
    dense = tf.concat([vector_feats, cate_emb], axis=1, name='dense_vector')

    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        dense = tf.layers.dense(inputs=dense,
                                units=params.hidden_units[i],
                                activation=tf.nn.relu)
    out = tf.layers.dense(inputs=dense, units=1)

    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)

    return model_estimator_spec
示例#3
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2020)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]

    cont_feats_index = tf.Variable(
        [[i for i in range(params.cont_field_count)]],
        trainable=False,
        dtype=tf.int64,
        name="cont_feats_index")
    cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size)

    feats_size = params.cont_field_count + params.cate_emb_space_size
    feats_emb = my_layer.emb_init(name='feats_emb',
                                  feat_num=feats_size,
                                  embedding_size=params.embedding_size)

    cont_emb = tf.nn.embedding_lookup(
        feats_emb, ids=cont_feats_index)  # None * F * embedding_size
    cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1])
    embeddings = tf.multiply(cont_emb, cont_value)
    cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats)
    embeddings = tf.concat([embeddings, cate_emb], axis=1)
    if params.multi_feats_type == 'dense':
        for name_topN in params.multi_cate_field_list:
            dense_embedding = tf.nn.embedding_lookup(
                feats_emb,
                ids=features[name_topN[0]])  # None, topN, embedding_size
            dense_embedding = tf.reduce_sum(dense_embedding, axis=1)  # None, 1
            dense_embedding = tf.reshape(dense_embedding,
                                         shape=[-1, 1, params.embedding_size])
            embeddings = tf.concat([embeddings, dense_embedding], axis=1)
    else:  # sparse
        for name_topN in params.multi_cate_field_list:
            sparse_embedding = tf.nn.embedding_lookup_sparse(
                feats_emb,
                sp_ids=features[name_topN[0]],
                sp_weights=None,
                combiner='sum')  # None * embedding_size
            sparse_embedding = tf.reshape(sparse_embedding,
                                          shape=[-1, 1, params.embedding_size])
            embeddings = tf.concat([embeddings, sparse_embedding], axis=1)

    deep_emb = tf.reshape(
        embeddings,
        shape=[-1, params.total_field_count * params.embedding_size])
    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        deep_emb = tf.layers.dense(inputs=deep_emb,
                                   units=params.hidden_units[i],
                                   activation=tf.nn.relu)
    out = tf.layers.dense(inputs=deep_emb, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
示例#4
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2020)
    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]

    cont_feats_index = tf.Variable([[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index")
    cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size)

    feats_size = params.cont_field_count + params.cate_emb_space_size
    feats_emb = my_layer.emb_init(name='feats_emb', feat_num=feats_size, embedding_size=params.embedding_size)

    # cont_feats
    cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_feats_index)  # None * F * embedding_size
    cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1])
    embeddings = tf.multiply(cont_emb, cont_value)
    # cate_feats
    cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats)
    embeddings = tf.concat([embeddings, cate_emb], axis=1)
    # multi_cate_feats
    for name_topN in params.multi_cate_field_list:
        multi_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=features[name_topN[0]])  # None, topN, embedding_size
        multi_cate_emb = tf.reduce_sum(multi_cate_emb, axis=1)  # None, embedding_size
        multi_cate_emb = tf.reshape(multi_cate_emb, shape=[-1, 1, params.embedding_size])
        embeddings = tf.concat([embeddings, multi_cate_emb], axis=1)
    # target-attention 1vN (e.g. item_cat1 & user_click_cat1)
    for k_v in params.target_att_1vN_list:
        item_feat = tf.split(cate_feats, params.cate_field_count, axis=1)[k_v[1]]
        user_feat = features[k_v[0]]
        nonzero_len = tf.count_nonzero(user_feat, axis=1)
        item_emb = tf.nn.embedding_lookup(feats_emb, ids=item_feat)  # [B, 1, H]
        item_emb = tf.reshape(item_emb, shape=[-1, params.embedding_size])  # [B, H]
        user_emb = tf.nn.embedding_lookup(feats_emb, ids=user_feat)  # [B, T, H])
        att_1vN_emb = my_layer.attention(item_emb, user_emb, nonzero_len)  # [B, 1, H]
        embeddings = tf.concat([embeddings, att_1vN_emb], axis=1)
    # target-attention NvN (e.g. item_tags & user_click_tags)
    for k_v in params.target_att_NvN_list:
        item_feat = features[k_v[1]]
        user_feat = features[k_v[0]]
        nonzero_len = tf.count_nonzero(user_feat, axis=1)
        item_emb = tf.nn.embedding_lookup(feats_emb, ids=item_feat)  # [B, N, H]
        user_emb = tf.nn.embedding_lookup(feats_emb, ids=user_feat)  # [B, T, H])
        att_NvN_emb = my_layer.attention_multi(item_emb, user_emb, nonzero_len)  # [B, 1, H]
        embeddings = tf.concat([embeddings, att_NvN_emb], axis=1)

    # deep
    embeddings = tf.layers.flatten(embeddings)
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        embeddings = tf.layers.dense(inputs=embeddings, units=params.hidden_units[i], activation=tf.nn.relu)
    out = tf.layers.dense(inputs=embeddings, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2019)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    single_cate_feats = cate_feats[:, 0:params.cate_field_size]
    # multi_cate_feats = cate_feats[:, params.cate_field_size:]

    feats_emb = my_layer.emb_init(name='feats_emb',
                                  feat_num=params.cate_feats_size,
                                  embedding_size=params.embedding_size)
    # single_category -> embedding
    cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
    cate_emb = tf.reshape(
        cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])
    # aid -> attention
    aid = vector_feats[:, -112:-96]
    user_click_aids = vector_feats[:, -96:]
    user_click_aids = tf.reshape(user_click_aids, shape=[-1, 6, 16])
    user_click_aids_len = tf.constant(
        6, shape=[user_click_aids.get_shape().as_list()[0]])
    attention_emb = attention(aid, user_click_aids, user_click_aids_len)
    attention_emb = tf.reshape(attention_emb, shape=[-1, 16])

    # deep input dense
    dense = tf.concat([cont_feats, vector_feats, cate_emb, attention_emb],
                      axis=1,
                      name='dense_vector')

    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        dense = tf.layers.dense(inputs=dense,
                                units=params.hidden_units[i],
                                activation=tf.nn.relu)
    out = tf.layers.dense(inputs=dense, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
示例#6
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2020)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    cont_feats_index = tf.Variable([[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index")
    cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size)

    feats_size = params.cont_field_count + params.cate_emb_space_size
    weights = dict()
    weights["feats_emb"] = tf.get_variable(name='feats_emb', shape=[feats_size, params.embedding_size], initializer=tf.glorot_normal_initializer())
    weights["feats_bias"] = tf.get_variable(name='feats_bias', shape=[feats_size, 1], initializer=tf.glorot_normal_initializer())

    with tf.name_scope('fm_part'):
        # FM_first_order [?, total_field_count]
        first_cont_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cont_feats_index)  # [None, F, 1]
        first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_count])
        first_order = tf.multiply(first_cont_emb, cont_feats)
        first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cate_feats)
        first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_count])
        first_order = tf.concat([first_order, first_cate_emb], axis=1)
        for name_topN in params.multi_cate_field_list:
            dense_embedding = tf.nn.embedding_lookup(weights["feats_bias"], ids=features[name_topN[0]])  # [None, topN, 1]
            dense_embedding = tf.reduce_sum(dense_embedding, axis=1)  # [None, 1]
            first_order = tf.concat([first_order, dense_embedding], axis=1)

        # FM_second_order [?, embedding_size]
        second_cont_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cont_feats_index)  # [None, F, embedding_size]
        second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1])
        embeddings = tf.multiply(second_cont_emb, second_cont_value)
        second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cate_feats)
        embeddings = tf.concat([embeddings, second_cate_emb], axis=1)  # [None, F, embedding_size]
        for name_topN in params.multi_cate_field_list:
            dense_embedding = tf.nn.embedding_lookup(weights["feats_emb"], ids=features[name_topN[0]])  # [None, topN, embedding_size]
            dense_embedding = tf.reduce_sum(dense_embedding, axis=1)  # [None, embedding_size]
            dense_embedding = tf.reshape(dense_embedding, shape=[-1, 1, params.embedding_size])
            embeddings = tf.concat([embeddings, dense_embedding], axis=1)
        # target-attention 1vN (e.g. item_cat1 & user_click_cat1)
        for k_v in params.target_att_1vN_list:
            item_feat = tf.split(cate_feats, params.cate_field_count, axis=1)[k_v[1]]
            user_feat = features[k_v[0]]
            nonzero_len = tf.count_nonzero(user_feat, axis=1)
            item_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=item_feat)  # [B, 1, H]
            item_emb = tf.reshape(item_emb, shape=[-1, params.embedding_size])  # [B, H]
            user_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=user_feat)  # [B, T, H])
            att_1vN_emb = my_layer.attention(item_emb, user_emb, nonzero_len)  # [B, 1, H]
            embeddings = tf.concat([embeddings, att_1vN_emb], axis=1)
        # target-attention NvN (e.g. item_tags & user_click_tags)
        for k_v in params.target_att_NvN_list:
            item_feat = features[k_v[1]]
            user_feat = features[k_v[0]]
            nonzero_len = tf.count_nonzero(user_feat, axis=1)
            item_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=item_feat)  # [B, N, H]
            user_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=user_feat)  # [B, T, H])
            att_NvN_emb = my_layer.attention_multi(item_emb, user_emb, nonzero_len)  # [B, 1, H]
            embeddings = tf.concat([embeddings, att_NvN_emb], axis=1)

        sum_emb = tf.reduce_sum(embeddings, 1)
        sum_square_emb = tf.square(sum_emb)
        square_emb = tf.square(embeddings)
        square_sum_emb = tf.reduce_sum(square_emb, 1)
        second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb)

        # FM_res [?, total_field_count + embedding_size]
        fm_res = tf.concat([first_order, second_order], axis=1)

    with tf.name_scope('deep_part'):
        deep_res = tf.layers.flatten(embeddings)
        len_layers = len(params.hidden_units)
        for i in range(0, len_layers):
            deep_res = tf.layers.dense(inputs=deep_res, units=params.hidden_units[i], activation=tf.nn.relu)

    with tf.name_scope('deep_fm'):
        input_size = params.total_field_count + params.embedding_size + params.hidden_units[-1]  # FM_res->total_field_count+embedding_size, Deep_res->hidden_units[-1]
        weights["concat_emb"] = tf.get_variable(name='concat_emb', shape=[input_size, 1], initializer=tf.glorot_normal_initializer())
        weights["concat_bias"] = tf.get_variable(name='concat_bias', shape=[1], initializer=tf.constant_initializer(0.01))

        feats_input = tf.concat([fm_res, deep_res], axis=1)
        out = tf.add(tf.matmul(feats_input, weights["concat_emb"]), weights["concat_bias"])
        y = tf.nn.sigmoid(out)

    model_estimator_spec = op.model_optimizer(params, mode, labels, y)

    return model_estimator_spec
def model_fn(features, labels, mode, params):
    use_deep = True
    use_fm = True
    tf.set_random_seed(2019)

    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    index_max_size = params.cont_field_size + params.cate_feats_size
    fm_first_order_emb = my_layer.emb_init(name='fm_first_order_emb', feat_num=index_max_size, embedding_size=1)
    feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size)

    with tf.name_scope('fm_part'):
        input_field_size = params.cont_field_size + params.cate_field_size + params.multi_field_size

        # FM_first_order [?, input_field_size]
        # cate
        first_cate_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=cate_feats)
        first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_size])
        first_order = tf.nn.dropout(first_cate_emb, params.dropout_keep_fm[0])

        # FM_second_order [?, embedding_size]
        # cate
        second_order_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats)
        sum_emb = tf.reduce_sum(second_order_emb, 1)
        sum_square_emb = tf.square(sum_emb)
        square_emb = tf.square(second_order_emb)
        square_sum_emb = tf.reduce_sum(square_emb, 1)
        second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb)
        second_order = tf.nn.dropout(second_order, params.dropout_keep_fm[1])
        print("fm_second_order:", second_order)

        # FM_res [?, self.input_field_size + embedding_size]
        fm_res = tf.concat([first_order, second_order], axis=1)

    with tf.name_scope('deep_part'):
        # category -> Embedding
        cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats)
        cate_emb = tf.reshape(cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])
        # dense input
        deep_res = tf.concat([vector_feats, cate_emb], axis=1, name='dense_vector')
        # deep
        len_layers = len(params.hidden_units)
        for i in range(0, len_layers):
            deep_res = tf.layers.dense(inputs=deep_res, units=params.hidden_units[i], activation=tf.nn.relu)

    with tf.name_scope('deep_fm'):
        if use_fm and use_deep:
            feats_input = tf.concat([fm_res, deep_res], axis=1)
            feats_input_size = input_field_size + params.embedding_size + params.hidden_units[-1]
        elif use_fm:
            feats_input = fm_res
            feats_input_size = input_field_size + params.embedding_size
        elif use_deep:
            feats_input = deep_res
            feats_input_size = params.hidden_units[-1]

        glorot = np.sqrt(2.0 / (feats_input_size + 1))
        deep_fm_weight = tf.Variable(
            np.random.normal(loc=0, scale=glorot, size=(feats_input_size, 1)), dtype=np.float32)
        deep_fm_bias = tf.Variable(tf.random_normal([1]))

        out = tf.add(tf.matmul(feats_input, deep_fm_weight), deep_fm_bias)

    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)

    return model_estimator_spec
示例#8
0
def model_fn(labels, features, mode, params):
    use_deep = True
    use_fm = True
    tf.set_random_seed(2019)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    single_cate_feats = cate_feats[:, 0:params.cate_field_size]
    multi_cate_feats = cate_feats[:, params.cate_field_size:]
    cont_feats_index = tf.Variable([[i for i in range(params.cont_field_size)]], trainable=False, dtype=tf.int64, name="cont_feats_index")

    index_max_size = params.cont_field_size + params.cate_feats_size
    fm_first_order_emb = my_layer.emb_init(name='fm_first_order_emb', feat_num=index_max_size, embedding_size=1)
    feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size)

    with tf.name_scope('fm_part'):
        input_field_size = params.cont_field_size + params.cate_field_size + len(params.multi_feats_range)
        cont_index_add = tf.add(cont_feats_index, params.cate_feats_size)

        # FM_first_order [?, input_field_size]
        # cont
        first_cont_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=cont_index_add)
        first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_size])
        first_cont_mul = tf.multiply(first_cont_emb, cont_feats)
        # single_cate
        first_single_cate_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=single_cate_feats)
        first_single_cate_emb = tf.reshape(first_single_cate_emb, shape=[-1, params.cate_field_size])
        # multi_cate
        first_multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, fm_first_order_emb, multi_cate_feats)
        # concat cont & single_cate & multi_cate
        first_order_emb = tf.concat([first_cont_mul, first_single_cate_emb, first_multi_cate_emb], axis=1)
        first_order = tf.nn.dropout(first_order_emb, params.dropout_keep_fm[0])

        # FM_second_order [?, embedding_size]
        # cont
        second_cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_index_add)
        second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_size, 1])
        second_cont_emb = tf.multiply(second_cont_emb, second_cont_value)
        # single_cate
        second_single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
        # multi_cate
        second_multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats)
        second_multi_cate_emb = tf.reshape(second_multi_cate_emb,
                                           shape=[-1, len(params.multi_feats_range), params.embedding_size])
        # concat cont & single_cate & multi_cate
        second_order_emb = tf.concat([second_cont_emb, second_single_cate_emb, second_multi_cate_emb], axis=1)

        sum_emb = tf.reduce_sum(second_order_emb, 1)
        sum_square_emb = tf.square(sum_emb)
        square_emb = tf.square(second_order_emb)
        square_sum_emb = tf.reduce_sum(square_emb, 1)
        second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb)
        second_order = tf.nn.dropout(second_order, params.dropout_keep_fm[1])

        # FM_res [?, self.input_field_size + embedding_size]
        fm_res = tf.concat([first_order, second_order], axis=1)

    with tf.name_scope('deep_part'):
        # single_cate
        single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
        single_cate_emb = tf.reshape(single_cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])
        # multi_cate
        multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats)

        deep_res = tf.concat([cont_feats, vector_feats, single_cate_emb, multi_cate_emb], axis=1, name='dense_vector')
        # deep
        len_layers = len(params.hidden_units)
        for i in range(0, len_layers):
            deep_res = tf.layers.dense(inputs=deep_res, units=params.hidden_units[i], activation=tf.nn.relu)

    with tf.name_scope('deep_fm'):
        if use_fm and use_deep:
            feats_input = tf.concat([fm_res, deep_res], axis=1)
            feats_input_size = input_field_size + params.embedding_size + params.hidden_units[-1]
        elif use_fm:
            feats_input = fm_res
            feats_input_size = input_field_size + params.embedding_size
        elif use_deep:
            feats_input = deep_res
            feats_input_size = params.hidden_units[-1]

        glorot = np.sqrt(2.0 / (feats_input_size + 1))
        deep_fm_weight = tf.Variable(
            np.random.normal(loc=0, scale=glorot, size=(feats_input_size, 1)), dtype=np.float32)
        deep_fm_bias = tf.Variable(tf.random_normal([1]))

        out = tf.add(tf.matmul(feats_input, deep_fm_weight), deep_fm_bias)

    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)

    return model_estimator_spec
示例#9
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2019)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    single_cate_feats = cate_feats[:, 0:params.cate_field_size]
    multi_cate_feats = cate_feats[:, params.cate_field_size:]
    cont_feats_index = tf.Variable([[i
                                     for i in range(params.cont_field_size)]],
                                   trainable=False,
                                   dtype=tf.int64,
                                   name="cont_feats_index")

    cont_index_add = tf.add(cont_feats_index, params.cate_feats_size)

    index_max_size = params.cont_field_size + params.cate_feats_size
    feats_emb = my_layer.emb_init(name='feats_emb',
                                  feat_num=index_max_size,
                                  embedding_size=params.embedding_size)

    # cont_feats -> Embedding
    with tf.name_scope("cont_feat_emb"):
        ori_cont_emb = tf.nn.embedding_lookup(feats_emb,
                                              ids=cont_index_add,
                                              name="ori_cont_emb")
        cont_value = tf.reshape(cont_feats,
                                shape=[-1, params.cont_field_size, 1],
                                name="cont_value")
        cont_emb = tf.multiply(ori_cont_emb, cont_value)
        autoint_cont = cont_emb
        cont_emb = tf.reshape(
            cont_emb,
            shape=[-1, params.cont_field_size * params.embedding_size],
            name="cont_emb")

    # single_category -> Embedding
    with tf.name_scope("single_cate_emb"):
        cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
        autoint_cate = cate_emb
        cate_emb = tf.reshape(
            cate_emb,
            shape=[-1, params.cate_field_size * params.embedding_size])

    # multi_category -> Embedding
    with tf.name_scope("multi_cate_emb"):
        multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range,
                                                 feats_emb, multi_cate_feats)
        autoint_multi_cate = tf.reshape(
            multi_cate_emb,
            shape=[-1,
                   len(params.multi_feats_range), params.embedding_size])

    # AutoInteracting
    with tf.name_scope("AutoInt"):
        autoint_input = tf.concat(
            [autoint_cont, autoint_cate, autoint_multi_cate], axis=1)
        for i in range(params.autoint_layer_num):
            autoint_input = my_layer.InteractingLayer(
                num_layer=i,
                att_emb_size=params.autoint_emb_size,
                seed=2020,
                head_num=params.autoint_head_num,
                use_res=params.autoint_use_res)(autoint_input)
        autoint_output = tf.layers.Flatten()(autoint_input)

    # deep input dense
    dense = tf.concat([cont_emb, vector_feats, cate_emb, multi_cate_emb],
                      axis=1,
                      name='dense_vector')

    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        dense = tf.layers.dense(inputs=dense,
                                units=params.hidden_units[i],
                                activation=tf.nn.relu)

    final_input = tf.concat([autoint_output, dense], axis=1)
    out = tf.layers.dense(inputs=final_input, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
示例#10
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2020)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    cont_feats_index = tf.Variable(
        [[i for i in range(params.cont_field_count)]],
        trainable=False,
        dtype=tf.int64,
        name="cont_feats_index")
    cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size)

    feats_size = params.cont_field_count + params.cate_emb_space_size
    weights = dict()
    weights["feats_emb"] = tf.get_variable(
        name='feats_emb',
        shape=[feats_size, params.embedding_size],
        initializer=tf.glorot_normal_initializer())
    weights["feats_bias"] = tf.get_variable(
        name='feats_bias',
        shape=[feats_size, 1],
        initializer=tf.glorot_normal_initializer())

    with tf.name_scope('fm_part'):
        # FM_first_order [?, total_field_count]
        first_cont_emb = tf.nn.embedding_lookup(
            weights["feats_bias"], ids=cont_feats_index)  # [None, F, 1]
        first_cont_emb = tf.reshape(first_cont_emb,
                                    shape=[-1, params.cont_field_count])
        first_order = tf.multiply(first_cont_emb, cont_feats)
        first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"],
                                                ids=cate_feats)
        first_cate_emb = tf.reshape(first_cate_emb,
                                    shape=[-1, params.cate_field_count])
        first_order = tf.concat([first_order, first_cate_emb], axis=1)
        if params.multi_feats_type == 'dense':
            for name_topN in params.multi_cate_field_list:
                dense_embedding = tf.nn.embedding_lookup(
                    weights["feats_bias"],
                    ids=features[name_topN[0]])  # [None, topN, 1]
                dense_embedding = tf.reduce_sum(dense_embedding,
                                                axis=1)  # [None, 1]
                first_order = tf.concat([first_order, dense_embedding], axis=1)
        else:  # sparse
            for name_topN in params.multi_cate_field_list:
                sparse_embedding = tf.nn.embedding_lookup_sparse(
                    weights["feats_bias"],
                    sp_ids=features[name_topN[0]],
                    sp_weights=None,
                    combiner='sum')  # [None, 1]
                first_order = tf.concat([first_order, sparse_embedding],
                                        axis=1)

        # FM_second_order [?, embedding_size]
        second_cont_emb = tf.nn.embedding_lookup(
            weights["feats_emb"],
            ids=cont_feats_index)  # [None, F, embedding_size]
        second_cont_value = tf.reshape(cont_feats,
                                       shape=[-1, params.cont_field_count, 1])
        embeddings = tf.multiply(second_cont_emb, second_cont_value)
        second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"],
                                                 ids=cate_feats)
        embeddings = tf.concat([embeddings, second_cate_emb],
                               axis=1)  # [None, F, embedding_size]
        if params.multi_feats_type == 'dense':
            for name_topN in params.multi_cate_field_list:
                dense_embedding = tf.nn.embedding_lookup(
                    weights["feats_emb"],
                    ids=features[name_topN[0]])  # [None, topN, embedding_size]
                dense_embedding = tf.reduce_sum(
                    dense_embedding, axis=1)  # [None, embedding_size]
                dense_embedding = tf.reshape(
                    dense_embedding, shape=[-1, 1, params.embedding_size])
                embeddings = tf.concat([embeddings, dense_embedding], axis=1)
        else:  # sparse
            for name_topN in params.multi_cate_field_list:
                sparse_embedding = tf.nn.embedding_lookup_sparse(
                    weights["feats_emb"],
                    sp_ids=features[name_topN[0]],
                    sp_weights=None,
                    combiner='sum')  # [None, embedding_size]
                sparse_embedding = tf.reshape(
                    sparse_embedding, shape=[-1, 1, params.embedding_size])
                embeddings = tf.concat([embeddings, sparse_embedding], axis=1)
        autoint_emb = embeddings
        with tf.name_scope("AutoInt"):
            for i in range(params.autoint_layer_count):
                autoint_emb = my_layer.InteractingLayer(
                    num_layer=i,
                    att_emb_size=params.autoint_emb_size,
                    seed=2020,
                    head_num=params.autoint_head_count,
                    use_res=params.autoint_use_res
                )(
                    autoint_emb
                )  # [None, F, head*autoint_emb_size] 令head*autoint_emb_size=embedding_size
        embeddings = tf.concat([embeddings, autoint_emb], axis=1)

        sum_emb = tf.reduce_sum(embeddings, 1)
        sum_square_emb = tf.square(sum_emb)
        square_emb = tf.square(embeddings)
        square_sum_emb = tf.reduce_sum(square_emb, 1)
        second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb)
        # print(second_order)

        # FM_res [?, total_field_count + embedding_size]
        fm_res = tf.concat([first_order, second_order], axis=1)

    # deep_res including autoint
    deep_res = tf.layers.flatten(embeddings)
    wide = deep_res  # wide including autoint
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        deep_res = tf.layers.dense(inputs=deep_res,
                                   units=params.hidden_units[i],
                                   activation=tf.nn.relu)

    # fm & deep & wide
    feats_input = tf.concat([fm_res, deep_res, wide], axis=1)
    out = tf.layers.dense(inputs=feats_input, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)

    return model_estimator_spec
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2019)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    vector_feats = features["vector_feats"]

    single_cate_feats = cate_feats[:, 0:params.cate_field_size]
    multi_cate_feats = cate_feats[:, params.cate_field_size:]
    cont_feats_index = tf.Variable([[i
                                     for i in range(params.cont_field_size)]],
                                   trainable=False,
                                   dtype=tf.int64,
                                   name="cont_feats_index")

    cont_index_add = tf.add(cont_feats_index, params.cate_feats_size)

    index_max_size = params.cont_field_size + params.cate_feats_size
    feats_emb = my_layer.emb_init(name='feats_emb',
                                  feat_num=index_max_size,
                                  embedding_size=params.embedding_size)

    # cont_feats -> Embedding
    ori_cont_emb = tf.nn.embedding_lookup(feats_emb,
                                          ids=cont_index_add,
                                          name="ori_cont_emb")
    cont_value = tf.reshape(cont_feats,
                            shape=[-1, params.cont_field_size, 1],
                            name="cont_value")
    cont_emb = tf.multiply(ori_cont_emb, cont_value)
    cont_emb = tf.reshape(
        cont_emb,
        shape=[-1, params.cont_field_size * params.embedding_size],
        name="cont_emb")
    # print(ori_cont_emb)
    # print(cont_value)
    # print(cont_emb)

    # single_category -> Embedding
    cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats)
    cate_emb = tf.reshape(
        cate_emb, shape=[-1, params.cate_field_size * params.embedding_size])
    # print(cate_emb)

    # multi_category -> Embedding
    multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range,
                                             feats_emb, multi_cate_feats)

    # deep input dense
    dense = tf.concat([cont_emb, vector_feats, cate_emb, multi_cate_emb],
                      axis=1,
                      name='dense_vector')

    # deep
    len_layers = len(params.hidden_units)
    for i in range(0, len_layers):
        dense = tf.layers.dense(inputs=dense,
                                units=params.hidden_units[i],
                                activation=tf.nn.relu)
    out = tf.layers.dense(inputs=dense, units=1)
    score = tf.identity(tf.nn.sigmoid(out), name='score')
    model_estimator_spec = op.model_optimizer(params, mode, labels, score)
    return model_estimator_spec
示例#12
0
def model_fn(labels, features, mode, params):
    tf.set_random_seed(2020)

    cont_feats = features["cont_feats"]
    cate_feats = features["cate_feats"]
    cont_feats_index = tf.Variable(
        [[i for i in range(params.cont_field_count)]],
        trainable=False,
        dtype=tf.int64,
        name="cont_feats_index")
    cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size)

    feats_size = params.cont_field_count + params.cate_emb_space_size
    weights = dict()
    weights["feats_emb"] = tf.get_variable(
        name='feats_emb',
        shape=[feats_size, params.embedding_size],
        initializer=tf.glorot_normal_initializer())
    weights["feats_bias"] = tf.get_variable(
        name='feats_bias',
        shape=[feats_size, 1],
        initializer=tf.glorot_normal_initializer())

    with tf.name_scope('fm_part'):
        # FM_first_order [?, total_field_count]
        first_cont_emb = tf.nn.embedding_lookup(
            weights["feats_bias"], ids=cont_feats_index)  # [None, F, 1]
        first_cont_emb = tf.reshape(first_cont_emb,
                                    shape=[-1, params.cont_field_count])
        first_order = tf.multiply(first_cont_emb, cont_feats)
        first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"],
                                                ids=cate_feats)
        first_cate_emb = tf.reshape(first_cate_emb,
                                    shape=[-1, params.cate_field_count])
        first_order = tf.concat([first_order, first_cate_emb], axis=1)
        if params.multi_feats_type == 'dense':
            for name_topN in params.multi_cate_field_list:
                dense_embedding = tf.nn.embedding_lookup(
                    weights["feats_bias"],
                    ids=features[name_topN[0]])  # [None, topN, 1]
                dense_embedding = tf.reduce_sum(dense_embedding,
                                                axis=1)  # [None, 1]
                first_order = tf.concat([first_order, dense_embedding], axis=1)
        else:  # sparse
            for name_topN in params.multi_cate_field_list:
                sparse_embedding = tf.nn.embedding_lookup_sparse(
                    weights["feats_bias"],
                    sp_ids=features[name_topN[0]],
                    sp_weights=None,
                    combiner='sum')  # [None, 1]
                first_order = tf.concat([first_order, sparse_embedding],
                                        axis=1)

        # FM_second_order [?, embedding_size]
        second_cont_emb = tf.nn.embedding_lookup(
            weights["feats_emb"],
            ids=cont_feats_index)  # [None, F, embedding_size]
        second_cont_value = tf.reshape(cont_feats,
                                       shape=[-1, params.cont_field_count, 1])
        embeddings = tf.multiply(second_cont_emb, second_cont_value)
        second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"],
                                                 ids=cate_feats)
        embeddings = tf.concat([embeddings, second_cate_emb],
                               axis=1)  # [None, F, embedding_size]
        if params.multi_feats_type == 'dense':
            for name_topN in params.multi_cate_field_list:
                dense_embedding = tf.nn.embedding_lookup(
                    weights["feats_emb"],
                    ids=features[name_topN[0]])  # [None, topN, embedding_size]
                dense_embedding = tf.reduce_sum(
                    dense_embedding, axis=1)  # [None, embedding_size]
                dense_embedding = tf.reshape(
                    dense_embedding, shape=[-1, 1, params.embedding_size])
                embeddings = tf.concat([embeddings, dense_embedding], axis=1)
        else:  # sparse
            for name_topN in params.multi_cate_field_list:
                sparse_embedding = tf.nn.embedding_lookup_sparse(
                    weights["feats_emb"],
                    sp_ids=features[name_topN[0]],
                    sp_weights=None,
                    combiner='sum')  # [None, embedding_size]
                sparse_embedding = tf.reshape(
                    sparse_embedding, shape=[-1, 1, params.embedding_size])
                embeddings = tf.concat([embeddings, sparse_embedding], axis=1)

        sum_emb = tf.reduce_sum(embeddings, 1)
        sum_square_emb = tf.square(sum_emb)
        square_emb = tf.square(embeddings)
        square_sum_emb = tf.reduce_sum(square_emb, 1)
        second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb)
        # print(second_order)

        # FM_res [?, total_field_count + embedding_size]
        fm_res = tf.concat([first_order, second_order], axis=1)

    with tf.name_scope('deep_part'):
        deep_res = tf.reshape(
            embeddings,
            shape=[-1, params.total_field_count * params.embedding_size])
        len_layers = len(params.hidden_units)
        for i in range(0, len_layers):
            deep_res = tf.layers.dense(inputs=deep_res,
                                       units=params.hidden_units[i],
                                       activation=tf.nn.relu)

    with tf.name_scope('deep_fm'):
        input_size = params.total_field_count + params.embedding_size + params.hidden_units[
            -1]  # FM_res->total_field_count+embedding_size, Deep_res->hidden_units[-1]
        weights["concat_emb"] = tf.get_variable(
            name='concat_emb',
            shape=[input_size, 1],
            initializer=tf.glorot_normal_initializer())
        weights["concat_bias"] = tf.get_variable(
            name='concat_bias',
            shape=[1],
            initializer=tf.constant_initializer(0.01))

        feats_input = tf.concat([fm_res, deep_res], axis=1)
        out = tf.add(tf.matmul(feats_input, weights["concat_emb"]),
                     weights["concat_bias"])
        y = tf.nn.sigmoid(out)

    model_estimator_spec = op.model_optimizer(params, mode, labels, y)

    return model_estimator_spec