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('......')
很好用。

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

被折叠的 条评论
为什么被折叠?



