边写代码边学习之全连接Dense

news2024/11/26 23:24:44

1. 全连接原理

Dense Layer in Tensorflow

全连接神经网络(Fully Connected Neural Network)是一种最基本的神经网络结构,也被称为多层感知器(Multilayer Perceptron,MLP)。其原理是模拟人脑神经元之间的连接方式,通过多个层次的神经元组成,每个神经元都与上一层和下一层的所有神经元相连接。

全连接神经网络的原理如下:

  1. 输入层(Input Layer):接受输入数据,每个输入特征对应一个输入节点。

  2. 隐藏层(Hidden Layer):位于输入层和输出层之间,可以包含多个层。每个隐藏层由多个神经元组成,每个神经元与上一层的所有神经元相连接,并带有权重值。

  3. 输出层(Output Layer):输出神经网络的预测结果,通常对应问题的类别或数值。

  4. 权重(Weights):每个连接都有一个权重值,表示连接的强度。权重值在网络训练过程中更新,以使神经网络能够学习到合适的特征表示和模式。

  5. 偏置(Biases):每个神经元都带有一个偏置项,它可以看作是神经元的激活阈值。偏置可以调整神经元是否被激活。

  6. 激活函数(Activation Function):位于每个神经元中,用于引入非线性性,允许神经网络学习复杂的函数映射。常见的激活函数包括Sigmoid、ReLU、tanh等。

 训练全连接神经网络的过程一般通过反向传播算法(Backpropagation)来实现。它包括前向传播(从输入到输出)计算预测结果,并计算预测值与真实值之间的误差;然后通过反向传播计算梯度并更新网络中的权重和偏置,以最小化误差函数。这个过程会不断迭代,直到网络达到较好的预测性能。

缺点:

全连接神经网络在处理大规模数据时,可能会面临过拟合、计算资源消耗大等问题。为了解决这些问题,人们开发了更复杂的神经网络结构,例如卷积神经网络(CNN)和循环神经网络(RNN),它们在特定领域表现出色。

2. tf.keras.layers.Dense 方法以及参数的详细介绍

tf.keras.layers.Dense(
    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
)

参数

  • units:正整数,输出空间的维数。
  • activation:要使用的激活函数。 如果您未指定任何内容,则不会应用任何激活(即“线性(linear)”激活:a(x) = x)。
  • use_bias:布尔值,该层是否使用偏置向量。
  • kernel_initializer:内核权重矩阵的初始化器。
  • bias_initializer:偏置向量的初始化器。
  • kernel_regularizer:应用于内核权重矩阵的正则化函数。
  • bias_regularizer:应用于偏差向量的正则化函数。
  • Activity_regularizer:应用于层输出的正则化函数(其“激活”)。
  • kernel_constraint:应用于内核权重矩阵的约束函数。
  • bias_constraint:应用于偏置向量的约束函数。

只是常规的密集连接(regular densely-connected NN)的神经网络层。

Dense 实现操作:output = activation(dot(input, kernel) + bias),其中激活(activation)是作为激活参数传递的逐元素(element-wise)激活函数,内核(kernal)是由层创建的权重矩阵(weights matrix),偏差(bias)是由层创建的偏差向量(仅当 use_bias 为 True 时适用)。 这些都是Dense的属性。

注意:如果该层的输入的秩(rank)大于 2,则 Dense 会沿着输入的最后一个轴和内核的轴 0 计算输入和内核之间的点积(使用 tf.tensordot)。 例如,如果输入的维度为 (batch_size, d0, d1),那么我们创建一个形状为 (d1,units) 的内核,并且内核kernal沿输入的axis 2 对形状为 (1, 1, d1) 的每个子张量进行操作(有 batch_size * d0 这样的子张量)。 这种情况下的输出将具有形状(batch_size,d0,units)。

此外,层的属性在调用一次后就无法修改(可trainable属性除外)。 当传递流行的 kwarg input_shape 时,keras 将创建一个输入层插入到当前层之前。 这可以被视为等同于显式定义一个InputLayer。

Input Shape

N 维张量(N-D tensor),shape为:(batch_size, ..., input_dim)。 最常见的情况是形状为 (batch_size, input_dim) 的 2D 输入。

Output Shape

N 维张量(N-D tensor),shape为:(batch_size,...,units)。 例如,对于shape为(batch_size,input_dim)的 2D 输入,输出将具有形状(batch_size,units)。

