【机器学习之深度学习】神经元、层的基本概念,神经网络以及神经元与线性回归和逻辑回归的相似之处

news2024/11/24 13:56:44

引言

神经元、层和神经网络是深度学习模型的核心组成部分,它们共同工作,使得深度学习能够处理复杂的数据和任务。通过叠加多个层,可以构建出能够学习复杂函数的深度神经网络

一、神经元和层

深度学习中的神经元和层是构建复杂预测模型的基础组件。以下是关于它们的一些基本概念:

1.1 神经元(Neuron)

1.1.1 定义

神经元是深度学习模型的基本单元,它模拟人脑中的神经元。在数学上,神经元接收输入,通过权重和偏置进行转换,并应用一个激活函数来产生输出

1.1.2 功能

每个神经元执行以下操作:

  1. 加权求和:计算输入向量的加权和(输入值乘以对应的权重,然后求和)
  2. 添加偏置:将一个偏置项加到加权求和的结果上
  3. 激活函数:应用一个非线性函数(激活函数)到上述结果上,以产生神经元的输出
  • 激活函数:常用的激活函数包括SigmoidReLU(Rectified Linear Unit)、Tanh等。激活函数引入了非线性因素,使得神经网络能够学习和模拟复杂函数

1.2 层(Layer)

1.2.1 定义

层是由多个神经元组成的集合,它在神经网络中执行特定的变换

1.2.2 类型

  1. 输入层(Input Layer):接收外部数据输入的层
  2. 隐藏层(Hidden Layer):位于输入层和输出层之间的层,可以进行特征学习和表示转换
  3. 输出层(Output Layer):产生最终预测或分类结果的层
  • 全连接层(Dense Layer):层中的每个神经元都与前一层的所有神经元相连

1.3 神经元和层的关系

  • 在深度学习中,神经元通过层组织起来,形成神经网络(Neural Network)
  • 每一层都是前一层的输出和后一层的输入,层与层之间通过权重(weights)和偏置(biases)连接
  • 神经网络通过前向传播(Forward Propagation)来计算输出,通过反向传播(Back Propagation)来更新权重和偏置,从而学习数据中的模式

1.4 应用

  • 在深度学习模型中,通过叠加多个层,可以构建出能够学习复杂函数的深度神经网络(Deep Neural Networks, DNN)
  • 这种结构在图像识别、语音识别、自然语言处理等领域表现出色,能够处理大量的数据并提取出有用的特征

1.5 总结

神经元和层是深度学习模型的核心组成部分,它们共同工作,使得深度学习能够处理复杂的数据和任务

二、探索神经元/单元和层的内部工作原理

在这个实验中,我们将探索神经元/单元和层的内部工作原理。并且与已经学到的回归/线性模型和逻辑模型进行对比。实验将介绍Tensorflow,并展示这些模型如何在那个框架中实现

在这里插入图片描述

2.1 包

2.1.1 Tensorflow和Keras

Tensorflow是由谷歌开发的一个机器学习包。2019年,谷歌将Keras集成到Tensorflow中,并发布了Tensorflow 2.0Keras是由François Chollet独立开发的框架,它为Tensorflow提供了一个简单、以层为中心的接口

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras import Sequential
from tensorflow.keras.losses import MeanSquaredError, BinaryCrossentropy
from tensorflow.keras.activations import sigmoid
from lab_utils_common import dlc
from lab_neurons_utils import plt_prob_1d, sigmoidnp, plt_linear, plt_logistic
plt.style.use('./deeplearning.mplstyle')
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)

2.2 无激活函数的神经元 - 回归/线性模型

2.2.1 数据集

我们将使用课程1中的一个例子,对房价进行线性回归

X_train = np.array([[1.0], [2.0]], dtype=np.float32)           #(以1000平方英尺为单位的大小)
Y_train = np.array([[300.0], [500.0]], dtype=np.float32)       #(以1000美元为单位的房价)
fig, ax = plt.subplots(1,1)
ax.scatter(X_train, Y_train, marker='x', c='r', label="Data Points")
ax.legend( fontsize='xx-large')
ax.set_ylabel('Price (in 1000s of dollars)', fontsize='xx-large')
ax.set_xlabel('Size (1000 sqft)', fontsize='xx-large')
plt.show()

