吴恩达2022机器学习专项课程C2W2:实验Relu激活函数

news2024/11/17 3:49:47

目录

  • 代码修改
    • 1.Activation
    • 2.Dense
    • 3.代码顺序
  • 新的内容
    • 1.总结上节课内容
    • 2.展示ReLU激活函数的好处
    • 3.结论
  • 代码案例一
  • 代码案例二
    • 1.构建数据集
    • 2.构建模型
  • 2D
    • 1.构建数据集
    • 2.模型预测
    • 3.扩展

代码修改

1.Activation

(1)需要添加代码from tensorflow.keras import activations。然后在from tensorflow.keras.layers import Dense, LeakyReLU后添加Activation。
在这里插入图片描述
(2)然后在如下代码中这样修改。原有的写法已被弃用,这是新的写法。
在这里插入图片描述

2.Dense

(1)注释代码是原有代码。我们需要改成注释下方的写法。因为现在的TF版本中,Dense层的weights参数不被直接接受。需要先bulid初始化层的权重,这里的None不确定样本数量,用于占位,1表示样本的特征为1个。
在这里插入图片描述

(2)同理,这里也要改。
在这里插入图片描述

3.代码顺序

(1)这是错误的顺序,model未定义。

在这里插入图片描述

(2)这是正确的顺序,需要把使用model的预测放在构建model之后。

在这里插入图片描述

新的内容

1.总结上节课内容

(1)神经元的激活值awareness不在是0或1,是任意非负数。而Sigmoid函数是一种常用于二分类问题的激活函数,它能够输出一个介于0和1之间的值,适合表示概率或开关状态。 因此需要ReLU激活函数,它在输入大于0时提供线性输出,这意味着输出与输入成正比,提供了一个平滑的连续变化。此外,它还有一个"关闭"范围,其中输出为零。 这是ReLU的一个关键特性,即当输入小于0时,ReLU的输出为0,这个特性被称为"关闭",也使它成为了非线性激活函数。

在这里插入图片描述

2.展示ReLU激活函数的好处

(1)我们需要构建神经网络,它模拟一个分段线性的目标函数,目的是理解ReLU如何开启和关闭函数的。这里神经网络的隐藏层都使用ReLU激活函数。

在这里插入图片描述

(2)左图中,神经元1和神经元2的参数已经设置好,神经元0的参数也已经固定。神经元0负责第一段的走势,神经元2负责第二段的走势,神经元3负责第三段的走势。由于每个神经元的参数都是合适的,因此横轴x代入神经元预测出的每个分段的走势,都符合目标(分段线性函数)走势。

在这里插入图片描述
(3)然后再看右图,右图的两个线条,蓝色和粉色,是分别展示了每个神经元的线性激活函数的输出z和ReLU激活函数的输出a。

  • 第一个神经元使用ReLU的输出走势在x[0,1]区间,之后的输出都为0,符合左图的第一段,即神经元0不会影响x大于1之后的走势。
  • 第二个神经元使用ReLU的输出走势在x大于1之后,之前的输出都为0,符合左图的第二段,即神经元1不会影响x小于1之前的走势。
  • 第三个神经元使用ReLU的输出走势在x大于2之后,之前的输出都为0,符合左图的第三段,即神经元2不会影响x小于2之前的走势。

在这里插入图片描述

3.结论

如果神经元没有激活函数,或使用不具备这种特性的激活函数,则每个神经元的走势都会互相影响,无法达到拼接的效果。因此,ReLU激活函数的“关闭”(输出为0),使模型能够拼接线性段来模拟复杂的非线性函数。

代码案例一

(1)首先展示3种激活函数的输入和输出的关系。

在这里插入图片描述

(2)然后自定义一个数据集,并绘制数据集。

在这里插入图片描述
(3)先设置一个神经层d10,神经元为1个,激活函数为linear,然后计算神经层的输出z10(wx+b),在使用ReLU得出层激活值a10。

在这里插入图片描述

(4)左边的图是数据集,中间的图表示使用数据集X的情况下,线性激活的表现,能够看到无法拟合数据集的输出。最右边的图是使用ReLU激活计算的值,能够较好的拟合数据集的输出。

在这里插入图片描述

