因为学习原因需要跑通NCF论文(Neural Collaborative Filtering)代码,配了几天环境才跑通。这里特此记录,一方面希望其他小伙伴少走弯路,另一方面提醒自己!
关于论文思路和代码解析已经有大佬做过了,我就不班门弄斧了:
神经网络解决推荐系统问题(NCF)。
NCF(win10+Keras+Theano+tensorflow+GPU)运行成功环境配置
前期准备
使用conda的好处是不需要自己一个个预编译,直接打包安装就好了。
一、Anaconda和Pycharm安装
不需要多讲,直接附上一篇详细的安装链接:
Anaconda和Pycharm的安装和配置。
安装完后可以添加国内镜像网站,参考:
window10 2020最新Anaconda可用国内镜像网站及添加删除方法。
二、Nvidia Driver(CUDA)和cudnn安装
网上博客有很多讲的也很详细,这里所以长话短说,去官网找合适版本安装就好了。我安装的是Nvidia-smi461.72+cuda8.0。
两篇我认为比较详细的博客:
博客一:CUDA系列 对应显卡驱动版本,及显卡驱动安装指南!
博客二:CUDA安装教程+cudnn安装教程
再附上官网参考:
官方CUDA对应显卡驱动表
官方Nvidia Drive驱动下载地址
配置NCF环境
一、搭建虚拟环境
conda create -n ncf python=3.6
#切换环境
conda activate ncf
二、安装Theano
安装Theano要特别注意版本,版本不对的话可能在运行时会报错。作者建议我们安装0.8.0,我这里安装的是1.0.5(实验证明也可以运行)。
#安装辅助包
conda install mingw libpython mkl nose
#安装Theano
conda install theano=1.0.5
#如果安装Theano报错就直接去pycharm里面找到ncf虚拟环境安装
#安装其他辅助包
conda install pygpu mkl-service
这里也有一篇博客专门讲这个
win10系统 anaconda环境 安装theano。
三、安装Keras和tensorflow以及其他附加包
好像原则上只需要安装Keras就可以,其他的会自动打包安装。 NCF代码已经是2016年的代码了,所以会和现在新版本的开发包不适配。
如果没有的话也可以自己安装,这里展示出来只是说明版本。
conda install keras=1.0.7
conda install tensorflow=1.15.5
conda install pygpu=0.7.6
conda install numpy=1.18.5
四、检查是否Tensorflow和Theano安装成功
参照下面博文:
测试GPU是否可用
修改NCF代码
一、xrange方法替换
NCF使用python2.0开发的,里面会有xrange和range方法不一样。现在python3.0版本已经做了优化,均为range()方法(其实就是之前的xrange())。
二、has_key方法替换
# 原代码:
# while train.has_key((u, j)):
# 替换为:
while (u, j) in train.keys():
三、tf.nn.sigmoid_cross_entropy_with_logits修改
# 原代码:
# return tf.nn.sigmoid_cross_entropy_with_logits(output, target)
# 修改为:
return tf.nn.sigmoid_cross_entropy_with_logits(labels=output, logits=target) 现在
这个代码是在tensorflow_backend.py,如果不修改会报以下错误:
Traceback (most recent call last):
File "E:/Develop/python/python_workspace/neural_collaborative_filtering-master/MLP.py", line 149, in <module>
model.compile(optimizer=Adam(lr=learning_rate), loss='binary_crossentropy')
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\training.py", line 625, in compile
sample_weight, mask)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\training.py", line 324, in weighted
score_array = fn(y_true, y_pred)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\objectives.py", line 48, in binary_crossentropy
return K.mean(K.binary_crossentropy(y_pred, y_true), axis=-1)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\backend\tensorflow_backend.py", line 1225, in binary_crossentropy
return tf.nn.sigmoid_cross_entropy_with_logits(output, target)
File "D:\Anaconda3\envs\ncf\lib\site-packages\tensorflow_core\python\ops\nn_impl.py", line 161, in sigmoid_cross_entropy_with_logits
labels, logits)
File "D:\Anaconda3\envs\ncf\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 3049, in _ensure_xent_args
"named arguments (labels=..., logits=..., ...)" % name)
ValueError: Only call `sigmoid_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)
直接选择里面对应tensorflow_backend.py,跳转过去修改就好了。
四、tf.concat修改
# 原代码:
# return tf.concat(axis, tensors)
# 修改为:
return tf.concat(tensors, axis)
这个代码也是在tensorflow_backend.py,如果不修改会报以下错误:
Traceback (most recent call last):
File "E:/Develop/python/python_workspace/neural_collaborative_filtering-master/MLP.py", line 143, in <module>
model = get_model(num_users, num_items, layers, reg_layers)
File "E:/Develop/python/python_workspace/neural_collaborative_filtering-master/MLP.py", line 79, in get_model
vector = merge([user_latent, item_latent], mode='concat')
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\topology.py", line 1530, in merge
name=name)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\topology.py", line 1180, in __init__
self.add_inbound_node(layers, node_indices, tensor_indices)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\topology.py", line 569, in add_inbound_node
Node.create_node(self, inbound_layers, node_indices, tensor_indices)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\topology.py", line 155, in create_node
output_tensors = to_list(outbound_layer.call(input_tensors, mask=input_masks))
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\engine\topology.py", line 1267, in call
return K.concatenate(inputs, axis=self.concat_axis)
File "D:\Anaconda3\envs\ncf\lib\site-packages\keras\backend\tensorflow_backend.py", line 669, in concatenate
return tf.concat(axis, tensors)
File "D:\Anaconda3\envs\ncf\lib\site-packages\tensorflow_core\python\util\dispatch.py", line 180, in wrapper
return target(*args, **kwargs)
File "D:\Anaconda3\envs\ncf\lib\site-packages\tensorflow_core\python\ops\array_ops.py", line 1418, in concat
dtype=dtypes.int32).get_shape().assert_has_rank(0)
File "D:\Anaconda3\envs\ncf\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 995, in assert_has_rank
raise ValueError("Shape %s must have rank %d" % (self, rank))
ValueError: Shape (2, ?, ?) must have rank 0
Process finished with exit code 1
直接选择里面对应tensorflow_backend.py,跳转过去修改就好了。
成功运行 or 排bug
如果全部按照上面来操作的话,恭喜你顺利运行NCF代码!(〃‘▽’〃)
tensorflow版本不对出现问题(需要降版本)
module 'tensorflow' has no attribute 'placeholder'
module 'tensorflow.compat.v1' has no attribute 'python'
感谢及参考博文
部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ
参考代码 NCF官网代码
https://github.com/hexiangnan/neural_collaborative_filtering
参考博文1 神经网络解决推荐系统问题(NCF)
https://blog.youkuaiyun.com/qq_39388410/article/details/85123127
参考博文2 Anaconda和Pycharm的安装和配置
https://www.cnblogs.com/yuxuefeng/articles/9235431.html
参考博文3 CUDA系列 对应显卡驱动版本,及显卡驱动安装指南!
https://blog.youkuaiyun.com/tjb132/article/details/105575017/
参考博文4 cuda安装教程+cudnn安装教程
https://blog.youkuaiyun.com/sinat_23619409/article/details/84202651
参考博文5 win10系统 anaconda环境 安装theano绝对成功
https://blog.youkuaiyun.com/linangfs/article/details/81366893
参考博文6 测试GPU是否可用
https://blog.youkuaiyun.com/qq_40253214/article/details/105418870
参考博文7 官方CUDA对应显卡驱动表
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
参考博文8 官方Nvidia Drive驱动下载地址
https://www.nvidia.cn/Download/index.aspx?lang=cn