输出结果:
在这里插入图片描述

2.2.3 回归/线性模型

由无激活函数的神经元实现的函数与课程1中的线性回归相同:
f w , b ( x ( i ) ) = w ⋅ x ( i ) + b ( 1 ) f_{w,b}(x(i)) = w \cdot x(i) + b \quad (1) fw,b(x(i))=wx(i)+b(1)
我们可以定义一个只有一个神经元或单元的层,并与熟悉的线性回归函数进行比较

linear_layer = tf.keras.layers.Dense(units=1, activation = 'linear', )
# 查看权重
linear_layer.get_weights()

输出结果:
在这里插入图片描述

还没有权重,因为权重还没有实例化。让我们尝试一下模型在X_train中的一个例子上。这将触发权重的实例化。注意,层的输入必须是2-D的,所以我们将其重塑。

a1 = linear_layer(X_train[0].reshape(1,1))
print(a1)

输出结果:
在这里插入图片描述

结果是形状为(1,1)的张量(数组的另一种名称),即一个条目
现在让我们看看权重和偏置。这些权重是随机初始化为小数,偏置默认初始化为零

w, b= linear_layer.get_weights()
print(f"w = {w}, b={b}")

输出结果:
在这里插入图片描述

具有单个输入特征的线性回归模型(1)将有一个权重和一个偏置。这与我们上面的linear_layer相匹配
权重是随机初始化的,所以让我们将它们设置为一个已知的值

set_w = np.array([[200]])
set_b = np.array([100])
# set_weights接受一个numpy数组列表
linear_layer.set_weights([set_w, set_b])
print(linear_layer.get_weights())

输出结果:
在这里插入图片描述

让我们比较方程(1)和层输出

a1 = linear_layer(X_train[0].reshape(1,1))
print(a1)
alin = np.dot(set_w,X_train[0].reshape(1,1)) + set_b
print(alin)

输出结果:
在这里插入图片描述

它们产生相同的值,我们可以使用我们的线性层来预测我们的训练数据

prediction_tf = linear_layer(X_train)
prediction_np = np.dot( X_train, set_w) + set_b
plt_linear(X_train, Y_train, prediction_tf, prediction_np)

输出结果:
在这里插入图片描述

2.3 带Sigmoid激活函数的神经元

由带Sigmoid激活函数的神经元/单元实现的函数与课程1中的逻辑回归相同:
f w , b ( x ( i ) ) = g ( w x ( i ) + b ) ( 2 ) f_{w,b}(x(i)) = g(w x(i) + b) \quad (2) fw,b(x(i))=g(wx(i)+b)(2)
其中
g ( x ) = sigmoid ( x ) g(x) = \text{sigmoid}(x) g(x)=sigmoid(x)
让我们将 w w w b b b设置为一个已知的值,并检查模型

2.3.1 数据集

我们将使用课程1中的一个例子,进行逻辑回归

X_train = np.array([0., 1, 2, 3, 4, 5], dtype=np.float32).reshape(-1,1)  # 2-D矩阵
Y_train = np.array([0,  0, 0, 1, 1, 1], dtype=np.float32).reshape(-1,1)  # 2-D矩阵
pos = Y_train == 1
neg = Y_train == 0
X_train[pos]

输出结果:
在这里插入图片描述

pos = Y_train == 1
neg = Y_train == 0
fig,ax = plt.subplots(1,1,figsize=(4,3))
ax.scatter(X_train[pos], Y_train[pos], marker='x', s=80, c = 'red', label="y=1")
ax.scatter(X_train[neg], Y_train[neg], marker='o', s=100, label="y=0", facecolors='none', 
              edgecolors=dlc["dlblue"],lw=3)
ax.set_ylim(-0.08,1.1)
ax.set_ylabel('y', fontsize=12)
ax.set_xlabel('x', fontsize=12)
ax.set_title('单变量图')
ax.legend(fontsize=12)
plt.show()

