[tensorflow]完整一套流程的第三天

      从理论到实践,才是完整的学习过程。

      神经网络的提出,是从神经元开始的。从生物学意义上的神经元得到启发,感知机的概念被提了出来。感知机的原理就是对输入向量进行一定的计算,并通过激活函数得到更加能表达数据意义的内容。再从向量开始扩充,拓展到矩阵,以及更高维的张量。于是,全连接层被用来同时处理更多的数据。全连接层的实现方式主要有两种:张量形式和层形式。

      张量形式主要是两步,先将输入数据乘上这一层的权重,加上偏置项,然后输入进激活函数得到结果。调用tf.matmul计算相称运算,激活函数的选择放在后面。层形式相比较为简单,通过tf.keras.layers.Dense同时设定好层的输出神经元个数以及激活函数,在调用build方法或者经过计算后,会在内部创建权重矩阵偏置项。同时Dense对象拥有一些属性,可以查看这一层的具体情况。kernel属性查看权重矩阵,bias属性查看偏置项,trainable_variables属性包括所有需要优化的张量,non_trainable_variables属性包括不需要优化的张量,variables包括所有张量。

      渐渐的,仅仅一个全连接层已经不能够完成复杂的任务,于是神经网络开始出现,人们把多个网络层连起来,前面一层的输出输入下一层,来实现复杂的目标。通过tf.GradientTape上下文管理待优化张量,调用gradient方法计算梯度,再使用tf.keras.optimizers优化器优化张量。同样的,对于网络,可以用两种方式实现,还可以更进一步,将Dense对象包含在tf.keras.Sequential容器中,简化调用过程。

      网络层中使用的激活函数,有一些常用的函数,包括sigmoid、tanh、relu、leakyrelu等。前两种在一定范围内有较好表现,但是如果数据趋向于正负无穷,导数趋向于0,会导致梯度弥散现象,降低网络性能。而后两种可以改善这样的现象,他们相同的是对正数直接输出,不同的是,relu对负数直接输出为0,而leakyrelu将负数乘一个小于1的正数,对负数进行了一定的保留。

      同时,激活函数也控制了输出层输出结果的分布情况,sigmoid控制输出范围为[0, 1],tanh控制输出范围为[-1, 1],而有时要控制输出范围[0, 1]同时总和为1,这时就需要softmax函数,softmax(x)=exp(x)/sum(exp(x))。

      最后就是误差计算,常用的有均方差、交叉熵、KL散度、Hinge Loss函数等。

posted @ 2020-07-16 20:24  小小的豪猪窝  阅读(72)  评论(0编辑  收藏  举报