# -*- coding: utf-8 -*-
 """
 Created on Wed Jan 31 14:10:03 2018

 @author: markli
 """
 import numpy as np;

 def ReLU(x):
     return max(0,x);

 class CovolutionLayer:
     """
     卷积层包含卷积和汇合两步操作
     """
     def __init__(self,filters,padding,pooling,action_fun=ReLU):
         """
         filters 包含 filter_size filter_num filter_stride
         filter_size 过滤器(卷积核)大小 [行,列]
         filter_num  过滤器(卷积核)的个数
         filter_stride 卷积步长
         padding 填充的大小 填充0值
         pooling 包含 pooling_size pooling_stride pooling_classic
         pooling_size 池化时的大小 [行,列] 池化矩阵为方阵
         pooling_stride 池化时的步长 一般情况下大小等于pooling_size
         pooling_classic 汇合类型 类型包括 最大值汇合 max, 平均值汇合 average
         action_fun 卷积操作的激活函数
         """
         self.f_size = (filters[0],filters[1]);
         self.f_num = filters[2];
         self.f_stride = filters[3];
         self.padding = padding;
         self.p_size = (pooling[0],pooling[1]);
         self.p_stride = pooling[2]
         self.p_classic = pooling[3];
         self.action_fun = action_fun;

         self.weights = [];
         for i in range(self.f_num):
             weight = np.random.randn(self.f_size[0],self.f_size[1]);
             self.weights.append(weight);

         self.biase = np.random.randn(self.f_num);

     def Convolution(self,X):
         """
         X 为二维数组
         """
         #获得初始X的形状
         n,m = X.shape;
         #填充
         if(self.padding != 0):
             ones = np.zeros((n+2*self.padding,m+2*self.padding));
             ones[self.padding:self.padding+n,self.padding:self.padding+m] = X;
             X = ones;

         #获得填充后X的形状
         n,m = X.shape;

         #求得卷积操作降维后的层的大小
         t = int((n-self.f_size[0])/ self.f_stride) + 1; #行数
         l = int((m-self.f_size[1]) / self.f_stride) + 1; #列数

         #求得池化后降维的大小
         t_p = int((t-self.p_size[0]) / self.p_stride) + 1; #池化层的行数
         l_p = int((l-self.p_size[1]) / self.p_stride) + 1; #池化层的列数

         self.convs = [];
         self.pools = []
         for k in range(self.f_num):
             conv = np.ones((t,l));
             pool = np.ones((t_p,l_p));
             row = 0;
             #卷积
             for i in range(l):
                 col = 0;
                 for j in range(t):
                     temp = X[row:row+self.f_size[0],col:col+self.f_size[1]];
                     z = np.sum(np.multiply(self.weights[k],temp)) + self.biase[k];
                     a = self.action_fun(z);
                     conv[i][j] = a;
                     col = col + self.f_stride;

                 row = row + self.f_stride;

             self.convs.append(conv);

             #池化
             row = 0;
             for i in range(t_p):
                 col = 0;
                 for j in range(l_p):
                     temp = conv[row:row+self.p_size[0],col:col+self.p_size[1]];
                     if(self.p_classic == "average"):
                         pool[i][j] = np.sum(temp) / (self.p_size[0] * self.p_size[1]);
                     else:
                         pool[i][j] = np.max(temp);

                     col = col + self.p_stride;

                 row = row + self.p_stride;

             self.pools.append(pool);

 X = np.array([[18,54,51,239,244,188],
               [55,121,75,78,95,88],
               [35,24,104,113,109,221],
               [3,154,104,235,25,130],
               [15,253,225,159,78,233],
               [68,85,180,214,215,0]]);

 #X 归一化处理
 X = (X - np.sum(X)/36) / np.max(X);
 #print(X.shape)

 con = CovolutionLayer([3,3,2,1],1,[2,2,2,"max"],);
 con.Convolution(X);
 print(con.pools);

目前只能实现二维的操作,三维的实现还没想好如何存储。卷积神经网络的存储和计算是真的很复杂,过段时间想好了在实现。

