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

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 layerprint(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 = 20output_dim = 5# Create a simple MLP with 2 hidden dense layersmodel = 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 summaryprint(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 layerdense_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 layerweights, biases = dense_layer.get_weights()# Print the initial weights and biasesprint("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 1new_biases = tf.zeros_like(biases)  # Set all biases to 0# Set the modified weights and biases back to the dense layerdense_layer.set_weights([new_weights, new_biases])# Access the weights and biases again after modificationweights, biases = dense_layer.get_weights()# Print the modified weights and biasesprint("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 biasesprint("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.mzph.cn/news/9459.shtml

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

相关文章

pytorch学习——多层感知机

一.感知机 感知机——神经网络基本单元,最简单的深度网络称为多层感知机。多层感知机由多层神经元组成,每一层与它上一层相连,从中接收输入, 同时每一层也与它的下一层相连,影响当前层的神经元。 解释:如果…

生态系统景观指数-聚集度指数AI计算

景观指数是景观生态学的常见指标,可用于不同生态系统的特征识别。景观指数是反映景观结构与空间格局的定量指标,目前已成为景观生态学领域常用的分析景观格局、度量空间异质性的重要方法。不同水平下的指数结果往往代表不同含义,应在把握指数…

决策树学习

决策树学习 决策树决策树基础适用决策树学习的经典目标问题样本的表示训练样本决策树的概念发展历史 经典决策树算法ID3算法属性选择和节点混杂度(Impurity)ID3 Q1: 哪个属性是最佳属性?当前最佳属性节点选择熵(Entropy&#xff0…

如何高效实现文件传输:小文件采用零拷贝、大文件采用异步io+直接io

一般会如何实现文件传输? 服务器提供文件传输功能,需要将磁盘上的文件读取出来,通过网络协议发送到客户端。如果需要你自己编码实现这个文件传输功能,你会怎么实现呢? 通常,你会选择最直接的方法&#xf…

交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

1.交叉编译是什么,为什么要交叉编译 编译:在一个平台上生成在该平台上的可执行代码交叉编译:在一个平台上生成在另一个平台上的可执行代码交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境kei…

AT15透明屏有哪些特点?

AT15透明屏是一种新型的显示技术,它采用了透明材料制成的屏幕,可以实现透明显示效果。这种屏幕可以广泛应用于各种领域,如商业广告、展览展示、智能家居等。 AT15透明屏的特点之一是其高透明度。 由于采用了透明材料制成,AT15透明…

深度对话|Sui资产所有权如何让游戏体验更好

近日,我们采访了Mysten Labs的游戏产品总监Bill Allred,共同探讨了为什么Sui非常适合游戏。他分享了对Sui关键创新的看法,以及它为游戏开发者带来的价值,Sui的关键创新帮助开发者将他们所想象的游戏变为现实。 你能谈谈某些游戏的…

【微服务系统设计】系统设计基础:速率限制器

什么是速率限制器? 速率限制是指防止操作的频率超过定义的限制。在大型系统中,速率限制通常用于保护底层服务和资源。速率限制一般在分布式系统中作为一种防御机制,使共享资源能够保持可用性。 速率限制通过限制在给定时间段内可以到达您的 A…

vue解决跨域访问问题(个人学习笔记六)

目录 友情提醒第一章、跨越问题解决1.1)什么是跨域问题?1.2)第一种解决方式:后端设置允许跨域访问1.3)第二种解决方式:前端配置代理 第二章、配置代理服务器2.1)配置简单代理服务器2.2&#xff…

端口复用与重映射

端口复用和重映射 STM32F1有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 大家都知道,MCU都有串口…

kotlin 编写一个简单的天气预报app(一)

使用Android Studio开发天气预报APP 今天我来分享一下如何使用Android Studio开发一个天气预报APP。在文中,我们将使用第三方接口获取实时天气数据,并显示在APP界面上。 步骤一:创建新项目 首先,打开Android Studio并创建一个新…

MySQL 中一条 SQL 的查询与更新

MySQL 中一条 SQL 的查询与更新 1 SQL 的查询1.1 MySQL 的逻辑架构图1.2 连接器1.3 查询缓存1.4 分析器1.5 优化器1.6 执行器 2 SQL 的更新2.1 redo log(重做日志)2.2 binlog(归档日志)2.3 redo log 和 binlog 日志的差异2.4 示例…

React 中 {} 的应用

列表渲染: 1.使用数组的 map 方法(因为map 可以映射) 2、列表要添加 key 属性,值要唯一 // 导入 // 用来获取 dom元素 import { createRoot } from "react-dom/client";// 内容 const contentArr [{ id: 1, name: &…

提高公文写作效率,可以采用模板和样例来辅助写作

采用模板和样例是提高公文写作效率的一种常见方法。 模板是指已经制作好的公文格式和结构模板,可以根据模板来组织和排版自己的文章,以减少排版时间和排版错误。常见的模板包括各类公文格式,例如通知、报告、请示等等。在使用模板的过程中&am…

GPT4ALL私有化部署 01 | Python环境

进入以下链接: https://www.python.org/downloads/release/python-3100/ 滑动到底部 选择你系统对应的版本,如果你是win,那么大概率是win-64bit 有可能你会因为网络的问题导致下载不了,我提供了 链接 接着只需要打开 等待…

Mac 快速生成树形项目结构目录

我这里使用的是通过包管理 Homebrew安装形式。没有安装的话可以自行搜索 Homebrew 安装方式 brew install tree直接到项目的根目录执行 tree 命令 tree 效果如下: or : tree -CfL 3效果如下:

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射? 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后,直线仍然是直线;平行性是指 图像在完成仿射变换后,平行线仍然是平行线。…

SQL注入--题目

联合查询注入: bugku-这是一个神奇的登录框 手工注入: 点吧,输入0’发现还是: 输入0" 发现报错: 确定可以注入,判断字段有多少个 0"order by 1,2,3# 发现: 说明有两列。 输入 0&qu…

【论文阅读22】Label prompt for multi-label text classification

论文相关 论文标题:Label prompt for multi-label text classification(基于提示学习的多标签文本分类) 发表时间:2023 领域:多标签文本分类 发表期刊:Applied Intelligence(SCI二区&#xff0…