首页 > 代码库 > 卷积神经网络
卷积神经网络
LeNet-5是一种用于手写字符识别的卷积神经网络(效果见这),为了熟悉theano的卷积神经网络工具包,对它进行了研究。
1. 模型
2. ConvPoolLayer
class ConvPoolLayer(object): """ 卷积层 """ def __init__(self, rng, input, filter_shape, image_shape, poolsize=(2, 2)): """ rng 类型:numpy.random.RandomState 描述:用于初始化权值的随机数产生器 input 类型:theano.tensor.dtensor4 描述:图像数据 filter_shape 类型:长度为4的元组或序列 描述:(过滤器数量,输入的特征图数量,过滤器高度,过滤器宽度) image_shape 类型:长度为4的元组或序列 描述:(batch size,输入的特征图数量,图像高度,图像宽度) poolsize 类型:长度为2的元组或序列 描述:下采样系数(#rows, #cols) """ assert image_shape[1] == filter_shape[1] self.input = input # 每个神经元的输入 = 输入的特征图数量 * 过滤器高度 * 过滤器宽度 fan_in = numpy.prod(filter_shape[1:]) # 每个神经元的输出 = (输出的特征图数量 * 过滤器高度 * 过滤器宽度)/ 池大小 fan_out = (filter_shape[0] * numpy.prod(filter_shape[2:]) / numpy.prod(poolsize)) # 用随机数初始化权值 W_bound = numpy.sqrt(6. / (fan_in + fan_out)) self.W = theano.shared( numpy.asarray( rng.uniform(low=-W_bound, high=W_bound, size=filter_shape), dtype=theano.config.floatX ), borrow=True ) # 初始化偏差--每个输出特征图对应一个偏差 b_values = numpy.zeros((filter_shape[0],), dtype=theano.config.floatX) self.b = theano.shared(value=http://www.mamicode.com/b_values, borrow=True) # 对输入的特征图求卷积 conv_out = conv.conv2d( input=input, filters=self.W, filter_shape=filter_shape, image_shape=image_shape ) # 对每张求卷积后每张特征图用最大池法进行下采样 pooled_out = downsample.max_pool_2d( input=conv_out, ds=poolsize, ignore_border=True ) # 添加偏差 self.output = T.tanh(pooled_out + self.b.dimshuffle(‘x‘, 0, ‘x‘, ‘x‘)) # 保存本层的参数 self.params = [self.W, self.b]
3. HiddenLayer
class HiddenLayer(object): """ 隐层 """ def __init__(self, rng, input, n_in, n_out, W=None, b=None, activation=T.tanh): """ rng 类型:numpy.random.RandomState 描述:用于初始化权值的随机数产生器 input 类型:theano.tensor.dmatrix 描述:输入数据 n_in 类型:int 描述:输入数据的大小 n_out 类型:int 描述:神经元数量 activation 类型:theano.Op或函数 描述:非线性,用于隐层的激活 """ self.input = input # 初始化权值 if W is None: W_values = numpy.asarray( rng.uniform( low=-numpy.sqrt(6. / (n_in + n_out)), high=numpy.sqrt(6. / (n_in + n_out)), size=(n_in, n_out) ), dtype=theano.config.floatX ) if activation == theano.tensor.nnet.sigmoid: W_values *= 4 W = theano.shared(value=http://www.mamicode.com/W_values, name=‘W‘, borrow=True) # 初始化偏差 if b is None: b_values = numpy.zeros((n_out,), dtype=theano.config.floatX) b = theano.shared(value=http://www.mamicode.com/b_values, name=‘b‘, borrow=True) self.W = W self.b = b # 激活 lin_output = T.dot(input, self.W) + self.b self.output = ( lin_output if activation is None else activation(lin_output) ) self.params = [self.W, self.b]
4. LogisticRegression
class LogisticRegression(object): """ 逻辑回归 """ def __init__(self, input, n_in, n_out): """ input 类型:theano.tensor.TensorType 描述:输入数据 n_in 类型:int 描述:输入单元的个数 n_out 类型:int 描述:输出单元的个数 """ self.W = theano.shared( value=numpy.zeros( (n_in, n_out), dtype=theano.config.floatX ), name=‘W‘, borrow=True ) self.b = theano.shared( value=numpy.zeros( (n_out,), dtype=theano.config.floatX ), name=‘b‘, borrow=True ) # 分类 self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b) # 分类结果 self.y_pred = T.argmax(self.p_y_given_x, axis=1) self.params = [self.W, self.b] def negative_log_likelihood(self, y): """ 返回该模型的对于某一指定变量的最小负的对数似然函数值 """ return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y]) def errors(self, y): # 检查与预测值是否有相同的维数 if y.ndim != self.y_pred.ndim: raise TypeError( ‘y should have the same shape as self.y_pred‘, (‘y‘, y.type, ‘y_pred‘, self.y_pred.type) ) # 检查数据类型是否正确 if y.dtype.startswith(‘int‘): return T.mean(T.neq(self.y_pred, y)) else: raise NotImplementedError()
卷积神经网络
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。