Tensorflow学习初探

总说

tensorflow最近很火啊,更新也超级快。以前学了matconvnet的,但是后来要做的东西却是torch框架的,当学习torch时,感觉这框架真是令人耳目一新。
Lua这是一门挺有趣的语言,反正写着类似C和matlab的结合版本。主要是torch框架预先一层一层定义网络,然后对于自定义的网络层,只需要重载3个函数,主要是初始化函数、前向传播函数以及反向传播函数。代码很简洁。但是最令人头大的一点是lua的调试IDE确实烂。主要是ZerobraneStudio,不想多说,反正不好。最关键的是torch没有像matlab那么多的特别强大的函数库啊。另外矩阵的赋值在一些情况下也没有像matlab那么简单,在矩阵像另一个矩阵进行赋值的情况下,还要考虑赋值的矩阵空间是否连续。。妈呀,有点回到C的感觉了。不开心。看下面代码。。功能就是类似matlab的

reshape(mat, [1 size(mat)])

这个等价与tensorflow的矩阵处理函数expand_dim

expanded_vectors = tf.expand_dims(mat,0)

说一嘴啊,python的数组是从0开始的,matlab是从1开始的,C/C++/java/C#是从0开始的,Lua是从1开始的。你知道lua的上面的功能怎么写吗。。没有对torch这个框架较为熟悉的人还真的写不出。。

function torch.add_dummy(self)
  local sz = self:size()
  local new_sz = torch.Tensor(sz:size()+1)
  new_sz[1] = 1
  new_sz:narrow(1,2,sz:size()):copy(torch.Tensor{sz:totable()})

  if self:isContiguous() then
    return self:view(new_sz:long():storage())
  else
    return self:reshape(new_sz:long():storage())
  end
end

这也是为什么现状对torch不太感兴趣的缘故吧,函数库实在是有点少。
其实最主要的是只是初步学习了torch的缘故啊~哈哈。其实看torch代码很舒服的,可以看看我的torch7专栏。
torch7
额,扯远了。话说tensorflow有那么好吗?首先接触tensorflow时我就醉了,官网上的文档也太多了吧!!相比起来torch的文档连其1/10都不到。不吹不黑啊。而且内置的函数库真是多到可以和matlab相匹敌的地步啊。果断学习tensorflow啊。额额。直接看代码快速入门吧。然后以后好好把官网上的文档都看一下,记录笔记吧。决定好好学一下tf咯。

第一课

#-- coding: UTF-8 --
'''
session的通用使用方法
'''
import numpy as np
import tensorflow as tf 
import matplotlib.pyplot as plt
import matplotlib.image as mlpimg


filename = '1.jpg'
raw_image = mlpimg.imread(filename)
image = tf.placeholder('uint8',[None, None, 3])

slice1 = tf.slice(image,[0,0,0],[1000,1000,-1])
slice2 = tf.slice(image,[1001,1001,0],[-1,-1,-1])
with tf.Session() as session:
    y1 = session.run(slice1,feed_dict={image:raw_image})
    y2 = session.run(slice2,feed_dict={image:raw_image})

#注意,如果要进行显示图像,则必须先inshow(tensor)一下。
plt.imshow(y2)
plt.show()
print('OK!')

#解析placeholder
"""
在tensorflow中,就是先将各种操作定义好。比如即使是一个网络,不也是各种操作的集合吗?
对于一些变量,运行时才统一赋予初值(喂入数据),这些变量除了简单的constant,Variable之外
还有一般要用到placeholder。placeholder从字面意思上看就是占位符,和动态分配的list类似啊。
功能强大,可以设置该变量的类型,数据的维度之类的。比如tf.placeholder('uint8',[None,None,3])
就可以处理任何3个通道的图片。
"""
#其他解析
"""
1. tf.slice(x,[start1,start2,...startn],[end1,end2,...endn])
2. 这里要牢牢记住的就是:先搭框架!搭好之后再统一喂入数据。比如
    slice1 = tf.slice(image,[0,0,0],[1000,1000,-1])时候
"""

