1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Jan 31 14:10:03 2018
  4.  
  5. @author: markli
  6. """
  7. import numpy as np;
  8.  
  9. def ReLU(x):
  10. return max(0,x);
  11.  
  12. class CovolutionLayer:
  13. """
  14. 卷积层包含卷积和汇合两步操作
  15. """
  16. def __init__(self,filters,padding,pooling,action_fun=ReLU):
  17. """
  18. filters 包含 filter_size filter_num filter_stride
  19. filter_size 过滤器(卷积核)大小 [行,列]
  20. filter_num 过滤器(卷积核)的个数
  21. filter_stride 卷积步长
  22. padding 填充的大小 填充0值
  23. pooling 包含 pooling_size pooling_stride pooling_classic
  24. pooling_size 池化时的大小 [行,列] 池化矩阵为方阵
  25. pooling_stride 池化时的步长 一般情况下大小等于pooling_size
  26. pooling_classic 汇合类型 类型包括 最大值汇合 max, 平均值汇合 average
  27. action_fun 卷积操作的激活函数
  28. """
  29. self.f_size = (filters[0],filters[1]);
  30. self.f_num = filters[2];
  31. self.f_stride = filters[3];
  32. self.padding = padding;
  33. self.p_size = (pooling[0],pooling[1]);
  34. self.p_stride = pooling[2]
  35. self.p_classic = pooling[3];
  36. self.action_fun = action_fun;
  37.  
  38. self.weights = [];
  39. for i in range(self.f_num):
  40. weight = np.random.randn(self.f_size[0],self.f_size[1]);
  41. self.weights.append(weight);
  42.  
  43. self.biase = np.random.randn(self.f_num);
  44.  
  45. def Convolution(self,X):
  46. """
  47. X 为二维数组
  48. """
  49. #获得初始X的形状
  50. n,m = X.shape;
  51. #填充
  52. if(self.padding != 0):
  53. ones = np.zeros((n+2*self.padding,m+2*self.padding));
  54. ones[self.padding:self.padding+n,self.padding:self.padding+m] = X;
  55. X = ones;
  56.  
  57. #获得填充后X的形状
  58. n,m = X.shape;
  59.  
  60. #求得卷积操作降维后的层的大小
  61. t = int((n-self.f_size[0])/ self.f_stride) + 1; #行数
  62. l = int((m-self.f_size[1]) / self.f_stride) + 1; #列数
  63.  
  64. #求得池化后降维的大小
  65. t_p = int((t-self.p_size[0]) / self.p_stride) + 1; #池化层的行数
  66. l_p = int((l-self.p_size[1]) / self.p_stride) + 1; #池化层的列数
  67.  
  68. self.convs = [];
  69. self.pools = []
  70. for k in range(self.f_num):
  71. conv = np.ones((t,l));
  72. pool = np.ones((t_p,l_p));
  73. row = 0;
  74. #卷积
  75. for i in range(l):
  76. col = 0;
  77. for j in range(t):
  78. temp = X[row:row+self.f_size[0],col:col+self.f_size[1]];
  79. z = np.sum(np.multiply(self.weights[k],temp)) + self.biase[k];
  80. a = self.action_fun(z);
  81. conv[i][j] = a;
  82. col = col + self.f_stride;
  83.  
  84. row = row + self.f_stride;
  85.  
  86. self.convs.append(conv);
  87.  
  88. #池化
  89. row = 0;
  90. for i in range(t_p):
  91. col = 0;
  92. for j in range(l_p):
  93. temp = conv[row:row+self.p_size[0],col:col+self.p_size[1]];
  94. if(self.p_classic == "average"):
  95. pool[i][j] = np.sum(temp) / (self.p_size[0] * self.p_size[1]);
  96. else:
  97. pool[i][j] = np.max(temp);
  98.  
  99. col = col + self.p_stride;
  100.  
  101. row = row + self.p_stride;
  102.  
  103. self.pools.append(pool);
  104.  
  105. X = np.array([[18,54,51,239,244,188],
  106. [55,121,75,78,95,88],
  107. [35,24,104,113,109,221],
  108. [3,154,104,235,25,130],
  109. [15,253,225,159,78,233],
  110. [68,85,180,214,215,0]]);
  111.  
  112. #X 归一化处理
  113. X = (X - np.sum(X)/36) / np.max(X);
  114. #print(X.shape)
  115.  
  116. con = CovolutionLayer([3,3,2,1],1,[2,2,2,"max"],);
  117. con.Convolution(X);
  118. print(con.pools);

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

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

  1. CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...

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

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

  3. 转载:cnn学习之卷积或者池化后输出的map的size计算

    相信各位在学习cnn的时候,常常对于卷积或者池化后所得map的的大小具体是多少,不知道怎么算.尤其涉及到边界的时候.   首先需要了解对于一个输入的input_height*input_widtht的 ...

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

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

  5. CNN学习笔记:池化层

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

  6. 【DeepLearning】基本概念:卷积、池化、Backpropagation

    终于有了2个月的空闲时间,给自己消化沉淀,希望别有太多的杂事打扰.在很多课程中,我都学过卷积.池化.dropout等基本内容,但目前在脑海中还都是零散的概念,缺乏整体性框架,本系列博客就希望进行一定的 ...

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

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

  8. 卷积和池化的区别、图像的上采样(upsampling)与下采样(subsampled)

    1.卷积 当从一个大尺寸图像中随机选取一小块,比如说 8x8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8x8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去. ...

  9. DL基础补全计划(六)---卷积和池化

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

随机推荐

  1. Hadoop生态圈-Flume的主流Channel源配置

    Hadoop生态圈-Flume的主流Channel源配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一. 二. 三.

  2. 设计模式之Mixin模式

    介绍 mixin模式就是一些提供能够被一个或者一组子类简单继承功能的类,意在重用其功能.在面向对象的语言中,我们会通过接口继承的方式来实现功能的复用.但是在javascript中,我们没办法通过接口继 ...

  3. POJ - 2513 Colored Sticks(欧拉通路+并查集+字典树)

    https://vjudge.net/problem/POJ-2513 题解转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1304742541 题 ...

  4. jQuery1.11源码分析(2)-----Sizzle源码中的正则表达式[原创]

    看完了上篇,对Sizzle有了一个大致的了解,我们接下来就可以正式开始啃Sizzle的源码了.上来就讲matcher难度太大,先来点开胃菜,讲讲Sizzle中的各个正则表达式的作用吧(本来还想讲初始化 ...

  5. Linux - awk 文本处理工具四

    awk 常用示例 获取本机 IP 方式 /sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print ...

  6. Java基本数据类型装箱的127临界点

    package wrapper.demo; public class WrapperDemo { /** * @param args */ public static void main(String ...

  7. Linux本地解析文件/etc/hosts说明【原创】

    windows的域名本地解析文件hosts是可以一个域名对多个IP,如果有一个IP有问题,可以去解析到其他IP Linux的本地解析文件/etc/hosts,是否也可以这样呢.下面做了个测试 先看一下 ...

  8. pymongo创建索引

    from database import db db_list = ["table1", "table2", "table3", " ...

  9. Project Euler Problem5

    Smallest multiple Problem 5 2520 is the smallest number that can be divided by each of the numbers f ...

  10. memcache 键名的命名规则以及和memcached的区别

    2014年3月27日 07:47:46 Keys---- Data stored by memcached is identified with the help of a key. A keyis ...