using keras learn Neural networks (1)

         nn是现在十分火热流行的机器学习算法,随着越来越多的科学家和工程师加入到该算法的研究和开发当中。该算法也越来越健壮,从最基本的Perceptron --->MLP--->(CNN,RNN) ----> CNN + RNN,更复杂的网络结构和组合不断涌现。越复杂的网络组合和结构让人越难以理解,但万变不离其宗,其都是由最基本的神经元构成。本系列文章围绕网络延变的复杂 layer 和 常规层进行对比,从而更好的理解这些复杂的网络层。

     本文探究模型输入和神经元之间关系

    

        上图为最基本的神经元结构,直接输出结果为:      \sum_{i=1}^{n}w_{i}x_{i}    ,这里最外层没有套激活函数,这就是个最基本的线性回归。该图是学习神经网络的入门图,但该图会造成某种思维定式,对之后学习CNN和RNN等复杂网络造成了一些思维上的干扰,至少我在学习的时候产生了不少纠结的地方。后来以keras为工具,对网络层的输入输出进行一些验证,才疏理清思路。

         思维定式点:假设图中 x1, x2, x3 是向量 X 当中的元素,那么 X = [x1, x2, x3] ,X 来自数据集中的某一个样本。那么输入的维度即是 (None, 3),None 代表任意样本,3代表该样本的特征数。

        

         上图为RNN的展开图,这里输入的 Xt-2. Xt-1. Xt. Xt+1与前一张图就有很大的不同,这里的每一个输入不代表输入的每个特征,而代表一个完整的向量 X,也就是说这里每一个从 X---> h ----> y 的过程就是图一的过程。但是如果在没有任何详细说明的情况下,列出上述这张图就会迁移图一的思考方式,让理解产生很大偏差。

          下面用以代码来说明网络层的输入与输出关系,因为这样会比文字描述更加直观。

# 加载相关库
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense
# input data
x_data_1 = np.array([[1, 2, 3]])
print("x_data shape: ", x_data_1.shape)
# def model
model_1 = Sequential()
model_1.add(Dense(1, input_shape=(3, )))
# output data
model_1.predict(x_data_1)

    

       上图看到输入向量 [1, 2, 3] , 向量属于数据 x_data的一个样本,因此构造的 x_data为一个二维数组,最终数据经过Dense层,得到结果,结果也存放在一个二维数组当中。Dense层就图一当中输出 所在的神经元 h,这里Dense的units设置为1,激活函数为None(默认为线性激活)。

# input data
x_data_2 = np.array([[[1, 2, 3], 
                      [1, 2, 3], 
                      [1, 2, 3]]])
print("x_data shape: ", x_data_2.shape)
# def model
model_1 = Sequential()
model_1.add(Dense(1, input_shape=(3, 3)))
# output data
model_1.predict(x_data_2)

         以思维定式点来看上图问题,会发现明明Dense设置的为1,也就说只有一个输出神经元。结果却返回了三个值?(一脸蒙蔽),事实上输出的依旧还是一个神经元,只是神经元最终输出的不再是单值,而是一个向量里而已。其实,这里就相当于下图:

          

        每个[x1, x2, x3]的特征输入依旧符合图一的模式,只是这里相当于三个图一走了相同的一个神经元,而它们之间相互独立没有任何影响,只是将它们分别得到的结果存放在一个数组里而已。

        为什么要做这样的验证?是因为RNN就是在这个基础上延伸出来的,将原本三个相互独立的神经元输入之间建立起依赖关系,其本质还是常规层,于是困扰了我很久的循环神经网络才有点眉目了。(也许是本人比较愚顿的缘故,比较聪明的可以秒懂)。

        思维拓展: 神经网络之所以强大就是因为其输入输出的多样性,tensorflow 这个词很好的描述了其特点,流动的张量。之前因为思维定式在图一那种模式下,就限制了自己对高级网络层的理解,其实本质就是张量在不同维度上的变换和运算。

       

 

猜你喜欢

转载自blog.csdn.net/qq_24834541/article/details/81484466
今日推荐