(4)下面的内容和上面也是一个过程,只是更换一下数据集的内容。

在这里插入图片描述

(5)小结:整体过程就是先自定义一个数据集,然后绘制出来。在把数据集中的X代入到线性激活和ReLU激活,分别看看这两个激活函数计算出的预测值,是否匹配数据集里的目标变量y。在这个案例中,线性激活不匹配,而ReLU匹配。

代码案例二

1.构建数据集

(1)左图是新建的数据集,右侧是ReLU的预测值以及数据集,直观地看到神经网络较好的拟合了数据集。

在这里插入图片描述

(2)这是新建数据集中的x。

在这里插入图片描述

(3)这段是单独绘制的,实现的功能和上面的一致。

在这里插入图片描述

2.构建模型

(1)构建3个层,分别为d10,d11,Dense。两个Activation是激活函数层,这里的Activation设置为ReLU激活函数,也就是d10的激活值用于ReLU计算并输出,然后d11的激活值用于ReLU计算并输出。而模型的输出层,是线性激活,也就是最后一个Dense。

在这里插入图片描述

(2)可以看到,如果按上述方法构建神经网络,神经网络的对于输入向量x,预测都为1,无法匹配目标变量。

在这里插入图片描述

(3)如果按这种方式构建,两个层,每层一个神经元,则神经网络的预测都为0.37,也无法匹配目标变量。

在这里插入图片描述
在这里插入图片描述

(4)获取该神经网络的参数,由于我们没有手动设置参数,因此在传入输入向量x之后,这些参数都是神经网络自动初始化的,第一层参数为w=-0.14,b=0。第二层的参数为w=0.9,b=0.37。

在这里插入图片描述

(5)手动设置层的参数,继续训练,然后重置第2层的参数。

在这里插入图片描述

(6)红色线条表示伸进网络的预测,由于第一层是ReLU,此时w为负数,b为正数,因此z越来越小,ReLU的激活值越来越小,等到z为负数,ReLU的激活值就都为0,而第二层是线性激活,权重为1,偏置为0,因此第二层等于原封不动的把第一层的激活输出。

在这里插入图片描述
(7)小结:通过手动设置神经网络的权重和偏置,可以控制神经网络的输出趋势。在本例中,通过设置特定的w,b使得神经网络的输出呈现出 ReLU 函数的趋势。

2D

1.构建数据集

(1)导入库

在这里插入图片描述

(2)编写绘制图的函数

在这里插入图片描述

(3)构建数据集并生成图,X有300个训练样本,每个样本2个特征,图片的横轴纵轴分别对应2个特征的值,使用sqrt计算2个特征,小于0.6为true对应蓝色,大于等于0.6对应false,对应绿色。

在这里插入图片描述

2.模型预测

(1)构建并训练模型。

在这里插入图片描述

(2)使用模型预测,大于0.5为true,对应蓝色,小于0.5为false,对应绿色。

在这里插入图片描述
(3)小结:通过比较模型预测的决策边界和实际数据的分布,可以直观地看到模型的分类效果和准确性。

3.扩展

下面代码对多个聚类算法在同一数据集上的表现进行了可视化,展示了不同算法的聚类效果和运行时间。这对比有助于理解不同算法的优缺点及其在不同类型数据上的性能。(聚类算法是无监督学习部分的,我不太清楚此处放这段代码的目的,如果有大佬可以分析一波)

import time
import warnings

import numpy as np
import matplotlib.pyplot as plt

from sklearn import cluster, datasets, mixture
from sklearn.neighbors import kneighbors_graph
from sklearn.preprocessing import StandardScaler
from itertools import cycle, islice

np.random.seed(0)

# ============
# Generate datasets. We choose the size big enough to see the scalability
# of the algorithms, but not too big to avoid too long running times
# ============
n_samples = 500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.5, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
no_structure = np.random.rand(n_samples, 2), None

# Anisotropicly distributed data
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
transformation = [[0.6, -0.6], [-0.4, 0.8]]
X_aniso = np.dot(X, transformation)
aniso = (X_aniso, y)

# blobs with varied variances
varied = datasets.make_blobs(
    n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state
)

