|
- from keras.initializers import VarianceScaling
- from keras.layers import Input, Dense, Add, Multiply, Concatenate, Average, Minimum, Maximum
- from keras.models import Model
- from tensorflow_core.python.ops import init_ops
- from mmoe import MMoE
- from Parameter import args
-
-
- def switch():
- """Choose a type of model"""
- switch_model = {'model_original': model_original,
- 'model_aggr_beforemmoe': model_aggr_beforemmoe,
- 'model_aggr_aftermmoe': model_aggr_aftermmoe,
- 'model_aggr_beforeoutput': model_aggr_beforeoutput,
- }
- model = switch_model.get(args.model_type, model_original)
- return model
-
-
- def model_original(attr_columns, title_columns, output_layers, output_info):
- """没有文本特征的模型,或者文本在输入前只是简单的拼接"""
- # Set up the input layer
- input_layer = Input(shape=(len(attr_columns),))
-
- # Set up MMoE layer
- mmoe_layers = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer)
-
- # Build tower layer from MMoE layer
- for index, task_layer in enumerate(mmoe_layers):
- # 对两个任务的Tower_layer设置不同的units
- if index == 0: # UV
- tower_layer = Dense(
- units=args.task1_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
- if index == 1: # 销量
- tower_layer = Dense(
- units=args.task2_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
-
- model = Model(inputs=[input_layer], outputs=output_layers)
-
- return model
-
-
- def model_aggr_beforemmoe(attr_columns, title_columns, output_layers, output_info):
- """在input层之后,分别用dense层降维,再进行聚合,然后在输入到mmoe层"""
- # Set up the input layer
- input_layer_attr = Input(shape=(len(attr_columns),))
- input_layer_text = Input(shape=(len(title_columns),))
-
- # Set up aggregation_layer
- attr_embed = Dense(args.dense_layer_units,
- activation=args.dense_layer_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(input_layer_attr)
- text_embed = Dense(args.dense_layer_units,
- activation=args.dense_layer_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(input_layer_text)
- input_layer = args.aggregation_layer()([attr_embed, text_embed])
-
- # Set up MMoE layer
- mmoe_layers = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer)
-
- # Build tower layer from MMoE layer
- for index, task_layer in enumerate(mmoe_layers):
- # Set different units for Tower_layer of the two tasks.
- if index == 0: # UV
- tower_layer = Dense(
- units=args.task1_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
- if index == 1: # sale
- tower_layer = Dense(
- units=args.task2_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
-
- model = Model(inputs=[input_layer_attr, input_layer_text], outputs=output_layers)
-
- return model
-
-
- def model_aggr_aftermmoe(attr_columns, title_columns, output_layers, output_info):
- """在分别用mmoe层处理之后,在对应的task的Tower层之前进行聚合"""
- # Set up the input layer
- input_layer_attr = Input(shape=(len(attr_columns),))
- input_layer_text = Input(shape=(len(title_columns),))
-
- # Set up MMoE layer
- mmoe_layers_attr = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer_attr)
- mmoe_layers_text = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer_text)
-
- # Build tower layer from MMoE layer. index{0: UV; 1: SALE}
- for index_attr, task_layer_attr in enumerate(mmoe_layers_attr):
- for index_text, task_layer_text in enumerate(mmoe_layers_text):
- # Set different units for Tower_layer of the two tasks.
- if (index_attr == 0) & (index_text == 0):
- aggr_layer = args.aggregation_layer()([task_layer_attr, task_layer_text])
- tower_layer = Dense(
- units=args.task1_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(aggr_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index_attr],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
- if (index_attr == 1) & (index_text == 1):
- aggr_layer = args.aggregation_layer()(
- [task_layer_attr, task_layer_text]) # Set up aggregation_layer
- tower_layer = Dense(
- units=args.task2_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(aggr_layer)
- output_layer = Dense(
- units=1,
- name=output_info[index_attr],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(tower_layer)
- output_layers.append(output_layer)
-
- model = Model(inputs=[input_layer_attr, input_layer_text], outputs=output_layers)
-
- return model
-
-
- def model_aggr_beforeoutput(attr_columns, title_columns, output_layers, output_info):
- """在对应task输出最终结果的output层之前进行聚合"""
- # Set up the input layer
- input_layer_attr = Input(shape=(len(attr_columns),))
- input_layer_text = Input(shape=(len(title_columns),))
-
- # Set up MMoE layer
- mmoe_layers_attr = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer_attr)
- mmoe_layers_text = MMoE(
- units=args.mmoe_units,
- num_experts=args.mmoe_experts,
- num_tasks=args.num_tasks
- )(input_layer_text)
-
- # Build tower layer from MMoE layer. index{0: UV; 1: SALE}
- for index_attr, task_layer_attr in enumerate(mmoe_layers_attr):
- for index_text, task_layer_text in enumerate(mmoe_layers_text):
- # Set different units for Tower_layer of the two tasks.
- if (index_attr == 0) & (index_text == 0):
- tower_layer_attr = Dense(
- units=args.task1_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer_attr)
- tower_layer_text = Dense(
- units=args.task1_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer_text)
- aggr_layer = args.aggregation_layer()(
- [tower_layer_attr, tower_layer_text]) # Set up aggregation_layer
- output_layer = Dense(
- units=1,
- name=output_info[index_attr],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(aggr_layer)
- output_layers.append(output_layer)
- if (index_attr == 1) & (index_text == 1):
- tower_layer_attr = Dense(
- units=args.task2_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer_attr)
- tower_layer_text = Dense(
- units=args.task2_tower_units,
- activation=args.tower_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(task_layer_text)
- aggr_layer = args.aggregation_layer()(
- [tower_layer_attr, tower_layer_text]) # Set up aggregation_layer
- output_layer = Dense(
- units=1,
- name=output_info[index_attr],
- activation=args.output_activation,
- kernel_initializer=VarianceScaling(seed=args.seed)
- )(aggr_layer)
- output_layers.append(output_layer)
-
- model = Model(inputs=[input_layer_attr, input_layer_text], outputs=output_layers)
-
- return model
|