输出结果:
在这里插入图片描述

2.3.2 逻辑神经元

我们可以通过添加Sigmoid激活函数来实现一个’逻辑神经元’。然后,神经元的函数由上面的(2)式描述。
这一部分将创建一个包含我们的逻辑层的Tensorflow模型,以展示创建模型的一种替代方法。Tensorflow通常用于创建多层模型。Sequential模型是构建这些模型的一个方便方式。

model = Sequential(
    [
        tf.keras.layers.Dense(1, input_dim=1,  activation = 'sigmoid', name='L1')
    ]
)
model.summary()

输出结果:
在这里插入图片描述

model.summary()显示了模型的层和参数数量。这个模型中只有一个层,而且这个层只有一个单元。这个单元有两个参数,𝑤和𝑏

logistic_layer = model.get_layer('L1')
w,b = logistic_layer.get_weights()
print(w,b)
print(w.shape,b.shape)

输出结果:
在这里插入图片描述
让我们将权重和偏置设置为一个已知的值

set_w = np.array([[2]])
set_b = np.array([-4.5])
# set_weights接受一个numpy数组列表
logistic_layer.set_weights([set_w, set_b])
print(logistic_layer.get_weights())

输出结果:
在这里插入图片描述
让我们比较方程(2)和层输出。

a1 = model.predict(X_train[0].reshape(1,1))
print(a1)
alog = sigmoidnp(np.dot(set_w,X_train[0].reshape(1,1)) + set_b)
print(alog)

输出结果:
在这里插入图片描述

它们产生相同的值,可以使用我们的逻辑层和NumPy模型来预测我们的训练数据

plt_logistic(X_train, Y_train, model, set_w, set_b, pos, neg)

输出结果:
在这里插入图片描述

上面的阴影反映了Sigmoid的输出,其值在0到1之间变化

2.4 总结

  • 已构建了一个非常简单的神经网络
  • 已经探索神经元与线性回归和逻辑回归的相似之处

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

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

