Skip to content

快速开始

yiling-dc edited this page Dec 24, 2018 · 3 revisions

本节描述如何使用XDL进行DeepCtr(Deep+Embeddings)模型训练

1. 模型描述

  • 示例模型包含一路Deep(deep0)特征以及两路sparse特征(sparse[0-1]),sparse特征通过Embedding计算生成两个8维的dense向量,并与Deep特征concat之后经过4层全连接层输出loss
  • 样本格式
  • 完整代码

2. 读取数据 (detail)

import xdl
import tensorflow as tf

reader = xdl.DataReader("r1", # reader名称                                                                                                                                                                                               
                        paths=["./data.txt"], # 文件列表                                                                                                                                                                                    
                        enable_state=False) # 是否打开reader state,用于分布式failover,开启的时候需要额外的命令行参数(task_num)                                                                                                       
reader.epochs(1).threads(1).batch_size(10).label_count(1)
reader.feature(name='sparse0', type=xdl.features.sparse)\  # 定义reader需要读取的特征,本例包括两个sparse特征组和一个dense特征组                                                                                              
    .feature(name='sparse1', type=xdl.features.sparse)\
    .feature(name='deep0', type=xdl.features.dense, nvec=256)
reader.startup()                                                                                                                                                 

3. 定义模型 (detail)

  • Embedding:
emb1 = xdl.embedding('emb1', # embedding名称,如果多路embedding共享同一个参数,name需配成同一个
                      batch['sparse0'], # 输入特征(xdl.SparseTensor)
                      xdl.TruncatedNormal(stddev=0.001),  # 参数初始化方法
                      8, # embedding维度
                      1024,  # sparse特征的维度
                      vtype='hash') # sparse特征类型:index(id类特征)/hash(hash特征)                                                                     
emb2 = xdl.embedding('emb2', batch['sparse1'], xdl.TruncatedNormal(stddev=0.001), 8, 1024, vtype='hash')                                                                      
  • Dense:
@xdl.tf_wrapper()
def model(deep, embeddinc1 = tf.layers.dense(                                                                                                                                                        
        input, 128, kernel_initializer=tf.truncated_normal_initializer(                                                                                                             
    fc3 = tf.layers.dense(                                                                                                                                                        
        fc2, 32, kernel_initializer=tf.truncated_normal_initializer(                                                                                                              
            stddev=0.001, dtype=tf.float32))                                                                                                                                      
    y = tf.layers.dense(                                                                                                                                                          
        fc3, 1, kernel_initializer=tf.truncated_normal_initializer(                                                                                                               
            stddev=0.001, dtype=tf.float32))                                                                                                                                      
    loss = tf.losses.sigmoid_cross_entropy(labels, y)                                                                                                                             
    return loss          

4. 定义优化器 (detail)

loss = model(batch['deep0'], [emb1, emb2], batch['label'])                                                                                                                    
train_op = xdl.SGD(0.5).optimize()   

5. 定义训练流程

log_hook = xdl.LoggerHook(loss, "loss:{0}", 10) 
sess = xdl.TrainSession(hooks=[log_hook])                                                                                                                                     
while not sess.should_stop():                                                                                                                                                 
    sess.run(train_op) 

6. 执行训练 (detail)

将上述代码保存为deepctr.py,执行以下步骤开始单机训练

# 进入docker,将代码和数据目录一起挂载进docker
sudo docker run -v [path_to_xdl]/examples/deepctr:/home/xxx/deepctr -it registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-tf1.12 /bin/bash
# 进入训练目录
cd /home/xxx/deepctr
# 开始单机训练
python deepctr.py --run_mode=local

注:data.txt为随机构造的一组数据,测试结果不收敛为正常现象,该测试样例主要是为了让用户快速熟悉XDL的api使用方法。