# -*- coding: utf-8 -*-
"""
Created on Sun Mar 4 09:21:41 2018 @author: markli
"""
import numpy as np; def ReLU(x):
return max(0,x); def logistic(x):
return 1/(1 + np.exp(-x)); def logistic_derivative(x):
return logistic(x)*(1-logistic(x)); class ConvolutionLayer:
"""
卷积神经网络中的卷积层
"""
def __init__(self,shape,padding,filters,stride):
"""
shape 卷积层形状,元组 (行,列,通道数)
padding 填充零个数的大小
filters 过滤器的形状,元组 (行,列,通道数,个数)
stride 步长
"""
self.shape = shape;
self.padding = padding;
self.stride = stride;
self.fileters = filters[:3];
self.fileternum = filters[3];
self.weights = [];
for i in range(filters[3]):
self.weights.append(np.random.randn(shape[2],filters[0],filters[1]));
self.baises = list(np.random.randn(filters[3])); self.convlutionsize = (int((shape[0] + 2*padding - filters[0])/stride + 1),int((shape[1] + 2*padding - filters[1])/stride + 1));
self.conv = np.ones((filters[3],self.convlutionsize[0],self.convlutionsize[1])); def Convolute(self,Data):
"""
Data 三维数组,若只有两维则通道数设为1.
"""
if(self.padding != 0):
for c in range(self.shape[2]):
ones = np.zeros((self.shape[0]+2*self.padding,self.shape[1]+2*self.padding));
ones[self.padding:self.padding+self.shape[0],self.padding:self.padding+self.shape[1]] = Data[c];
Data[c] = ones;
c,m,n = Data.shape; #遍历每一个过滤器
for f in range(self.fileternum):
t_conv = self.conv[f]; #取出第f个过滤器卷积后的临时容器
w = self.weights[f]; #取出第f个过滤器的权值集合
b = self.baises[f]; #取出第f个过滤器的偏倚
#卷积运算,所有通道一起遍历
row = 0;
for i in range(self.convlutionsize[0]):
col = 0;
for j in range(self.convlutionsize[1]):
data = Data[:,row:row+self.fileters[0],col:col+self.fileters[1]]; #取出卷积运算的数据立方体
s = 0; #存放卷积立方体的乘积的和
#对取出的临时数据的每个通道进行卷积运算
for t_c in range(c):
t_w = w[t_c];
t_data = data[t_c];
temp = sum(np.multiply(t_w,t_data));
s = temp + s;
t_conv[i,j] = ReLU(s+b);
#向右移动过滤器
col = col + self.stride;
#向下移动过滤器
row = row + self.stride;
#更新卷积结果容器
self.conv[f] = t_conv; class PoolLayer:
"""池化层"""
def __init__(self,shape,poolsize,stride,classic="max"):
"""
shape 池化目标的形状, 元组(行,列,通道数)
poolsize 池化矩阵的形状,元组 (行,列)
stride 步长 一般情况下池化的步长等于池化大小
classic 池化方式 max,average
"""
self.shape = shape;
self.stride = stride;
self.poolsize = poolsize;
self.classic = classic;
#生成池化结果矩阵形状
self.pool = np.ones((shape[2],(shape[0]-poolsize[0])/stride + 1,(shape[1]-poolsize[1])/stride + 1));
#生成过度池化矩阵形状
self.c_poolsize = ((shape[0]-poolsize[0])/stride + 1,(shape[1]-poolsize[1])/stride + 1); def Pool(self,Data):
"""
Data 三维数组,若只有两维则通道数设为1.
"""
c,m,n = Data.shape; #在每个通道上进行池化操作
for k in range(c):
p_temp = Data[k];
row = 0;
for i in range(self.c_poolsize[0]):
col = 0;
for j in range(self.c_poolsize[1]):
temp = p_temp[row:row+self.poolsize[0],col:col+self.poolsize[1]];
if(self.classic == "average"):
self.pool[k][i][j] = np.sum(temp) / (self.poolsize[0] * self.poolsize[1]);
if(self.classic == "max"):
self.pool[k][i][j] = np.max(temp);
else:
print("the classic does not exist"); col = col + self.stride; row = row + self.stride; class FullConnectLayer:
"""全连接层"""
def __init__(self,n_in,n_out,action_fun=logistic,action_fun_der=logistic_derivative,flag):
"""
n_in 输入层的单元数
n_out 输出单元个数 及紧邻下一层的单元数
action_fun 激活函数
action_fun_der 激活函数的导函数
flag 初始化权值和偏倚的标记 normal,larger,smaller
"""
self.action_fun = action_fun;
self.action_fun_der = action_fun_der;
self.n_in = n_in;
self.n_out = n_out;
init_weight_biase(flag); def init_weight_biase(self,init_flag):
if(init_flag == "noraml"):
self.weight = np.random.randn(self.n_out,self.n_in);#weight 取值服从N(0,1) 分布
self.biase = np.random.randn(self.n_out,1);
elif(init_flag == "larger"):
self.weight = 2*np.random.randn(self.n_out,self.n_in)-1; #weight 取值范围(-1,1)
self.biases = 2*np.random.randn(self.n_out,1)-1 ; #b 取值范围(-1,1)
elif(init_flag == "smaller"):
self.weight = np.random.randn(self.n_out,self.n_in)/np.sqrt(self.n_out) ; #weight 取值服从N(0,1/x) 分布
self.biase = np.random.randn(self.n_out,1); def Forward(self,inpt):
"""全连接层的前馈传播"""
self.inpt = np.dot(self.weight,inpt) + self.biase;
self.outpt = self.action_fun(self.inpt); """Softmax Layer"""