# ============
# Set up cluster parameters
# ============
plt.figure(figsize=(9 * 2 + 3, 13))
plt.subplots_adjust(
    left=0.02, right=0.98, bottom=0.001, top=0.95, wspace=0.05, hspace=0.01
)

plot_num = 1

default_base = {
    "quantile": 0.3,
    "eps": 0.3,
    "damping": 0.9,
    "preference": -200,
    "n_neighbors": 3,
    "n_clusters": 3,
    "min_samples": 7,
    "xi": 0.05,
    "min_cluster_size": 0.1,
}

datasets = [
    (
        noisy_circles,
        {
            "damping": 0.77,
            "preference": -240,
            "quantile": 0.2,
            "n_clusters": 2,
            "min_samples": 7,
            "xi": 0.08,
        },
    ),
    (
        noisy_moons,
        {
            "damping": 0.75,
            "preference": -220,
            "n_clusters": 2,
            "min_samples": 7,
            "xi": 0.1,
        },
    ),
    (
        varied,
        {
            "eps": 0.18,
            "n_neighbors": 2,
            "min_samples": 7,
            "xi": 0.01,
            "min_cluster_size": 0.2,
        },
    ),
    (
        aniso,
        {
            "eps": 0.15,
            "n_neighbors": 2,
            "min_samples": 7,
            "xi": 0.1,
            "min_cluster_size": 0.2,
        },
    ),
    (blobs, {"min_samples": 7, "xi": 0.1, "min_cluster_size": 0.2}),
    (no_structure, {}),
]

datasets = [
    (no_structure, {}),
]

for i_dataset, (dataset, algo_params) in enumerate(datasets):
    # update parameters with dataset-specific values
    params = default_base.copy()
    params.update(algo_params)

    X, y = dataset

    # normalize dataset for easier parameter selection
    X = StandardScaler().fit_transform(X)

    # estimate bandwidth for mean shift
    bandwidth = cluster.estimate_bandwidth(X, quantile=params["quantile"])

    # connectivity matrix for structured Ward
    connectivity = kneighbors_graph(
        X, n_neighbors=params["n_neighbors"], include_self=False
    )
    # make connectivity symmetric
    connectivity = 0.5 * (connectivity + connectivity.T)

    # ============
    # Create cluster objects
    # ============
    ms = cluster.MeanShift(bandwidth=bandwidth, bin_seeding=True)
    two_means = cluster.MiniBatchKMeans(n_clusters=params["n_clusters"])
    ward = cluster.AgglomerativeClustering(
        n_clusters=params["n_clusters"], linkage="ward", connectivity=connectivity
    )
    spectral = cluster.SpectralClustering(
        n_clusters=params["n_clusters"],
        eigen_solver="arpack",
        affinity="nearest_neighbors",
    )
    dbscan = cluster.DBSCAN(eps=params["eps"])
    optics = cluster.OPTICS(
        min_samples=params["min_samples"],
        xi=params["xi"],
        min_cluster_size=params["min_cluster_size"],
    )
    affinity_propagation = cluster.AffinityPropagation(
        damping=params["damping"], preference=params["preference"], random_state=0
    )
    average_linkage = cluster.AgglomerativeClustering(
        linkage="average",
        affinity="cityblock",
        n_clusters=params["n_clusters"],
        connectivity=connectivity,
    )
    birch = cluster.Birch(n_clusters=params["n_clusters"])
    gmm = mixture.GaussianMixture(
        n_components=params["n_clusters"], covariance_type="full"
    )

    clustering_algorithms = (
        ("MiniBatch\nKMeans", two_means),
        ("Affinity\nPropagation", affinity_propagation),
        ("MeanShift", ms),
        ("Spectral\nClustering", spectral),
        ("Ward", ward),
        ("Agglomerative\nClustering", average_linkage),
        ("DBSCAN", dbscan),
        ("OPTICS", optics),
        ("BIRCH", birch),
        ("Gaussian\nMixture", gmm),
    )

    for name, algorithm in clustering_algorithms:
        t0 = time.time()

        # catch warnings related to kneighbors_graph
        with warnings.catch_warnings():
            warnings.filterwarnings(
                "ignore",
                message="the number of connected components of the "
                + "connectivity matrix is [0-9]{1,2}"
                + " > 1. Completing it to avoid stopping the tree early.",
                category=UserWarning,
            )
            warnings.filterwarnings(
                "ignore",
                message="Graph is not fully connected, spectral embedding"
                + " may not work as expected.",
                category=UserWarning,
            )
            print(X.shape,algorithm)
            algorithm.fit(X)

        t1 = time.time()
        if hasattr(algorithm, "labels_"):
            y_pred = algorithm.labels_.astype(int)
        else:
            y_pred = algorithm.predict(X)

        plt.subplot(len(datasets), len(clustering_algorithms), plot_num)
        if i_dataset == 0:
            plt.title(name, size=18)

        colors = np.array(
            list(
                islice(
                    cycle(
                        [
                            "#377eb8",
                            "#ff7f00",
                            "#4daf4a",
                            "#f781bf",
                            "#a65628",
                            "#984ea3",
                            "#999999",
                            "#e41a1c",
                            "#dede00",
                        ]
                    ),
                    int(max(y_pred) + 1),
                )
            )
        )
        # add black color for outliers (if any)
        colors = np.append(colors, ["#000000"])
        plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])

        plt.xlim(-2.5, 2.5)
        plt.ylim(-2.5, 2.5)
        plt.xticks(())
        plt.yticks(())
        plt.text(
            0.99,
            0.01,
            ("%.2fs" % (t1 - t0)).lstrip("0"),
            transform=plt.gca().transAxes,
            size=15,
            horizontalalignment="right",
        )
        plot_num += 1

