【推荐系统】TensorFlow复现论文NeuralCF网络结构

简介: 【推荐系统】TensorFlow复现论文NeuralCF网络结构

下图为NeutralCF的模型结构图,总共两个分支,第一个分支为GML,第二个为MLP,GML通路将两个特征的Embedding向量进行内积操作,MLP将两个特征的Embedding的向量进行拼接,然后使用多层感知机进行传播,然后将两个通路输出的向量进行拼接,导入全连接层(输出层),输出Score。

一、导包

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras.utils import plot_model
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import  MinMaxScaler, LabelEncoder
import itertools
import pandas as pd
import numpy as np
from tqdm import tqdm
from collections import namedtuple
import warnings
warnings.filterwarnings("ignore")

二、读取数据

# 读取数据,NCF使用的特征只有user_id和item_id
rnames = ['user_id','movie_id','rating','timestamp']
data = pd.read_csv('./data/ml-1m/ratings.dat', sep='::', engine='python', names=rnames)

三、特征编码处理

lbe = LabelEncoder()
data['user_id'] = lbe.fit_transform(data['user_id'])
data['movie_id'] = lbe.fit_transform(data['movie_id'])
train_data = data[['user_id', 'movie_id']]
train_data['label'] = data['rating']

四、使用具名元组为特征进行处理

SparseFeat = namedtuple('SparseFeat', ['name', 'vocabulary_size', 'embedding_dim'])
DenseFeat = namedtuple('DenseFeat', ['name', 'dimension'])
dnn_features_columns = [SparseFeat('user_id', train_data['user_id'].nunique(), 8),
                        SparseFeat('movie_id', train_data['movie_id'].nunique(), 8)]

五、构建模型

5.1 输入层

def build_input_layers(dnn_features_columns):
    dense_input_dict, sparse_input_dict = {}, {}
    for f in dnn_features_columns:
        if isinstance(f, SparseFeat):
            sparse_input_dict[f.name] = Input(shape=(1), name=f.name)
        elif isinstance(f, DenseFeat):
            dense_input_dict[f.name] = Input(shape=(f.dimension), name=f.name)
    return dense_input_dict, sparse_input_dict

5.2 Embedding层

def build_embedding_layers(dnn_features_columns, sparse_input_dict, prefix="", is_linear=True):
    embedding_layers_dict = {}
    sparse_feature_columns = list(filter(lambda x: isinstance(x, SparseFeat), dnn_features_columns)) if dnn_features_columns else []
    if is_linear:
        for f in sparse_feature_columns:
            embedding_layers_dict[f.name] = Embedding(f.vocabulary_size + 1, 1, name= prefix + '_1d_emb_' +  + f.name)
    else:
        for f in sparse_feature_columns:
            embedding_layers_dict[f.name] = Embedding(f.vocabulary_size + 1, f.embedding_dim, name=prefix + '_kd_emb_' +  f.name)
    return embedding_layers_dict

5.3 GML

def build_gml_layers(gml_user_embedding, gml_movie_embedding):
    return Multiply()([gml_user_embedding, gml_movie_embedding])

5.4 MLP

def build_mlp_layers(mlp_input, units=(32, 16)):
    for out_dim in units:
        mlp_input = Dense(out_dim)(mlp_input)
    return mlp_input

5.5 输出层

def bulid_output_layers(concat_output):
    return Dense(1)(concat_output)

5.6 构建模型

def NCF(dnn_features_columns):
    # 1. 获取字典输入层,键为列名,值为对应的Input
    _, sparse_input_dict = build_input_layers(dnn_features_columns)
    # 2. 获取真实输入层,使用列表存储每个列的Input
    input_layers = list(sparse_input_dict.values())
    # 3. 将SparseFeature进行Embedding,有两路,分别是GML和MLP
    embedding_gml_dict = build_embedding_layers(dnn_features_columns, sparse_input_dict, prefix="GML", is_linear=False)
    embedding_mlp_dict = build_embedding_layers(dnn_features_columns, sparse_input_dict, prefix="MLP", is_linear=False)
    # 4. 将Embedding后的特征进行展开,因为Embedding后为(?,1,8)
    gml_user_embedding = Flatten()(embedding_gml_dict['user_id'](sparse_input_dict['user_id']))
    gml_movie_embedding = Flatten()(embedding_gml_dict['movie_id'](sparse_input_dict['movie_id']))
    mlp_user_embedding = Flatten()(embedding_mlp_dict['user_id'](sparse_input_dict['user_id']))
    mlp_movie_embedding = Flatten()(embedding_mlp_dict['movie_id'](sparse_input_dict['movie_id']))
    # 5. 进行GML,就是展开后的特征进行内积
    gml_output = build_gml_layers(gml_user_embedding, gml_movie_embedding)
#     gml_output = tf.multiply(gml_movie_embedding, gml_user_embedding)
#     gml_output = Multiply()([gml_user_embedding, gml_movie_embedding])
    # 6. 进行MLP,将特征进行连接,传入MLP层
    mlp_input = Concatenate(axis=1)([mlp_user_embedding, mlp_movie_embedding])
    mlp_output = build_mlp_layers(mlp_input, (32, 16))
    # 7. 将GML和MLP层的输出进行连接
    concat_output = Concatenate(axis=1)([gml_output, mlp_output])
    # 8.传入到输出层中,获取评分
    output_layers = bulid_output_layers(concat_output)
    # 构建模型
    model = Model(input_layers, output_layers)
    return model

六、运转模型

history = NCF(dnn_features_columns)
# 编译模型
history.compile(optimizer="adam", 
                loss="mse", 
                metrics=['mae'])
# 训练数据做成字典,与输入层做对应
train_model_input = {name: train_data[name] for name in ['user_id', 'movie_id']}
history.fit(train_model_input, 
            train_data['label'].values,
            batch_size=128, 
            epochs=2, 
            validation_split=0.2)

# 绘制网络结构图
plot_model(history,show_shapes=True)


壹佰、
+关注
目录
打赏
0
0
0
0
20
分享
相关文章
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
39 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
393 55
NSDI'24 | 阿里云飞天洛神云网络论文解读——《Poseidon》揭秘新型超高性能云网络控制器
NSDI'24 | 阿里云飞天洛神云网络论文解读——《Poseidon》揭秘新型超高性能云网络控制器
84 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
106 61
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
77 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
YOLOv11改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
YOLOv11改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
71 14
YOLOv11改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构
SIGCOMM 2024 | 洛神云网络学术活动与论文分享
SIGCOMM 2024 | 洛神云网络学术活动与论文分享
NSDI'24 | 云网络论文解读——《Poseidon》揭秘新型超高性能云网络控制器
NSDI'24 | 云网络论文解读——《Poseidon》揭秘新型超高性能云网络控制器
NSDI'24 | 阿里云飞天洛神云网络论文解读——《Poseidon》揭秘新型超高性能云网络控制器
NSDI‘24于4月16-18日在美国加州圣塔克拉拉市举办,汇聚全球网络系统领域的专家。阿里云飞天洛神云网络的两篇论文入选,标志着其创新能力获广泛认可。其中,《Poseidon: A Consolidated Virtual Network Controller that Manages Millions of Tenants via Config Tree》介绍了波塞冬平台,该平台通过统一控制器架构、高性能配置计算引擎等技术,实现了对超大规模租户和设备的高效管理,显著提升了云网络性能与弹性。实验结果显示,波塞冬在启用EIP时的完成时间比Top 5厂商分别快1.8至55倍和2.6至4.8倍。
198 47
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构
107 13

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等