TF新手使用教程(一)

简介

写在前面的话:
在进行深度学习的过程中,我们不可避免的需要了解和使用一些深度学习的框架,其中最有名的应该就是谷歌支持下的tensorflow深度学习框架了。
Tensorflow是一个使用数据流图 (data flow graphs) 技术来进行数值计算的开源软件库。
这里写图片描述
数据流图是是一个有向图,使用结点(一般用圆形或者方形描述,表示一个数学操作或者数据输入的起点和数据输出的终点)和线(表示数字、矩阵或者Tensor张量)来描述数学计算。数据流图可以方便的将各个节点分配到不同的计算设备上完成异步并行计算,适合大规模的机器学习应用。
这里写图片描述
第一次接触tensorflow,就会被它庞大而更新迭代快速的代码库所震惊,这里需要解释的是,在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」,也就是说,TensorFlow 是一个使用数据流图(data flow graphs)进行数值计算的开源软件库。他们没有将 TensorFlow 包含在「深度学习框架」范围内,而是和 Theano 一起被包含在「图编译器(graph compilers)」类别中。
Tensorflow以C API为边界可以分为前端系统(提供编程模型,负责构造计算图)和后端系统(提供运行环境,负责执行计算图):
这里写图片描述
我的感觉是 TensorFlow 是一个非常好的框架,但是却非常低层。使用 TensorFlow 需要编写大量的代码,你必须一遍又一遍地重新发明轮子。也因此,随着深度学习的发展和适用领域的扩展,在其上面的层上出现了更多的平台:Slim、PrettyTensor、Keras、TFLearn等等 。
这里我选择了TensorLayer,作为后来者居上的python包,它不仅上手快,例子多,且在运行速度、工程性和可拓展性上具有优秀的表现。
从安装到使用,作为一个新手,我出现了许许多多的问题,走了不少弯路,所以特此写下博客,给自己以警醒,也希望给后来者以建议和方向。

安装

1. CUDA和cuDNN

我选择安装的是tensorflow的GPU版本,因此需要提前预装CUDA和cuDNN,在这之前还需要确认你的显卡是否支持。这些都能够在tensorflow官方教程上找到,网上的各个版本都大同小异。
这里我遇见的问题是,虽然完全按照流程来,也添加了它们的路径,但是在最后测试中始终没办法调用GPU版本的tensorflow(每次import tensorflow都会报错)
网上针对这个问题解决的方法比较多,但是试过了基本都没有效果。最后发现了一个简单粗暴的解决方法:
直接把cuDNN的文件复制粘贴到CUDA的同名文件夹里,然后就可以解决调用问题了,亲测有效。

2.anaconda快捷安装和直接安装python

如果再给我一次选择机会的话,我会选择直接安装python。虽然网上说anaconda安装简洁,会附带很多安装包,界面友好诸如此类的,但是以下是我在使用过程中遇到过的几个问题。

  1. 自带的spyder风格比较类似matlab,对于科研工作者可能比较友好,对于更倾向于程序员的代码狗可能使用起来比较不便,而且我个人非常喜欢pycharm的界面更换功能,白色背景看久了会比较伤眼。

  2. anaconda自带版本的python目前是3.6(以后可能会更新),但是tensorflow目前仅支持3.5版本的python。所以直接使用anaconda的傻瓜安装以后(如果是新手可能不会一开始就考虑到版本兼容问题),会在安装tf的过程中报错,这时候一般有两个解决办法:第一个是重新安装3.5版本的anaconda,第二个是创建python=3.5的环境,在这个环境里安装tensorflow.

  3. 我选择的是比较方便快捷的第二种方法,直接新搭建了一个环境,基于python3.5,然后在这个基础上安装了tensorflow,但是在测试过程中始终报错(这里我安装的GPU版本,如果需求不大的话建议安装cpu版本,真的方便快捷好安装),这个时候用anaconda的不足之处就充分暴露出来了:大部分使用tensorflow的学习者都是直接安装的python或者在ubuntu环境下搭建的,所以针对anaconda遇到的tensorflow相关问题的解决方法真的非常非常的少,有时候同样的错误,解决问题的代码不能够通用,一些命令语句也不相同(pip和conda之间的区别)

    这里我遇到了很多问题,查了很多资料,几乎每个博主提到的解决方法我都尝试了一遍(但是真的资料非常的少),最后解决问题的方法是:把anaconda在python3.5的环境里直接重装了一遍。也就是这行代码:

create -n tensorflow python=3.5 anaconda

总结一下,这部分我走了很多弯路,最建议大家的是,直接安装python3.5,或者在3.5环境的anaconda里直接把它重装一遍。

用例

代码修改