3. 例子代码

3.1. 一层Dense模型

建一个只用Dense搭建的模型。输入是20,输出是10. 激活函数是relu.默认是没有激活函数。权重矩阵的shape是(20, 10)。偏置的shape是(10).  权重参数= 20 x 10 +10

def simple_dense_layer():
    # Create a dense layer with 10 output neurons and input shape of (None, 20)
    model = tf.keras.Sequential([
     keras.layers.Dense(units=10, input_shape=(20,), activation = 'relu')
    ]);
    # Print the summary of the dense layer
    print(model.summary())

if __name__ == '__main__':
    simple_dense_layer()

输出:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 10)                210       
                                                                 
=================================================================
Total params: 210
Trainable params: 210
Non-trainable params: 0
_________________________________________________________________

3.2. 多层Dense的模型

三次Dense构建的模型。前两层的激活函数是relu。最后一层是softmax。

def multi_Layer_perceptron():
    input_dim = 20
    output_dim = 5

    # Create a simple MLP with 2 hidden dense layers
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(units=64, activation='relu', input_shape=(input_dim,)),
        tf.keras.layers.Dense(units=32, activation='relu'),
        tf.keras.layers.Dense(units=output_dim, activation='softmax')
    ])

    # Print the model summary
    print(model.summary())
if __name__ == '__main__':
    multi_Layer_Perceptron()

输出


Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 64)                1344      
                                                                 
 dense_1 (Dense)             (None, 32)                2080      
                                                                 
 dense_2 (Dense)             (None, 5)                 165       
                                                                 
=================================================================
Total params: 3,589
Trainable params: 3,589
Non-trainable params: 0
_________________________________________________________________

3.3. 查看权重矩阵以及修改权重矩阵和偏置。

定义一个Dense层。输入一组数据使得Dense初始化其权重矩阵和偏置。然后打印权重矩阵和偏置。你会发现都是-1到1之间的随机数字。

def change_weight():
    # Create a simple Dense layer
    dense_layer = keras.layers.Dense(units=5, activation='relu', input_shape=(10,))

    # Simulate input data (batch size of 1 for demonstration)
    input_data = tf.ones((1, 10))

    # Pass the input data through the layer to initialize the weights and biases
    _ = dense_layer(input_data)

    # Access the weights and biases of the dense layer
    weights, biases = dense_layer.get_weights()

    # Print the initial weights and biases
    print("Initial Weights:")
    print(weights)
    print("Initial Biases:")
    print(biases)

输出

Initial Weights:
[[-0.11511135  0.32900262 -0.1294617  -0.03869444 -0.03002286]
 [-0.24887764  0.20832229  0.48636192  0.09694523 -0.0915786 ]
 [-0.22499037 -0.1025297   0.25898546  0.5259896  -0.19001997]
 [-0.28182945 -0.38635993  0.39958888  0.44975716 -0.21765932]
 [ 0.418611   -0.56121594  0.27648276 -0.5158085   0.5256552 ]
 [ 0.34709007 -0.10060292  0.4056484   0.6316313   0.12976009]
 [ 0.40947527 -0.2114836   0.38547724 -0.1086036  -0.29271656]
 [-0.30581984 -0.14133212 -0.11076003  0.36882895  0.3007568 ]
 [-0.45729238  0.16293162  0.11780071 -0.31189078 -0.00128847]
 [-0.46115184  0.18393213 -0.08268476 -0.5187934  -0.608922  ]]
Initial Biases:
[0. 0. 0. 0. 0.]

根据权重矩阵的shape和偏置的shape把他们分别改为1和0. 然后设置Dense里的权重矩阵和偏置。之后,输入一组数据,得到一组输出。你可以根据我们上面的理论手动计算一下然后验证一下是不是最后是相同。

    # Modify the weights and biases (for demonstration purposes)
    new_weights = tf.ones_like(weights)  # Set all weights to 1
    new_biases = tf.zeros_like(biases)  # Set all biases to 0

    # Set the modified weights and biases back to the dense layer
    dense_layer.set_weights([new_weights, new_biases])

    # Access the weights and biases again after modification
    weights, biases = dense_layer.get_weights()

    # Print the modified weights and biases
    print("Modified Weights:")
    print(weights)
    print("Modified Biases:")
    print(biases)

    input_data = tf.constant([[1,1,3,1,2,1,1,1,1,2]])

    output = dense_layer(input_data)

    print(output)

