"""卷积神经网络"""
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
python卷积神经网络实现
最新推荐文章于 2024-05-08 16:26:37 发布