深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)

能实现深度学习模型的包有许多,tensorflow,keras,pytorch,theano等等,自己选择keras是因为刚学习代码时,带我的学长使用的就是keras,我也就学习这个了。keras十分简洁,但正因如此,在其基础上进行改动有些麻烦,以至于中途想换tensorflow了,但发现tensorflow2.0以上就是tensorflow.keras了,几乎和keras一样,至于其到底和keras有哪些不同,也没去管。反正,目前使用keras体验还是非常不错的,完成了我需要完成的任务。keras如何安装什么的,网上有许多教程,搜一下就好了。

神经网络

神经网络的思想主要源于生物细胞,其起源和基本概念我推荐这一篇文章https://blog.csdn.net/Robin_Pi/article/details/104812252,介绍的很好。
深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)_第1张图片

单个神经元

上图可以看做一个最简单的单层神经网络(输出为单值),keras只需要几行代码便可实现这个:

import keras
from keras.layers import *
from keras.models import *

model_input = Input((1000,))
model_output =  Dense(1)(model_input)
model = Model(model_input,model_output)

我们假设输入数据的shape为(batch_size,1000),可以理解成,有batch_size(随便一个常数)个数据,每个数据有1000个维度。初学keras时,一定要注意shape,这可以说是keras中最头疼的问题。

逐步说明这几行代码:
个人采用的是keras的API写法,其实这种简单的模型,可以使用Keras Sequential 顺序模型,但我个人认为,反正后面肯定要用更复杂的模型,还不如一开始就直接使用API表示,也麻烦不了多少。keras API表示的原理和方法可以直接取keras官方文档了解(个人强烈推荐官方文档,能解决你很多疑虑)https://keras.io/zh/getting-started/functional-api-guide/。想了解顺序模型的也可以去搜索。

开始三行是调用keras,注意第二行第三行,个人建议大家在开头处都加上这两行,keras.layers中包括了我们这里使用的Dense层,也包括了LSTM,CNN等等,如果不先写这行,调用层非常麻烦,keras.models也最后写上。

第五行中的Input()函数,源码位于keras\engine\input_layer.py,找源码时首先要找到你的keras下载在哪里,我的使用anaconda下载的,所以在F:\Anaconda3\Lib\site-packages\中。下面展示部分源码加深理解:

def Input(shape=None, batch_shape=None,
          name=None, dtype=None, sparse=False,
          tensor=None):

官方文档有这些参数的定义:
深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)_第2张图片
虽然我们可以指定batch_shape,但一般来说,在keras的Input层中,我们不需要将数据集大小放进去,只需要输入单个数据的shape(如一个图集,我们不需要输入有多少张图片,只需要输入单个图片的大小)。
除此之外,我们本模型中输入的是单轴数据(例如一个人一周中的每日消费额),有的输入可以是多轴的(图片是3轴的,包括图片长,宽,通道数)。通过我自己的尝试,我发现,单轴数据维度后必须加一个",",模型中的Input((1000,))不能写成Input((1000)) 不然会报错,输入多轴数据则不用。但原因我没有深层考虑啦,反正也不怎么影响。

输入部分完毕后,我们要定义我们的神经网络模型,用来处理输入。第六行完成了此任务。
其中,Dense层是重点,Dense层其实就是全连接层,源码位于keras\layers\core.py

def __init__(self, units,
                 activation=None,
                 use_bias=True,
                 kernel_initializer='glorot_uniform',
                 bias_initializer='zeros',
                 kernel_regularizer=None,
                 bias_regularizer=None,
                 activity_regularizer=None,
                 kernel_constraint=None,
                 bias_constraint=None,
                 **kwargs):

深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)_第3张图片
注意:Dense层可以直接添加激活函数(其实keras中的所有层都可以添加)。至于为啥要使用激活函数,激活函数有哪些,以后会提到。
Dense层的核心代码部分:

def build(self, input_shape):
    assert len(input_shape) >= 2
    input_dim = input_shape[-1]

    self.kernel = self.add_weight(shape=(input_dim, self.units),
                                  initializer=self.kernel_initializer,
                                  name='kernel',
                                  regularizer=self.kernel_regularizer,
                                  constraint=self.kernel_constraint)
    if self.use_bias:
        self.bias = self.add_weight(shape=(self.units,),
                                    initializer=self.bias_initializer,
                                    name='bias',
                                    regularizer=self.bias_regularizer,
                                    constraint=self.bias_constraint)
    else:
        self.bias = None
    self.input_spec = InputSpec(min_ndim=2, axes={-1: input_dim})
    self.built = True

def call(self, inputs):
    output = K.dot(inputs, self.kernel)
    if self.use_bias:
        output = K.bias_add(output, self.bias, data_format='channels_last')
    if self.activation is not None:
        output = self.activation(output)
    return output

可以看出,Dense层完成操作:output = Wx + b. 值得注意,不管输入数据是几个轴的,Dense层只会对最后一个轴做处理。当输入维度units设置为256时,(1000,)的数据变为(256,),(1000,500)变为(1000,256).所以,当我们想处理的轴不是最后一个时,首先要对数据进行Permute操作,处理完毕后再Permute回来(注意:keras所有操作都要以层进行,所以要使用Permute层)。例子:

model_input = Input((1000,800,500)) #输入数据为三轴(1000,800,500),我们想将其第二个轴800维通过全连接变为400维
model_output = Dense(400)(model_input)#直接对其进行处理
model = Model(model_input,model_output)
model.summary()

深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)_第4张图片
可以看出,并没有按照我们的心意,将轴二的800维变为400,而是将最后一个轴的500变为了400.

model_input = Input((1000,800,500))
nn = Permute((1,3,2))(model_input)#将800和500转置
model_output = Dense(400)(nn)
model_output = Permute((1,3,2))(model_output)#转回来
model = Model(model_input,model_output)
model.summary()

深度学习笔记与Keras实现细节(二)keras实现简单神经网络(Dense层细节)_第5张图片
可以看到,按照我们的想法,将轴2由800变为了500.

最后我们将模型封装即可,以上就是最简单的神经网络的实现和一些细节。下一篇我将此模型用到具体任务介绍keras如何训练,同时使用多层感知器对比。

你可能感兴趣的:(神经网络,深度学习,python)