Python3 CNN中卷积和池化的实现--限制为二维输入的更多相关文章

  1. tensorflow中的卷积和池化层(一)

    在官方tutorial的帮助下,我们已经使用了最简单的CNN用于Mnist的问题,而其实在这个过程中,主要的问题在于如何设置CNN网络,这和Caffe等框架的原理是一样的,但是tf的设置似乎更加简洁. ...

  2. tensorflow的卷积和池化层(二):记实践之cifar10

    在tensorflow中的卷积和池化层(一)和各种卷积类型Convolution这两篇博客中,主要讲解了卷积神经网络的核心层,同时也结合当下流行的Caffe和tf框架做了介绍,本篇博客将接着tenso ...

  3. CNN学习笔记:池化层

    CNN学习笔记:池化层 池化 池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样.有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见 ...

  4. UFLDL教程笔记及练习答案五(自编码线性解码器与处理大型图像**卷积与池化)

    自己主动编码线性解码器 自己主动编码线性解码器主要是考虑到稀疏自己主动编码器最后一层输出假设用sigmoid函数.因为稀疏自己主动编码器学习是的输出等于输入.simoid函数的值域在[0,1]之间,这 ...

  5. 由浅入深:CNN中卷积层与转置卷积层的关系

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...

  6. CNN中卷积的意义

    在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量.需要人工设计特征,然后将用这些特征计算的值组成特征向量.在过去几十年的经验来看,人工找的特征并不总是好用.有时多了,有时少了,有 ...

  7. Deep Learning 学习随记(七)Convolution and Pooling --卷积和池化

    图像大小与参数个数: 前面几章都是针对小图像块处理的,这一章则是针对大图像进行处理的.两者在这的区别还是很明显的,小图像(如8*8,MINIST的28*28)可以采用全连接的方式(即输入层和隐含层直接 ...

  8. CNN中卷积层的计算细节

    原文链接: https://zhuanlan.zhihu.com/p/29119239 卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数.图像高度.图像宽度.图像通道数 输出矩阵格式:与输 ...

  9. Deep Learning基础--线性解码器、卷积、池化

    本文主要是学习下Linear Decoder已经在大图片中经常采用的技术convolution和pooling,分别参考网页http://deeplearning.stanford.edu/wiki/ ...

随机推荐

  1. 使用vuejs框架进行列表渲染

    爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6170706.html 1.通过Script引入Vuejs框架 <script t ...

  2. C++设计模式-Observer观察者模式

    Observer观察者模式作用:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 UML图: S ...

  3. 使用 IntraWeb (45) - 活用 IntraWeb

    asp.net 刚开始时, 也是拖拉控件, 但后来有了 MVC.xNext. 换个思路使用 IntraWeb 吧: 界面全部用 html+js+css 实现(有些会是用 Delphi 动态生成), 然 ...

  4. 在一个未知的CentOS服务器中如何加上PHP的openssl扩展

    1. 服务器是定制过的,不知对应的centos版本: 2. PHP是自己编译的,而且服务器上没有保留对应版本的源代码,通过/pathto/php -v 找出php版本号,然后wget去下载对应的php ...

  5. Spring Web Flow使用

    就当我写(嘘,抄)着玩的. 使用Spring框架的一个子项目--Spring Web Flow来建立和管理Web应用和UI流程. 第一节:使用Spring Web Flow在一个Spring MVC应 ...

  6. unity3d vs2012

    Unity3D自带的MonoDevelop编辑器无论是js还是c#代码提示都很差,很诡异的就是变量名和方法名有的时候提示有的时候不提示.不过用Visual Studio代替MonoDevelop这个问 ...

  7. 用web技术开发出原生的App应用的体会(1)

    本人是是个前端小白,学前端已经有半年的时间了,前几天开了个博客,希望记录自己学习历程的点滴. 今天要写的是关于用html,css,javascript等web技术开发原生的app应用. 总所周知,we ...

  8. cvCvtColor与cvtColor区别

    用到了rgb转灰度图功能,查到两个函数,发现名字很像,功能也一样,但是参数类型不一样. 记录一下. 可以看声明,cvCvtColor是c语言风格接口. /* Converts input array ...

  9. jira + confluence 安装和破解

    Window环境: 环境准备 安装JAVA1.8以上版本 安装SQL SERVER 或 MySQL: jira安装和破解 下载安装包 https://downloads.atlassian.com/s ...

  10. 微信硬件平台(八) 3-0ESP8266向微信服务器请求设备绑定的用户

    1调试助手 请求URL: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=自己微信ID&a ...