plt.show()

在这里插入图片描述

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

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

相关文章

5.小程序页面布局 - 记账页面(名目布局、绘制键盘、引用picker时间选择组件)

文章目录 1. 小程序页面布局 - 记账页面1.1. 记账页面的布局1.1.1. 样例1.1.2. 页面解构1.1.3. 内容布局的实现1.1.3.1. 填坑(display:flex)1.1.3.2. 突破(display:grid)1.1.3.3. 应用 1.1.4. 点击图片加背景色1.1.5. 添加一个键盘1.1.6. 日期选择组件 1. 小程序页面布局 - 记账…

Liunx基本指令以及权限(个人笔记)

Linux指令和权限 1.指令1.1ls指令1.2pwd命令1.3cd指令1.4touch指令1.5mkdir指令1.6rm指令1.7man指令1.8cp指令1.9mv指令1.10cat指令1.11less指令1.12head指令1.13tail指令1.14date显示1.15Cal指令1.16find指令1.17grep指令1.18zip/unzip指令1.19tar指令1.20bc指令1.21uname -r指…

SQLServer表变量

表变量是本地变量的一种特殊类型,它有助于临时存储数据; 要声明表变量,使用declare,而局部变量的名称必须以符号开头; TABLE关键字指定此变量是表变量,然后还要定义列名和数据类型; 下面定义一个表变量&#xff0c…

光伏项目怎么做预算?

随着可再生能源行业的蓬勃发展,光伏行业也得到了扩张。许多想要加入光伏项目投资的人,都在为怎样为项目做预算而苦恼,今天我就来跟大家分析下可以怎么做。 一、了解市场需求,确定预算目标 在制定光伏项目预算方案之前&#xff0c…

Vue CLI 的服务介绍与使用(2024-05-20)

1、介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service),该依赖: 可升级…

docker-如何将容器外的脚本放入容器内,将容器内的脚本放入容器外

文章目录 前言docker-如何将容器外的脚本放入容器内,将容器内的脚本放入容器外、1. docker 如何将容器外的脚本放入容器内1.1. 验证 2. 将容器内的脚本放入容器外 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊&…

JKI State Machine的特点与详细介绍

JKI State Machine是一种基于状态机的LabVIEW架构,由JKI公司开发。它广泛用于开发复杂的应用程序,提供了一种灵活且可扩展的结构,适用于多种任务的管理和执行。其设计目标是提高开发效率、代码可读性和可维护性。 2. 基本架构 JKI State Ma…

Spring Boot 中缓存的用法

缓存(Caching)是提升应用性能的重要手段之一,通过减少不必要的数据计算和数据库访问,显著提高系统的响应速度。在 Spring Boot 中,缓存机制被集成得非常好,使得我们能够快速、方便地使用缓存功能。本文将介…

