NCF(win10+Keras+Theano+tensorflow+GPU)运行成功环境配置

因为学习原因需要跑通NCF论文(Neural Collaborative Filtering)代码,配了几天环境才跑通。这里特此记录,一方面希望其他小伙伴少走弯路,另一方面提醒自己!
关于论文思路和代码解析已经有大佬做过了,我就不班门弄斧了:
神经网络解决推荐系统问题(NCF)

前期准备

使用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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值