(10)建立基本类神经网路程序

参考网站:Keras官方指南

  根据上面的参考网站,可以做出基本的类神经网路。
  首先要先有基本的设定,大致上如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

  因为keras目前被包含在tensorflow中,因此要先汇入tensorflow,才能汇入keras。
  再来建立Sequential model,这模组可以让每一层都仅有一个输入张量(tensor)以及输出张量,我前面有提到每一层中并非只有一个神经元,一个隐藏层中可能就很多神经元进行不同笔资料的运算,因此得要整合,限制只能有一个输入以及输出,而且张量也能帮助进行线性的运算。网站提供程序如下:

model = keras.Sequential(
    [
        layers.Dense(2, activation="relu", name="layer1"),
        layers.Dense(3, activation="relu", name="layer2"),
        layers.Dense(4, name="layer3"),
    ]
)

  在layer.Dense中,activation是激励函数,主要用来引入非线性资料。因为在训练类神经网路的时候,输入和输出的部分仍然脱离不了线性关系,必须要能让训练过的资料输出给下一层,因此可以用激励函数来引入非线性资料。激励函数有:sigmoid, tanh, Relu⋯⋯等等。
  最後要输入资料以及建立模组来测试是否成功:

x = tf.ones((3, 3))
y = model(x)

  tensorflow中的ones类别,可以创造所有元素都设置为1的张量,以上面程序为例,(3, 3)的意思就是建立一个3x3的矩阵,且该矩阵中的所有元素皆为1。
  接着用以下的输出来看看建立的如何:「」

print(model.summary())

  得到如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
layer1 (Dense)               (3, 2)                    8         
_________________________________________________________________
layer2 (Dense)               (3, 3)                    9         
_________________________________________________________________
layer3 (Dense)               (3, 4)                    16        
=================================================================
Total params: 33
Trainable params: 33
Non-trainable params: 0
_________________________________________________________________
None

  params为参数,也就是权重的个数。当输入资料时,不同资料与神经元之间会有权重(之前的类神经网路架构的图,有个神经元要传送到下一层的神经元时,会乘上各自的权重),这不同的权重个数加总起来就是params。
  因为设定的dense层为基础神经网路,因此param计算:(输入数据维度+1)×神经元个数,可是网站提供的设定是(3, 3)这样维度看起来有2。
  经过测试之後,我的想法是因为dense层很基础,因此就算输入的矩阵有多少,主要还是看最後的数字来决定,这维度是只有多少个神经元(以(3,4)为例子较好理解,也就是这输入层中每个神经元的资料是[1, 1, 1],然後有4个同样的神经元),因此layer1的params计算为(3+1)×2=8,接着layer2因为layer1的神经元设定只有2,因此layer2的计算为(2+1)3=9⋯⋯以此类推。
  当我把设定tf.ones更改为(3,4,2)得出结果:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
layer1 (Dense)               (3, 4, 2)                 6         
_________________________________________________________________
layer2 (Dense)               (3, 4, 3)                 9         
_________________________________________________________________
layer3 (Dense)               (3, 4, 4)                 16        
=================================================================
Total params: 31
Trainable params: 31
Non-trainable params: 0
_________________________________________________________________
None

  可以看出param在dense层时,只会受到最後的数字影响,且该数字为这一层中有多少神经元。
  只不过以上是我测试多笔资料後的观察,因为实在找不到相关的解释,因此才这麽想。


<<:  Day 20 - Maybe Monad II (Piping)

>>:  Day20 - 使用 Hash 实作资料查询

Day27-用jQuery写得出ToDoList吗_2_搞个4码随机码给id使用吧

今天要先把昨天写的东西都给挪到阵列之中,所以我们会需要一个空的阵列 这个阵列因为多个函式会使用到,记...

世界上最快乐的人 (2) 有所缘禅修

安住在对境上 - 有所缘的禅修 无所缘禅修之所以困难,因为太过简单。心的本质(觉性)很难辨认。反而容...

Day8 - 程序设计报价 (三) - 常见问题

上一篇文章中介绍的报价方法,在我这一年多来的实验结果,碰过很多无法接受或是仍旧希望要有报价单、合约书...

Day 18 - SwiftUI开发学习2(Toggle切换)

昨天我们学完了按钮,我们今天来学切换按钮。 正文 没错这这个Toogle就长得跟设定里面看到的一模模...

25.移转 Aras PLM大小事-流程签核动态指派(4)

流程指派这件事情,还会依据流程关卡不同,有不同方向走法 像下图用自动节点指向两种路线 同样套用程序J...