# -*- 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. [JSOI2008][BZOJ1012] 最大数(动态开点线段树)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  2. wsdl地址如何在远程服务器上查看源码?

    工作需要,接了几个webservice接口,但是厂家给的规范十分不规范,服务名称没一个写对的,要是我的本地电脑可以打开wsdl地址,那倒没什么,察看一下wsdl就可以. 但是好多wsdl地址我本地电脑 ...

  3. ubuntu安装和查看已安装

    说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ...

  4. JavaScript 设置、读取Cookie

    1.设置Cookie //设置cookie function setCookie(cookieName, cookieValue, cookieExpires, cookiePath) { cooki ...

  5. 'InitializeCulture' is not a member of 'XXXX'

    今天在部署ASP.NET网页时出现一个奇怪的问题.在开发,调试时访问网页一切正常.但一部署到IIS中时就会出现以下的错误信息:'InitializeCulture' is not a member o ...

  6. BUGKUctf-web-writeup

    ---恢复内容开始--- 找到了个ctf平台.里面的web挺多的.终于将web题目写的差不多了. Web 签到题 加群就可以了 Web2 直接F12就看到了 文件上传测试 Burp抓包 文件名改成 1 ...

  7. 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

    一.   引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...

  8. Docker(1):CentOS7 安装Docker

    1.查看系统内核,docker要求系统的内核版本高于3.10 #  uname -r 2.升级yum包,确保最新 #   yum update 3.安装所需要依赖包 #   yum install - ...

  9. 极其简单的VSCode C++环境配置

    下载我打包的文件VSCode-cpp.7z.001 和 VSCode-cpp.7z.002,解压. 在系统环境变量中添加:你解压的路径\Project\.vscode\MinGW\bin. 打开你解压 ...

  10. 细读 php json数据和JavaScript json数据

    关于JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级数据格式,占用字符数量极少,特别适合互联网传递: 4.可读性较强 5.容 ...