相关文章

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法(一)修改颜色(二)修改大小(三)换行(四&…

SQL注入实例(sqli-labs/less-15)

0、初始页面 1、确定闭合符号 确定符号的闭合 2、爆库名 python脚本爆库名 def inject_database(url):name for i in range(1,20):low 32high 128while low < high:mid (low high) // 2payload "-1 or ascii(substr(database(),%d,1))>%d # " %(i,mid…

从今天开始深入学习 SQL 优化

SQL优化 .SQL优化12.1 selet具体字段 12.2 多用limit 12.3 用union all替换 union 12.4 优化group by 12.5 优化order by 12.6 小表驱动大表 12.7 字段类型使用合理 12.8 优化linit分页 12.9 exist& in的合理利用 12.10 join关联的表不宜过多 12.11 deletein自查询不走索引…

学习记录——day29 网络编程

目录 一、网络编程引入 1.1、IPC通信方式 1&#xff09;内核提供&#xff1a; 无名管道 有名管道 信号 2&#xff09;system V: 消息队列 共享内存 信号量集 1.2、网络通信使用缘由 二、网络发展阶段 2.1 APRAnet阶段 2.2 TCP/IP两个协议阶段…

Java收发邮件笔记

1 关于邮箱的前置知识 1.1 概念部分 邮箱服务器和协议是电子邮件系统中不可或缺的两个组成部分&#xff0c;它们共同确保了电子邮件的顺利发送、接收和管理。 1.1.1 服务器和协议 邮箱服务器 比如常见的QQ邮箱,网易邮箱。 邮箱服务器是一种负责电子邮件收发管理的计算机系…

Rust学习---Hello World

编写 Rust 程序 1.程序文件后缀名: rs 2.文件命名规范:hello_world.rs 3.(例子) 使用命令创建项目&#xff0c;命名为"hello world" 打开 cmd 输入: mkdir hello_world cd hello_world 新建文件 main.rs编译与运行 Rust 程序 1.编译:rustc main.rs&#xff0c;…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件&#xff0c;用于分析工程内的资源使用情况&#xff0c;资源大小&#xff0c;分析资源依赖关系&#xff0c;可以用来清理项目中未使用的资源。尤其是项目较大时&#xff0c;删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

Linux 进程概念

Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统&#xff08;Operator System&#xff09;概念作用认识为什么要有操作系统&#xff1f; 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…

colResizable插件实现网页中表格列宽自定义

需求&#xff1a;页面上每个字段的列宽&#xff0c;可以通过页面拖动的形式进行调整。 解决方法&#xff1a;使用jQuery的一个插件&#xff0c;名称叫 colResizable&#xff0c;可以实现。 插件官网 colResizable – 可调整大小的列和表 (bacubacu.com) 说明&#xff1a; 该…

汽车线路保护设计

汽车线路保护设计 线路保护就是要对导线加以保护&#xff0c;兼顾对回路电器件的保护。保护装置主要有熔断器、断路器和易熔线等。 保险、继电器、导线、电瓶的选择和计算 熔断器的选取原则 发动机ECU、ABS等对整车性能及安全影响大&#xff0c;另外&#xff0c;易受其他用…

从零安装pytorch并在pycharm中使用

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种&#xff0c;二者在实现理念上有一定区别&#xff0c;pytorch和人的思维模式与变成习惯更像&#xff0c;而tensorflow则是先构建整体结构&#xff0c;然后整体运行&#xff0c;开发调试过程较为繁…

算法工程师必知必会的数学基础之微积分上

系列文章&#xff1a; 第一篇&#xff1a;算法工程师必知必会的数学基础之线性代数第二篇&#xff1a;算法工程师必知必会的数学基础之微积分上&#xff08;本文&#xff09;。 文章目录 2. 微积分2.1 极限&#xff08;Limits&#xff09;和 连续性&#xff08;Continuity&…

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况&#xff0c;可以通过这种想法得到&#xff1a; P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…

xxljob--入门使用

1.简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 2.下载 网址&#xff1a;xxljob 3. 导入数据库 3.1请下载项目源码并解压&#xff0c;获取 “调…

ElasticSearch(九)— 聚集查询2

一、 范围分桶聚集 如果使用 SQL 语言类比&#xff0c;桶型聚集与 SQL 语句中的 group by 子句极为相似。桶型聚集(Bucket Aggregation)是 Elasticsearch 官方对这种聚集的叫法&#xff0c;它起的作用是根据条件对文档进行分组。 可以将这里的桶理解为分组的容器&#xff0c;…

git commit 提交报错

当使用git cimmit -m "XXX" 将暂存区文件提交到仓库区时出现以下错误信息&#xff1a; 原因&#xff1a;开启了 eslint 校验 只要跳过 eslint 校验就可以了&#xff0c;即加 --no-verify 即可解决 git commit --no-verify -m "XXX"

太极图形学——弹性物体仿真 1

1.仿真基础&#xff0c;时间和空间的离散化 渲染对于物体的展现来说是一件很重要的事 但除了渲染之外&#xff0c;还需要物理来控制&#xff0c;形成动画 弹性物体的仿真实际上非常重要&#xff0c;特别是对于头发&#xff0c;衣物的仿真&#xff0c;虚拟手术中软组织的仿真 仿…

JupyterNotebook添加Anaconda中已有的虚拟环境

比如&#xff0c;在Acaconde中存在一个我已经配置好的虚拟环境pose,现在我想在Jupyter中使用它 那么可以使用ipython kernel install --user --name 你要添加的环境 添加到Jupyter中。 对于Jupyter中已有的代码&#xff0c;就可以在Kernel - chanage kernel中改变内核。

大模型+XDR!打开网络安全攻防演练新范式!

网络安全领域面临着日益复杂的挑战&#xff0c;外部攻击与内部安全威胁交织的双重压力。技术革新成为筑牢安全防线的关键&#xff0c;随着新一代技术的崛起&#xff0c;特别是大数据与人工智能的深度融合&#xff0c;引领着网络安全进入全新阶段。 通过构建网络安全大模型&…