后向传播的实现还是没有头绪,三层之间如何衔接不知道该怎么设计。本人能力水平有限,欢迎交流。本人微信号 markli52024

Python3 卷积神经网络卷积层,池化层,全连接层前馈实现的更多相关文章

  1. tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)

    池化层定义在 tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( in ...

  2. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  3. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  4. mnist全连接层网络权值可视化

    一.数据准备 网络结构:lenet_lr.prototxt 训练好的模型:lenet_lr_iter_10000.caffemodel 下载地址:链接:https://pan.baidu.com/s/ ...

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

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

  6. 【深度学习篇】--神经网络中的池化层和CNN架构模型

    一.前述 本文讲述池化层和经典神经网络中的架构模型. 二.池化Pooling 1.目标 降采样subsample,shrink(浓缩),减少计算负荷,减少内存使用,参数数量减少(也可防止过拟合)减少输 ...

  7. 神经网络中的池化层(pooling)

    在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合).为什么可以通过降低维度呢? 因为图像具有一种“静态性”的属性,这 ...

  8. 【python实现卷积神经网络】全连接层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  9. caffe中全卷积层和全连接层训练参数如何确定

    今天来仔细讲一下卷基层和全连接层训练参数个数如何确定的问题.我们以Mnist为例,首先贴出网络配置文件: name: "LeNet" layer { name: "mni ...

随机推荐

  1. saltstack系列~第二篇

    一 简介:今天咱们来继续学习saltstack 二 命名和分组 1 命名规则 1 ID构成 机房-DB类型-角色(主/从)-IP地址 2 分组构成  分为master slave两组即可 2 分组规则 ...

  2. mysql 原理 ~ 常规锁

    一 模式 RR模式二 mysql锁相关场景  1 有间隙的地方就可能有间隙锁,并非只有辅助索引的场景下才会存在gap lock,典型场景 id主键的范围查询  2 varchar的范围锁定原理和int ...

  3. weblogic中部署SSH项目遇到的坑

    总结将SSH项目部署到weblogic遇到的坑.项目中是SSH,另外还用到了webservice.quartz等框架.在tomcat部署是可以的,现在总结部署到weblogic遇到的坑. 在这里说一下 ...

  4. 一步一步详解ID3和C4.5的C++实现

    1. 关于ID3和C4.5的原理介绍这里不赘述,网上到处都是,可以下载讲义c9641_c001.pdf或者参考李航的<统计学习方法>. 2. 数据与数据处理 本文采用下面的训练数据: 数据 ...

  5. IP分片丢失重传 - Sacrifice的日志 - 网易博客

        尽管IP分片看起来是是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报.为什么会发生这种情况呢?     因为IP层本身没有超时重传的机制--由更高层来负责超时和重传(TC ...

  6. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  7. shiro设置session超时时间

    系统默认超时时间是180000毫秒(30分钟) long timeout = SecurityUtils.getSubject().getSession().getTimeout(); System. ...

  8. @Html.Action()

    背景 在这里主要想谈下mvc,最初几年都是用的webform,作为一个资深傻瓜程序员多年,后来到处听说mvc,终于在某天下定决心实验下mvc,其实关键还是在于easyui,因为它的请求数据方式和mvc ...

  9. elk系统通过nginx添加对kibana的登录认证

    elk系统添加对kibana的登录认证 关于elk系统的安装配置可以参考:Centos6.5安装Logstash ELK stack 日志管理系统及使用详解 http://blog.csdn.net/ ...

  10. nagios系列(四)之nagios主动方式监控tcp常用的80/3306等端口监控web/syncd/mysql及url服务

    nagios主动方式监控tcp服务web/syncd/mysql及url cd /usr/local/nagios/libexec/ [root@node4 libexec]# ./check_tcp ...