python卷积神经网络实现


"""卷积神经网络"""
import numpy as np
import tensorflow as tf
import input_data
from logisticRegression import LogisticRegression
from mlp import HiddenLayer

"""
-------------CNN降低训练参数的2大法宝---------------
局部感受野、权值共享 
局部感受野:就是输出图像某个节点(像素点)的响应所对应的最初的输入图像的区域就是感受野. 
权值共享  :比如步长为1,如果每移动一个像素就有一个新的权值对应,那么太夸张了,需要训练的参数爆炸似增长,
            权值共享就是将每次覆盖区域的图像所赋给的权值都是卷积核对应的权值.就是说用了这个卷积核,
            则不管这个卷积核移到图像的哪个位置上,图像的被覆盖区域的所赋给的权值都是该卷积核的参数.

-------------从全连接到CNN经历了什么--------------            
演化进程: 全连接——->(全连接加上局部感受野了进化成)局部连接层———->(局部连接层加上权值共享了)卷积神经网络. 

-------------feature map----------------
同一种滤波器卷积得到的向量组合.一种滤波器提取一种特征,使用了6种滤波器,进行卷积操作,故有6层feature map.

----------------CNN训练的参数是什么-------------------
其实就是卷积核,当然还有偏置. 
"""

class ConvLayer(object):
    """卷积层"""
    def __init__(self, inpt, filter_shape, strides=(1, 1, 1, 1),
                 padding="SAME", activation=tf.nn.relu, bias_setting=True):
        """
        -----------变量说明-----------------

        inpt: tf.Tensor, 维度为 [n_examples, witdth, height, channels];
        filter_shape: 卷积核的维度, list或tuple, 形式为[witdth, height, channels, filter_nums];
        strides: list或tuple, 卷积核步长, 默认(1, 1, 1, 1);
        padding: 填充方式;CNN的两种padding方式“SAME”(必要的时候使用0进行填充)和“VALID”;(padding只是增加了边缘区域的像素点);
                 无padding情况:如果输入是a*a,filter是b*b,那么不加padding情况下,就会卷积后图像变小,变成(a−b+1)*(a−b+1)
        activation: 激活函数;
        bias_setting: 是否有偏置;
        """
        # 设置输入;
        self.input = inpt
        # 初始化卷积核;
        self.W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), dtype=tf.float32)
        if bias_setting:
            self.b = tf.Variable(tf.truncated_normal(filter_shape[-1:], stddev=0.1),
                                 dtype=tf.float32)
        else:
            self.b = None
        # 计算卷积操作的输出;
        conv_output = tf.nn.conv2d(self.input, filter=self.W, strides=strides,
                                   padding=padding)
        conv_output = conv_output + self.b if self.b is not None else conv_output
        # 设置输出;
        self.output = conv_output if activation is None else activation(conv_output)
        # 设置参数;
        self.params = [self
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值