python +numpy,theano,cifar

本文探讨了Python中利用numpy和theano等深度学习框架进行高效运算与内存管理的方法,包括elementwise运算、内存块操作及GPU编程优化。通过案例分析了在不同任务上的性能表现,特别强调了优化策略在提高计算效率方面的重要性。

python里的运算符是根据对象的类型来判断的,如果a,b是list,则a+b是2个list相加,并成一个list,

如果要做elementwise的运算,实现a,b里的元素各自相加,则要写代码。

于是写了段for 代码,来做,速度实在是慢啊。

numpy里提供了numpy.add,numpy.multiply等elementwise 的运算。速度快很多。

相同的操作,用python的for代码,加下标访问,要30分钟。

numpy则直接秒了。。。

numpy还可以方便的把数组的类型进行转换,用numpy.astype或者直接在numpy.asarray是设置新对象的类型。

非常好用啊。

貌似theano就是针对神经网络,比numpy更优化了几个运算,比如grad,scan。

theano中tensor下的内容,以张量处理为主,操作对象是符号变量。比如,T.grad处理的是一个代数式,得到的也是一个代数式

而theano目录下的function,scan处理的是数据,如function定义了输入数据,输出数据,运算公式。处理的也是符号变量。scan可以看做对做循环计算的function函数。

和numpy一样,theano的函数也是elementwise的。

function也只是定义了输入,输出的类型,得到一个进一步的公式,编译转成c代码。

编译function后,得到的c函数,可以直接在python中调用。才是我们最后做运算的东西。

因为,可能有多个函数要用到同一个数据块。所以theano中用到了共享变量,可以在多个function中共用一个内存块。可能(我猜猜猜)一个function就是一个dll文件。

theano有自己的内存块。(前面写的---theano中的share变量不好理解,why shared?when shared?how borrow?)。现在有点清晰了。

google group上的 james 同学给我的解释,很管用。

Good question. Shared vars were introduced to make GPU programming
easier, you're right about that. But they have another use too -
shared variables allow update expressions in theano.function. Update
expressions are a common pattern for iterative algorithms, and shared
variables are automatically eligible for in-place updates, which can
be faster.

borrow=False means you are guaranteed to get back something that is
not aliased to any memory that will be changed by subsequent calls to
a function. It's similar to numpy.array(v.get_value(borow=True))
except that in some cases (like when v is on GPU) no copy is
necessary. borrow=False in set_value also means that no theano
function will change your value by side-effect.

 

用shared 变量,内存memory aliased 技术,可以节约内存,减少内存拷贝,GPU运算必备啊。

 

theano写代码的过程就是建模,数据,测试。真的是非常适合科学计算。

当然,任何一个问题都是建模,数据,测试。只是其他语言是建模,编码,数据,测试。theano支持符号变量,所以感觉上建模即是编码。很好用。

numpy用的也不是符号变量。

把logistic_sgd.py在cifar上运行了。正确率很低,很低。速度倒是很快。

Optimization complete with best validation score of 77.708333 %,with test performance 77.645833 %
The code run for 75 epochs, with 2.071545 epochs/sec

 

下面再试下mlp。mlp的效果很差,还不如上面logistic classifer

epoch 52, minibatch 2000/2000, validation error 90.050000 %
epoch 53, minibatch 2000/2000, validation error 90.040000 %
epoch 54, minibatch 2000/2000, validation error 90.060000 %
epoch 55, minibatch 2000/2000, validation error 90.100000 %

换个电脑的最好成绩是85%。

cnn好像没法直接试,因为图像大小是32*32,不是29*29,卷积层会出错。再改下。明天再试。

cnn改了第一层的卷积大小来适应cifar,成绩是53%。cnn就是牛逼啊,featuremap感觉比dbn的layers 更合理呢。dbn同一层,应该支持多个featuremap和共享权值才好。

rbm。计算损失函数时是做cd-15,实在慢,改成了cd-1,文章中不是说cd-1也很好用嘛。等周末的时候再开着做一个cd-15看看。

dbn

PIL库,可以把数组保存为图像。而且也支持numpy数组。

img=PIL.Image.fromarray(a)

img.save('......')

很好用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值