# -*- 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. 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. Dist

    Description 数据范围:\(1<=n<=10^5,1<=k<=18,1<=k_i<=10^7,\sum |s_i|<=3*10^5\) Soluti ...

  2. Linux 服务器上快速配置阿里巴巴 OPSX NTP服务

    编辑文件 "/etc/ntp.conf",根据情况修改文件内容为: 互联网上的服务器: driftfile /var/lib/ntp/drift pidfile /var/run/ ...

  3. Solr记录-solr文档xml

    Solr添加文档(XML) 在上一章中,我们学习解释了如何向Solr中添加JSON和.CSV文件格式的数据.在本章中,将演示如何使用XML文档格式在Apache Solr索引中添加数据. 示例数据 假 ...

  4. [iOS]@synthesize和@dynamic关键字

    首先讲@property, 这是iOS6以后出来的关键词. 用它声明一个属性之后, 编译器会自动给你生成setter和getter方法的声明以及实现还有一个以_xxx 的成员变量(xxx是你属性定义的 ...

  5. Redis 学习小记

    由于是学习笔记,我就不来各种啰嗦,介绍这个介绍那个,也不上交给国家,或者各种对比,相信如果你真心用 redis 的话,就不会去跟 MySql,Memcached,MongoDB 等做对比了. 我原先用 ...

  6. js调试系列: 源码定位与调试[基础篇]

    js调试系列目录: - 如果看了1, 2两篇,你对控制台应该有一个初步了解了,今天我们来个简单的调试.昨天留的三个课后练习,差不多就是今天要讲的内容.我们先来处理第一个问题:1. 查看文章下方 推荐 ...

  7. SDWebImage源码阅读-第二篇

    一  SDWebImageManager的downloadImageWithURL的方法 上一篇,我们刚开了个头,分析了一下开始加载图片之前如何取消其他正在下载的任务,接着,我们回到 - (void) ...

  8. VS 多工程代码编写

    VS工作目录,输出目录 C++项目,解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件 ...

  9. python selenium - web自动化环境搭建

    前提: 安装python环境. 参考另一篇博文:https://www.cnblogs.com/Simple-Small/p/9179061.html web自动化:实现代码驱动浏览器进行点点点的操作 ...

  10. CodeForces Contest #1114: Round #538 (Div. 2)

    比赛传送门:CF #1114. 比赛记录:点我. 又 FST 了. [A]Got Any Grapes? 题意简述: 有三个人,第一个人需要吃绿色葡萄至少 \(a\) 个,第二个人需要吃绿色和紫色葡萄 ...