theano学习-Convolutional Neural Networks (LeNet)

来源:互联网 发布:matlab fprintf 矩阵 编辑:程序博客网 时间:2024/05/22 01:56
</pre><pre name="code" class="python">import theanoimport numpyimport pylabfrom theano import tensor as Tfrom theano.tensor.nnet import convfrom PIL import Image# 生成一个随机数生成类rng,其seed为23455(随机数种子)。  rng = numpy.random.RandomState(23455)# 实例化一个4D的输入tensor,是一个象征性的输入,相当于形参,需要调用时传入一个实参  input = T.tensor4(name='input')# 权值数组的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.asarray(a)的作用是将 类数组a 转化为array类型# theano.shared()实例化一个权值变量(只是为了进行GPU加速时用),可以调用W.get_value()查看其valueW = theano.shared( numpy.asarray(            rng.uniform(                low=-1.0 / w_bound,                high=1.0 / w_bound,                size=w_shp),            dtype=input.dtype), name ='W')# 下面是用同样的方法初始化一个偏置值b,b通常被初始化为0,因为它在算法中会有一个被学习的过程;# 但是此处是需要直接用它来计算,所以用随机值给它初始化,就当做是已经经过学习后的值了。b_shp = (2,)b = theano.shared(numpy.asarray(            rng.uniform(low=-.5, high=.5, size=b_shp),            dtype=input.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('g:\\b.jpg')# 得到图片的宽度和高度(注意,顺序一定不要弄反)img_w, img_h = img.size# 将图片像素按照(高度,宽度,通道数量)格式化为array数组# 其实就是将图片数据格式化为一个数组,因为每个像素点包括3个字节,B,G,R,且其范围为0-255,# 这个地方最后将其除以256是为了归一化,归一化后的数据是float64类型img = numpy.asarray(img, dtype='float32') / 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()
转载:http://blog.csdn.net/niuwei22007/article/details/48025939
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚装修的房子有味道怎么办 代销产品规格填写不完整怎么办 我的信息被泄露怎么办 进入不良网站手机发信息怎么办 发不良信息被停机了怎么办 手机qq登录显示被冻结怎么办 qq账户被冻结了怎么办 qq钱包账户被永久冻结怎么办 怎么办转让费还没给我 收钱吗不能抵用红包怎么办 红包抵扣被关了怎么办 天猫客户给差评怎么办 淘宝闪电退款有纠纷怎么办呀 手机屏幕右下角出现彩色点怎么办 在超市买到假货怎么办 天猫超市多发货怎么办 天猫中不小心取消退款了怎么办 天猫超市写错了怎么办 二维码收付款不到红包怎么办 天猫优惠劵过期了怎么办 天猫购物津贴用不完怎么办 天猫上买的大件东西实物不符怎么办 天猫上面料成分与实物不符怎么办 闲鱼发货与实物不符怎么办 天猫超市买贵了怎么办 天猫超市里购买的东西退货怎么办 淘宝店上传的图片不清楚怎么办 微信图片打印出来不清楚怎么办 微信图片打印不清楚怎么办 淘宝上传商品视频不清楚怎么办 手机安装器没了怎么办 我不做直播换工作怎么办 天猫发票被投诉怎么办 天猫机顶盒闪退怎么办 苹果8红色掉漆怎么办 毛坯房验房房及厅试水时漏水怎么办 淘宝退货赠品被拆了怎么办 如果淘宝买家说赠品不好怎么办 淘宝顾客反应没赠品怎么办 淘宝上买东西赠品不给怎么办 天猫店关了质量有问题怎么办