输出

Modified Weights:
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
Modified Biases:
[0. 0. 0. 0. 0.]
tf.Tensor([[14. 14. 14. 14. 14.]], shape=(1, 5), dtype=float32)

3.4. 加一个自定义的激活函数

自定义一个激活函数,这个函数非常简单,就是输入值做平方。然后设置自定义权重矩阵和偏置给Dense层,输入自己定义的数据,最后验证结果是不是和介绍的理论是一样。

def custom_Activation_Function():
    def custom_activation(x):
        return tf.square(x)

    dense_layer = keras.layers.Dense(units=2, activation=custom_activation, input_shape=(4,))

    weights = tf.ones((4,2))
    biases = tf.ones((2))


    input_data = tf.ones((1, 4))
    _ = dense_layer(input_data)
    dense_layer.set_weights([weights, biases])

    # Print the modified weights and biases
    print("Modified Weights:")
    print(dense_layer.get_weights()[0])
    print("Modified Biases:")
    print(dense_layer.get_weights()[1])

    input_data = tf.constant([[1, 2, 3, 1]])
    output = dense_layer(input_data)

    print(output)


if __name__ == '__main__':
    custom_Activation_Function()

输出

Modified Weights:
[[1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]]
Modified Biases:
[1. 1.]
tf.Tensor([[64. 64.]], shape=(1, 2), dtype=float32)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI视频监控综合管理平台EasyCVR多分屏默认播放协议的配置优化

智能视频监控平台EasyCVR可拓展性强、开放度高,既能作为业务平台使用,也能作为视频能力层被调用和集成。视频监控综合管理平台兼容度高,支持自由调用、支持与第三方集成。在AI能力的接入上,TSINGSEE青犀视频平台可支持AI智能分析网…

SD NAND【商业】

SD NAND【商业】 前言版权推荐SD NAND外观NAND与TF卡的区别雷龙CS SD NAND(贴片式TF卡)性能体验及应用 最后 前言 2023-7-23 16:20:19 因为本人对硬件了解不是很多,所以该篇参考自官方文档。 以下内容源自《【商业】》 仅供学习交流使用 版权 禁止其他平台发布…

linux 学成之路(基础篇)(二十三)MySQL服务(下)

目录 一、用户权限管理概述 二、用户权限类型 三、用户赋予权限 四、删除权限 五、删除用户 一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面,它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和…

QT项目打包成软件进行发布的三种方式

目录 一、打包成绿色便携版 二、打包成单文件版 三、打包成可安装版本 本教程对应的IDE是Qt Creater。 保证绿色便携版能正常运行才能够打包成单文件版本和可安装版本。 一、打包成绿色便携版 特点:给别人发送的时候需要先制作成一个压缩包文件,解…

【javaSE】 递归与汉诺塔详解

目录 递归 生活中的故事 递归的概念 递归的必要条件 示例 递归执行过程分析 代码示例 递归练习 练习一 执行过程图 练习二 执行过程图 练习三 执行流程图 ​编辑斐波那契数列 汉诺塔 汉诺塔问题解析 总结 递归 关于递归博主在C语言部分也进行了详解&#xff…

Rabbit MQ整合springBoot

一、pom依赖二、消费端2.1、application.properties 配置文件2.2、消费端核心组件 三、生产端3.1、application.properties 配置文件2.2、生产者 MQ消息发送组件四、测试1、生产端控制台2、消费端控制台 一、pom依赖 <dependency><groupId>org.springframework.boo…

【lesson4】linux权限

文章目录 权限权限是什么&#xff1f;对人权限对角色和文件权限权限修改改属性改人 权限 权限分为两种对人权限和对角色和文件的权限 权限是什么&#xff1f; 在脑海中我们对权限有一定的理解那么权限的定义到底是什么我们却说不出来&#xff0c;接下来我们来举个例子介绍一…

黑客和网络安全学习资源,限时免费领取,点这里!

统计数据显示&#xff0c;目前我国网安人才缺口达140万之多… 不管你是网络安全爱好者还是有一定工作经验的从业人员 不管你是刚毕业的行业小白还是想跳槽的专业人员 都需要这份超级超级全面的资料 几乎打败了市面上90%的自学资料 并覆盖了整个网络安全学习范畴 来 收藏它&…