第二课

'''
这个是交互式session的使用。
'''

import tensorflow as tf 
import resource
import numpy as np
"""
交互式InteractiveSession的话,不需要写成session.run(Z)
可以直接写成 .eval()。这样写是直接用默认的session。不一定是你想用的那个session
"""
session = tf.InteractiveSession()
X = tf.constant(np.eye(1000))
Y = tf.constant(np.random.randn(1000,300))
#此时Z并没有进行计算。
Z = tf.matmul(X,Y)
Z.eval()

print("{}Kb").format(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
session.close()

第三课

#-- coding: UTF-8 --
# 本节主要讲如何更新

import tensorflow as tf 
import numpy as np

x = tf.placeholder("float")
y = tf.placeholder("float")

w = tf.Variable([1.0,2.0],name="w")
y_model = tf.mul(x,w[0])+w[1]

error = tf.square(y-y_model)
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(error)

model = tf.initialize_all_variables()


errors = []
with tf.Session() as session:
    session.run(model)
    for i in range(1000):
        x_train = tf.random_normal((1,), mean=5, stddev=2.0)
        y_train = x_train * 2 + 6
        x_value, y_value = session.run([x_train, y_train])
        _, error_value = session.run([train_op, error], feed_dict={x: x_value, y: y_value})
        errors.append(error_value)
    w_value = session.run(w)
    print("Predicted model: {a:.3f}x + {b:.3f}".format(a=w_value[0], b=w_value[1]))

import matplotlib.pyplot as plt
plt.plot([np.mean(errors[i-50:i]) for i in range(len(errors))])
plt.show()
plt.savefig("errors.png")      

第四课

#-- coding: UTF-8 --
import sys
import numpy as np
import tensorflow as tf 
from datetime import datetime
r"""
主要知识点:
1. 如何使用GPU
        -- 如果是用CPU的话,直接
            # 设置各种操作序列集合

        with tf.Session() as sess:
            # session.run()

        --如果改用GPU的话。则要在操作序列定义前面加上tf.device("/gpu:0")
        with tf.device("/gpu:0"):
            # 设置各种操作序列集合

        with tf.Session() as sess:
            # session.run()
2. 在跑的时候可以让加些选项:
      with tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)):   
          其中allow_soft_placement能让tensorflow遇到无法用GPU跑的数据时,自动切换成CPU进行。
          log_device_placement则记录一些日志。       
运行方式:
        python gpuTest.py gpu 1500
"""
device_name = sys.argv[1]
shape = (int(sys.argv[2]),int(sys.argv[2]))

if device_name == "gpu":
    device_name = "/gpu:0"
else:
    device_name = "/cpu:0"

# 在操作定义前面加上这个
with tf.device(device_name):
    random_matrix = tf.random_uniform(shape=shape,minval=0,maxval=1)
    dot_operation = tf.matmul(random_matrix,tf.transpose(random_matrix))
    sum_operation = tf.reduce_sum(dot_operation)

startTime = datetime.now()
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
    result = session.run(sum_operation)
    print(result)

print("\n"*5)
print("Shape:",shape,"Device:",device_name)
print("Time taken:",datetime.now()-startTime)

print("\n"*5)             

附加

直接安装pip后,发现默认没有Scipy,但是直接pip install scipy会出现问题,SciPy和numpy这两个科学计算包的依赖关系较多,安装过程较为复杂。终于从网上看到了一个可行的方案。

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

另外,最好的方法是在anaconda中安装,这个软件默认安装上百个库,基本上你要用的都有,并且还能提供一个虚拟化的环境,tensorflow的官方推荐的方法就是这种。以前试过一下,但是发现我用vscode时不能import tensorflow。只能在终端进入tensorflow的虚拟环境中,才能进行import tensorflow,瞬间就不爽了。暂时还不知道如何在vscode中能调试anaconda安装的tensorflow。所以只能直接用pip安装了。

你可能感兴趣的:(Deep,Learning,Tensorflow)