正如上文所提到的,tensorflow是一个发展迅速且不断更新的学习框架,而在TensorFlow执行的过程中,也需要很多的依赖包,比如numpy,scipy,scikit-image,matplotlib和nltk等等,而这些依赖包本身的更新也是发展速度不一,进度不一致的。这也直接导致了,在使用TensorFlow的过程中,会不断地遇见因为版本不支持,或者接口有所改变,或者因为版本升级导致的代码不可用等等等等。
这里让我最为头疼的就是python2.x和python3之间的代码转换问题。
TensorFlow的官方教程里的所有测试用例,都是基于python2来的,而现在python2已经不再更新,取而代之的是python3,遵循学新不学旧的原则来说,我选择了基于python3.5的TensorFlow,但是在两个版本之间,无论是函数名、接口类、以及很多方面都发生了极其大的变化,这也导致了官方用例在实际操作的时候,运行不了的问题。
这里粘贴部分修改后的基于python3的代码,亲测可以运行:

官方的第一个测试用例:

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
# 
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化变量
init = tf.global_variables_initializer()

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
for step in range(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print (step, sess.run(W), sess.run(b))

# 得到最佳拟合结果 W: [[0.100  0.200]], b: [0.300]

官方的第二个测试用例(手写字符串识别):

# -*- coding: utf-8 -*-
import tensorflow as tf
import tensorlayer as tl

sess = tf.InteractiveSession()

# prepare data
X_train, y_train, X_val, y_val, X_test, y_test = \
                                tl.files.load_mnist_dataset(shape=(-1,784))

# define placeholder
x = tf.placeholder(tf.float32, shape=[None, 784], name='x')
y_ = tf.placeholder(tf.int64, shape=[None, ], name='y_')

# define the network
network = tl.layers.InputLayer(x, name='input_layer')
network = tl.layers.DropoutLayer(network, keep=0.8, name='drop1')
network = tl.layers.DenseLayer(network, n_units=800,
                                act = tf.nn.relu, name='relu1')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop2')
network = tl.layers.DenseLayer(network, n_units=800,
                                act = tf.nn.relu, name='relu2')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop3')
# the softmax is implemented internally in tl.cost.cross_entropy(y, y_, 'cost') to
# speed up computation, so we use identity here.
# see tf.nn.sparse_softmax_cross_entropy_with_logits()
network = tl.layers.DenseLayer(network, n_units=10,
                                act = tf.identity,
                                name='output_layer')
# define cost function and metric.
y = network.outputs
cost = tl.cost.cross_entropy(y, y_, 'cost')
correct_prediction = tf.equal(tf.argmax(y, 1), y_)
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
y_op = tf.argmax(tf.nn.softmax(y), 1)

# define the optimizer
train_params = network.all_params
train_op = tf.train.AdamOptimizer(learning_rate=0.0001, beta1=0.9, beta2=0.999,
                            epsilon=1e-08, use_locking=False).minimize(cost, var_list=train_params)

# initialize all variables in the session
tl.layers.initialize_global_variables(sess)

# print network information
network.print_params()
network.print_layers()

# train the network
tl.utils.fit(sess, network, train_op, cost, X_train, y_train, x, y_,
            acc=acc, batch_size=500, n_epoch=500, print_freq=5,
            X_val=X_val, y_val=y_val, eval_train=False)

# evaluation
tl.utils.test(sess, network, acc, X_test, y_test, x, y_, batch_size=None, cost=cost)

# save the network to .npz file
tl.files.save_npz(network.all_params , name='model.npz')
sess.close()

在这里我遇到了这样一个问题:
RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa

也就是提示我API接口的版本和numpy的版本不对应。这里需要uninstall numpy然后重新安装,如果不成功的话尝试重启编译器或者电脑,如果依旧不成功的话,可能就是电脑里有numpy的两个版本,然后Spyder默认使用了旧版本,就需要删除指定版本的numpy然后重新安装新版本(这里我没有遇到,应该是我直接懒汉安装,在3.5的环境里重新安装了anaconda的原因,所以直接uninstall就可以)

在这里就会直接暴露出来一个前面提到的问题,网上这方面anaconda的解决方式不多,大部分的pip命令在conda里修改了都不能用,所以遇见问题的话解决起来真的很麻烦,强烈安利大家还是在Ubuntu下直接安装python会比较友好。

PS:写到这里的时候在tensorflow的实践教程里发现了这个小例子:
引入tensorflow库并查看版本,确保已安装最新的稳定版(如1.2.1)。

from __future__ import print_function, division 
import tensorflow as tf
 print('Loaded TF version', tf.__version__)
 # Output: Loaded TF version 1.2.1  

为了兼容Python2和Python3的print和division函数,建议每个使用到的文件都引入from future
import print_function, division

不知道能不能python版本兼容的问题,会在后面的继续学习中补充。

下一部分会写的内容有以下一些:

GitHub desktop的使用方法(会极大的提高看代码和写代码以及clone代码库的速度)

相关文档的深入学习:
链接如下
1. TensorFlow官方教程:
2. tensorlyer的官方文档:

xgboostan傻瓜安装

anaconda search -t conda xgboost

conda install -c mndrake xgboost

猜你喜欢

转载自blog.csdn.net/zongzi13545329/article/details/77163103