基于Android studio 订餐、外卖系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录,注册,修改密码,查看关于开发信息(可以填写自己的信息) 我的:可以查看菜品详情,填写份数,加入购物车, 购物车:可…

【IDEA软件应用篇】IDEA基础开发设置和开发快捷键

IDEA是一种集成开发环境,可以运行java代码。 本篇文章你将收获到下面的知识: (1)IDEA如何设置字体大小快捷键 (2)如何解决每次进IDEA时,进去的页面都是上次使用完时的那个页面 (3&am…

使用yum下载rpm包

1、命令格式 yum install --downloadonly --downloaddir<directory> <package-name> --downloadonly&#xff1a;只下载选项而不进行安培训--downloaddir&#xff1a;指定下载目录&#xff0c;默认下载的RPM包会保在/var/cache/yum/x86_64/[centos|fedora-versio…

Linux系统下Mysql忘记密码怎么解决

一、对Mysql配置文件进行设置 1、找到/etc/mysql/my.cnf路径下&#xff0c;用Vi命令编辑my.cnf配置文件&#xff0c;命令如下&#xff1a; # 以管理员身份登录 sudo su # 输入管理员密码 # 登录成功后&#xff0c;找到Mysql的配置文件-->Mysql配置文件默认在此 cd /etc/my…

异相(相位不平衡)状态下的合成器效率分析-理论与ADS仿真

异相&#xff08;相位不平衡&#xff09;状态下的合成器效率分析-理论与ADS仿真 12、ADS使用记录之功分器设计中简单介绍了威尔金森功分器的设计方法。一般来讲&#xff0c;功分器反过来就能作为合路器使用&#xff0c;在输入信号相位一致的情况下&#xff0c;各种合路器的效率…

YOLOv8独家改进:mamba系列 | 视觉态空间(VSS)块结合C2f二次创新,提升捕捉广泛的上下文信息 | VMamba2024年最新成果

💡💡💡创新点:Mamba UNet采用了纯基于视觉Mamba(VMamba)的编码器-解码器结构,融入了跳跃连接,以保存网络不同规模的空间信息。这种设计有助于全面的特征学习过程,捕捉医学图像中复杂的细节和更广泛的语义上下文。我们在VMamba块中引入了一种新的集成机制,以确保编…

Linux之共享内存mmap用法实例(六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

通过注意力调节实现更好的文本到图像生成对齐

近年来&#xff0c;生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此&#xff0c;复杂提示中…

Go语言的pprof工具是如何使用的?

文章目录 Go语言的pprof工具详解pprof的使用runtime/pprofnet/http/pprof 快速开始获取采样数据通过pprof工具进行性能分析总结 Go语言的pprof工具详解 Go语言作为一个高性能、高并发的编程语言&#xff0c;对性能优化有着极高的要求。在Go语言的标准库中&#xff0c;pprof是一…

架构篇44:互联网架构模板:“平台”技术

文章目录 运维平台测试平台数据平台管理平台小结当业务规模比较小、系统复杂度不高时,运维、测试、数据分析、管理等支撑功能主要由各系统或者团队独立完成。随着业务规模越来越大,系统复杂度越来越高,子系统数量越来越多,如果继续采取各自为政的方式来实现这些支撑功能,会…

回溯大法总结

前言 本篇博客将分两步来进行&#xff0c;首先谈谈我对回溯法的理解&#xff0c;然后通过若干道题来进行讲解&#xff0c;最后总结 对回溯法的理解 回溯法可以看做蛮力法的升级版&#xff0c;它在解决问题时的每一步都尝试所有可能的选项&#xff0c;最终找出所以可行的方案…

对安卓手机上损坏的 SD 卡进行故障排除:恢复提示和修复

概括 如果您总是在旅途中&#xff0c;那么您很可能每天都在使用 SD 卡。这些微小但功能强大的闪存已经变得和手机的内部存储一样有用。它们可以存储数据并移动您想要的任何数据类型&#xff0c;因为它们在 Android 设备上添加了额外的存储空间。不幸的是&#xff0c;他们可能会…