上海有色金属门户网站,天津网站制作的公司,30平小商铺装修,漯河网站超市建设唉。好不容易折腾完毕caffe#xff0c;突然发现caffe比较适合搭建卷积神经网络#xff0c;而对于DBN和LSTM的搭建好像比较麻烦#xff0c;相关教程没有找到#xff0c;手头上又有一个theano的代码想调试看看#xff0c;所以入坑了。
准备工具#xff1a;
VS2013:链接突然发现caffe比较适合搭建卷积神经网络而对于DBN和LSTM的搭建好像比较麻烦相关教程没有找到手头上又有一个theano的代码想调试看看所以入坑了。
准备工具
VS2013:链接http://pan.baidu.com/s/1coNs7c 密码r2s4
Anaconda2-4.0.0:链接http://pan.baidu.com/s/1o7Nu4Qm 密码qiil
关于anaconda可以到官网下载https://www.continuum.io/downloads#_windows
【注】本教程只是瞎折腾最新版的theano 0.9目前网上的教程基本都是theano 0.82版本的配置方法好像
第一步
安装anaconda
【PS】尽量使用3.5版本一下的因为我注意要PTVS竟然不支持python3.5如果你使用pycharm的话可以自己尝试一下python3.x的配置
双击安装 第二步
winr输入cmd命令打开命令窗口输入 pip install theano可能你们运行的和我不一样因为我已经安装过了如果为安装过的话这个界面会弹出一堆横条条附带百分号显示安装了多少
下面那个python -m pip install --upgrade pip 是更新命令敲上去再说。。。。。。。
归结起来步骤就是下载anaconda-安装之-cmd安装theano-pip命令的更新(这个随便)
第三步
配置一下python的环境变量这个anaconda安装完毕以后好像会有python.exe只需要把这个环境变量加进去就行啦(记得与后面的环境变量用英文分号隔开) 测试一下python是否安装成功
cmd输入python就行了 但是当我们输入import theano.tensor as T的时候提示g未检测到这个时候使用anaconda下载一个mingw不要轻易自己去下载mingw安装可能会遇到坑
直接cmd里面输入
conda install mingw libpython下载完毕以后添加环境变量
path中添加C:\Anaconda2\MinGW\bin;C:\Anaconda2\MinGW\x86_64-w64-mingw32\lib;【根据你自己的路径定哦】
新建一个PYTHONPATHC:\Anaconda2\Lib\site-packages\theano;【同样根据自己的路径添加】
好了测试一下怎么样 看到这里就放心了成功~~~
第四步
【注】使用pycharm的童鞋可以跳过此步骤反正都是python的IDE嘛没啥区别。
VS安装PTVS这个可以在https://pytools.codeplex.com/这里找到相关视频教程在https://www.youtube.com/watch?vJNNAOypc6Ek我记得需要下载两个东西 这个就不解释了
傻瓜式安装就是直接文件-新建-python然后他会提示缺少什么而且相关安装信息也会给你就点它安装就行视频教程很清楚只看前三分钟就行后面介绍的是PTVS的特性。 第五步
更新VS的环境变量 第六步
测试一下theano是否安装成功
在此处能找到测试代码http://deeplearning.net/software/theano/install_windows.html#installation-of-theano-on-windows
我贴出来我的测试代码 import numpy as np
import time
import theano
Anp.random.rand(1000,10000).astype(theano.config.floatX)
Bnp.random.rand(10000,1000).astype(theano.config.floatX)
np_starttime.time()
ABA.dot(B)
np_endtime.time()
X,Ytheano.tensor.matrices(XY)
mftheano.function([X,Y],X.dot(Y))
t_starttime.time()
tABmf(A,B)
t_endtime.time()
print(NP time %f[s],theano time :%f(s)(times should be close when run on CPU!)%(np_end-np_start,t_end-t_start))
print(Result difference:%f %(np.abs(AB-tAB).max(), ))我的测试结果 第七步
【废话】网上有很多theano 0.8.2的配置方法虽然可以运行出结果但是我跑代码的时候就是出错无奈啊瞎折腾了许久最后瞎配了也不知道成功了没但是运行我目前的代码是达到了CPU一样的效果之前按照网上配置的theano 0.8.2虽然测试没问题也能算东西但是就是结果明显不对尴尬说了堆废话。
前提条件安装CUDA8.0CUDNN5.1的方法看我前面caffe的gpu安装方法就行啦最好是找个方法自己测试一下你的cuda和cudnn是否正确安装因为我的GPU版caffe能跑起来说明环境一起准备妥当如果后续出现问题肯定可以排除CUDA和cudnn安装错误这个选项。
因为前面使用pip安装过CPU版本的theano我也不知道这个会不会影响conda安装同样的东西不过保险起见卸载之win10管理员powershell运行 pip uninstall theano接下来的方法很简单
首先其实也就是比网上theano 0.8.2的配置方法多出来的一步骤 conda install theano pygpu 然后找到依据cmd运行所提示的home目录一般都是类似于C:\Users\Administrator这个文件夹慢慢找学计算机的基本都知道这个文件夹非计算机的没找到建议寻求计算机专业学生帮助。在此文件夹下添加空白的.theanorc.txt文档然后添加以下内容 [global]
openmp False
device gpu
floatX float32
allow_input_downcastTrue[blas]
ldflags [gcc]
cxxflags -IC:\ProgramData\Anaconda2\MinGW\x86_64-w64-mingw32\include[nvcc]
flags -LC:\ProgramData\Anaconda2\libs
compiler_bindir C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
fastmath True[cuda]
rootC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0[dnn]
include_pathC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
library_pathC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64[lib]
cnmem0.8
路径自己对着改改。
第八步
为了保险进行了两次测试。
使用cmd中的python命令行测试如下代码
新建一个test.py from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import timevlen 10 * 30 * 768 # 10 x #cores x # threads per core
iters 1000rng numpy.random.RandomState(22)
x shared(numpy.asarray(rng.rand(vlen), config.floatX))
f function([], T.exp(x))
print (f.maker.fgraph.toposort())
t0 time.time()
for i in range(iters):r f()
t1 time.time()
print (Looping %d times took % iters, t1 - t0, seconds)
print (Result is, r)
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):print (Used the cpu)
else:print (Used the gpu)运行结果 PS E:\code_test\theano python .\test.py
WARNING (theano.sandbox.cuda): The cuda backend is deprecated and will be removed in the next release (v0.10). Please switch to the gpuarray backend. You can get more information about how to switch at this URL:https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29Using gpu device 0: GeForce GTX 1060 6GB (CNMeM is disabled, cuDNN 5005)
[GpuElemwise{exp,no_inplace}(CudaNdarrayType(float32, vector)), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
(Looping 1000 times took, 0.32000017166137695, seconds)
(Result is, array([ 1.23178029, 1.61879349, 1.52278066, ..., 2.20771813,2.29967761, 1.62323296], dtypefloat32))
Used the gpu ---------------------可爱的分割线----------------------------------
使用jupyter notebook测试另一个关于图像的代码 import theano
import numpy
import pylab
from theano import tensor as T
from theano.tensor.nnet import conv
from PIL import Image # 生成一个随机数生成类rng其seed为23455随机数种子。
rng numpy.random.RandomState(23455) # 实例化一个4D的输入tensor是一个象征性的输入相当于形参需要调用时传入一个实参
input T.tensor4(nameinput) # 权值数组的shape可以理解为权值的数组大小用来确定需要产生的随机数个数
#该大小可以理解为是一个 2行3列 的矩阵其中每个矩阵元素又是一个 9行9列的 矩阵
w_shp (2, 3, 9, 9) # 每个权值的边界用来确定需要产生的每个随机数的范围。
w_bound numpy.sqrt(3 * 9 * 9) # rng.uniform(low,hign,size)的作用是产生一个shape为size的均匀分布数组每个数的范围为(low,high)
# numpy.asarraya的作用是将 类数组a 转化为array类型
# theano.shared()实例化一个权值变量只是为了进行GPU加速时用可以调用W.get_value()查看其value
W theano.shared( numpy.asarray( rng.uniform( low-1.0 / w_bound, high1.0 / w_bound, sizew_shp), dtypeinput.dtype), name W) # 下面是用同样的方法初始化一个偏置值bb通常被初始化为0因为它在算法中会有一个被学习的过程
# 但是此处是需要直接用它来计算所以用随机值给它初始化就当做是已经经过学习后的值了。
b_shp (2,)
b theano.shared(numpy.asarray( rng.uniform(low-.5, high.5, sizeb_shp), dtypeinput.dtype), name b) # conv.conv2d(input,filter) 需要2个输入一个是input一个是filter。
# input就是上文中的4D张量每个张量分别代表[mini-batch size特征图的数量图像高度图像宽度]。
# filter就是上文中的W。也是一个4D张量分别代表[m层特征图数量m-1层特征图数量过滤器高度过滤器宽度]。
#
# 当其他函数需要用到变量conv_out时会先把实参input传入conv2d()中再计算出conv_out
#
conv_out conv.conv2d(input, W) # dimshuffle是一个很强大的能轻松改变一个张量结构的工具。b.dimshuffle(x, 0, x, x)
# 就是把b的原始的第0列向量的左侧添加一个维度在其右侧添加两个维度。
# b原来是个一维数据(2)经过dimshuffle之后则变成了一个四维数据(1*2*1*1)。
# dimshuffle具体的操作参见文章一开始。
output T.nnet.sigmoid(conv_out b.dimshuffle(x, 0, x, x)) # 创建一个用来过滤图像的theano.function可以把f编译为c然后就可以随时拿来用了。
#
# 当其他函数需要调用f时调用形式为f(input)需要传入实参input然后将计算结果存入output中。
#
f theano.function([input], output) # 下面开始处理几幅图片来看一下效果
# 打开一幅图片源代码中有2个open应该是在linux中的语法我是在windows上运行的所以改成1个open
img Image.open(F:\\Photo\\1.jpg)# 得到图片的宽度和高度注意顺序一定不要弄反
img_w, img_h img.size # 将图片像素按照高度宽度通道数量格式化为array数组
# 其实就是将图片数据格式化为一个数组因为每个像素点包括3个字节B,G,R且其范围为0-255
# 这个地方最后将其除以256是为了归一化归一化后的数据是float64类型
img numpy.asarray(img, dtypefloat32) / 256. # 图片的原始数据是一个3D数据【高宽通道数量】
# 经过数据置换(transpose(2,0,1))之后变成了【通道数量高宽】
# 因为f中传入参数需要4D因此需要将图片数据reshape成为一个【1, 通道数量, 高, 宽】这样的4D张量
# reshape的参数一定要注意1就是最外的那一维度3就是通道数量然后是【高】和【宽】
# 这样结果的 img_.shape 【1, 3, 宽, 高】
#
# 为什么reshape为这样的size呢因为调用f时需要传入一个input而这个input就是4D最终的这个input是传入到
# conv2d中的第一个参数而那个参数的格式是什么呢[mini-batch size特征图的数量图像高度图像宽度]
# 这样就串起来了吧第一个参数是batch size据我所知应该是指卷积核的数量吧但是不知道为什么这里是1
# 第二个参数代表输入层的特征图数量这个地方是3其实就是把一张彩色图片按照3个通道作为3个特征图进行输入
# 最后两个是图像的高度和宽度正好一一对应。
#
img_ img.transpose(2, 0, 1).reshape(1, 3, img_h, img_w) # 将img_作为f的参数经过计算得到输出
filtered_img f(img_) # 将原始图片显示出来
pylab.subplot(1, 3, 1); pylab.axis(off); pylab.imshow(img)
# 图片灰度化
pylab.gray(); # 分别显示不同处理后的图片
pylab.subplot(1, 3, 2); pylab.axis(off); pylab.imshow(filtered_img[0, 0, :, :])
pylab.subplot(1, 3, 3); pylab.axis(off); pylab.imshow(filtered_img[0, 1, :, :])
pylab.show() 结果【注】第二个测试代码一定要测试因为我当时配置theano 0.8.2的GPU模式以后死活运行不了这第二个代码第一个代码的结果倒是和网上说的一模一样。