美文网首页
全连接层

全连接层

作者: skullfang | 来源:发表于2018-01-08 16:09 被阅读0次

    前言

    就是把前面实现的BP神经网络封装成层

    代码

    # -*- coding: utf-8 -*-
    # @Time    : 2017/12/3 下午2:17
    # @Author  : SkullFang
    # @Email   : yzhang.private@gmail.com
    # @File    : FullConnent.py
    # @Software: PyCharm
    
    import numpy as np
    import theano
    import theano.tensor as T
    from theano.tensor import shared_randomstreams
    from theano.tensor.nnet import sigmoid
    from theano.tensor.signal.pool import pool_2d
    from theano.tensor.nnet import conv
    from theano.tensor.nnet import softmax
    from SoftmaxLayer import  SoftmaxLayer
    """
    theano可以把代码塞到GPU上使用
    theano.tensor 有很多数学计算
    shared_randomstreams用于取随即值
    sigmoid激励函数
    """
    GPU=False
    if GPU:
        print "Trying to run under a GPU"
    
        try:
            theano.config.device='gpu'
        except:
            pass
        theano.config.floatX='float32'
    else:
        print "Running with a Cpu"
    
    class FullyConnectedLayer(object):
        def __init__(self, n_in, n_out, activation_fn=sigmoid, p_dropout=0.0):
            """
            这是一个构造函数。
            :param n_in: 输入多少个神经元
            :param n_out: 输出的多少个神经元
            :param activation_fn: 激励函数
            :param p_dropout: 抛弃多少个神经元是个百分比
            """
            # 前一层神经元个数
            self.n_in = n_in
            # 后一层神经元个数
            self.n_out = n_out
            # 激励函数
            self.activation_fn = activation_fn
            # dropout
            self.p_dropout = p_dropout
    
            #theano.shared可以创建类似共有性变量放在GPU上进行运算,borrow是说内存是否共用,在大对象的时候最好设置的是True
            #np.asarray()可以吧数组形式的,列表啊,元祖啊,字典啊变成一个矩阵
            #size是w是啥样 输入有多少个神经元自然w就有多少行。输出有多少个神经元w就有多少列。
            self.w = theano.shared(
                np.asarray(
                    np.random.normal(
                        loc=0.0, scale=np.sqrt(1.0 / n_out), size=(n_in, n_out)),
                    dtype=theano.config.floatX),
                name='w', borrow=True)
    
            #初始化b 跟初始化w差不多的。但是b的size可只有输出层那么多。很容易理解。w的一列就是输入层所有的神经元的w。
            # 然后* x +b 这里的b应该就是一个实数。有多少个实数呢?要看w有多少列了。所以只需要知道输出层的神经元个数。
            self.b = theano.shared(
                np.asarray(np.random.normal(loc=0.0, scale=1.0, size=(n_out,)),
                           dtype=theano.config.floatX),
                name='b', borrow=True)
    
            self.params = [self.w, self.b]
    
    
    
        def set_inpt(self,inpt,inpt_dropout,mini_batch_size):
            """
            全链接的输入设置
            :param inpt: 前一层的出
            :param inpt_droput: 前一层dropout之后的输出
            :param mini_batch_size:
            :return:
            """
            # reshape输入
            self.inpt = inpt.reshape((mini_batch_size, self.n_in))
            # 输出
            self.output = self.activation_fn(
                (1 - self.p_dropout) * T.dot(self.inpt, self.w) + self.b)
            # 取最大值
            self.y_out = T.argmax(self.output, axis=1)
            # dropout输入dropout
            self.inpt_dropout = dropout_layer(
                inpt_dropout.reshape((mini_batch_size, self.n_in)), self.p_dropout)
            # dropout输出
            self.output_dropout = self.activation_fn(
                T.dot(self.inpt_dropout, self.w) + self.b)
    
        def accuracy(self,y):
            return T.mean(T.eq(y,self.y_out))
    
    
    def ReLU(z): return T.maximum(0.0, z)
    
    def dropout_layer(layer, p_dropout):
        srng = shared_randomstreams.RandomStreams(
            np.random.RandomState(0).randint(999999))
        mask = srng.binomial(n=1, p=1 - p_dropout, size=layer.shape)
        return layer * T.cast(mask, theano.config.floatX)
    
    

    相关文章

      网友评论

          本文标题:全连接层

          本文链接:https://www.haomeiwen.com/subject/nwdxixtx.html