MySQL基础(三)用户权限管理

目录 前言 一、概述 二、用户权限类型 1.CREATE 2.DROP 三、用户赋权 例子 四、权限删除 例子 五、用户删除 例子 总结 前言 关于MySQL的权限简单的理解就是MySQL允许你做你权利以内的事情&#xff0c;不可以越界。MySQL服务器通过权限表来控制用户对数据库的访问&…

[SSM]Spring中的JabcTemplate

目录 十三、JdbcTemplate 13.1环境准备 13.2新增 13.3修改 13.4删除 13.5查询 13.6查询一个值 13.7批量添加 13.8批量修改 13.9批量删除 13.10使用回调函数 13.11使用德鲁伊连接池 十三、JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类&#xff0c;是对JDBC…

如何使用一个数据库构建一个消耗大量IOPS的应用程序

​我很喜欢关于社交媒体和数据库的创作主意。所以&#xff0c;让我们以一个新的方向来探索&#xff1a;看看Twitch.tv或任何具有即时通讯功能的平台。如果你刚开始接触数据库&#xff0c;可以阅读之前的那篇文章&#xff1a;社交媒体中的“点赞”“喜欢”是如何存储在数据库中的…

ubuntu开机自启动

ubuntu开机自启动 1、建一个test.sh脚本&#xff0c;并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件&#xff08;sudo vim /etc/systemd/system/rc-local.service&#xff09;&#xf…

Python post请求发送的是Form Data的类型

常规的Form Data 大部分的Form Data 可以直接都是可以通过正常的post请求进行提交的 import requestsheaders {自己设置的请求头键: 自己设置的请求头键,Content-Type: 网页接受的数据类型 }form_data {对应的键1&#xff1a;对应的值1,对应的键2&#xff1a;对应的值2, }r…

【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式

文章目录 1. 右值引用和移动语义1.1 左值引用和右值引用1.2 左值引用和右值引用的比较1.3右值引用的使用场景和意义1.4 左值引用和右值引用的深入使用场景分析1.5 完美转发1.5.1 万能引用1.5.2 完美转发 2. 新的类功能2.1 默认成员函数2.2 类成员变量初始化2.3 强制生成默认函数…

(链表) 剑指 Offer 25. 合并两个排序的链表 ——【Leetcode每日一题】

❓剑指 Offer 25. 合并两个排序的链表 难度&#xff1a;简单 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 …

畅捷通TPlus DownloadProxy.aspx 存在任意文件读取漏洞 附POC

文章目录 畅捷通TPlus DownloadProxy.aspx 存在任意文件读取漏洞 附POC1. 畅捷通TPlus DownloadProxy.aspx 简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 畅捷通TPlus DownloadProxy.aspx 存在任意文件读取漏洞 附POC 免责声明&#x…

Unity Profiler或UPR连接WebGL应用出错

问题 在使用Unity Build出WebGL应用进行性能测试的时候&#xff0c;勾选上了 Development Build和Autoconnect Profiler&#xff0c;分别使用Profiler和UPR进行测试 现象 使用Profiler测试时&#xff0c;就收到几帧&#xff0c;然后就没了 使用UPR进行测试时&#xff0c;在…

javascript 7种继承-- 寄生组合式继承(6)

文章目录 概要继承的进化史技术名词解释寄生组合式继承案列分析源代码解析效果图调用父类构造函数次数正常数据也不会混乱 小结 概要 这阵子在整理JS的7种继承方式&#xff0c;发现很多文章跟视频&#xff0c;讲解后都不能让自己理解清晰&#xff0c;索性自己记录一下&#xf…

RNN架构解析——LSTM模型

目录 LSTMLSTM内部结构图 Bi-LSTM实现 优点和缺点 LSTM LSTM内部结构图 Bi-LSTM 实现 优点和缺点

SpringMVC 有趣的文件

文章目录 SpringMVC 文件上传--文件下载-ResponseEntity<T>文件下载-ResponseEntity<T>案例演示代码应用小结完成测试(页面方式) SpringMVC 文件上传基本介绍应用实例需求分析/图解代码实现完成测试( 页面方式) SpringMVC 文件上传–文件下载-ResponseEntity 文件…