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安装了。