Python 华为面试手撕代码 + 八股文,机器学习参数调节,损失函数,激活函数,线程、进程和协程

news2024/11/30 2:44:14

一、手撕代码:力扣原题905

"""
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。
基础版:你可以返回满足此条件的任何数组作为答案。
进阶版:要求在当前数组上原地完成。

示例:
输入:[3,1,6,5,2,4]
进阶版输出:[4,2,6,5,1,3]
基础版输出:[2,4,6,1,3,5],[4,6,2,3,1,5] 等等 也会被接受
"""
def functions(nums)->list:
    n = len(nums)
    left = 0
    right = n-1
    while left < right:
        if nums[left]%2 == 1 and nums[right]%2 == 1:
            right -= 1
        elif nums[left]%2 ==1:
            nums[left],nums[right] = nums[right],nums[left]
            left += 1
        else:
            left +=1
            right -=1
    return nums
nums = [3,1,6,5,2,4]
print(functions(nums))

二、八股文部分:有点紧张,忘了好多东西

1.深度学习模型优化的方法有哪些?

深度学习模型的优化策略包括以下几个方面:

(1)选择合适的激活函数:激活函数对模型的表达能力和收敛速度有很大影响,常用的激活函数包括ReLU、Sigmoid、Tanh等。

(2)初始化模型参数:模型参数的初始化对模型的收敛速度和性能有很大影响,常用的初始化方法包括Xavier初始化和He初始化等。

(3)批量大小(Batch Size):批量大小决定了每次更新模型参数的样本数,通常较大的批量大小可以使参数更新更加平稳,但也会增加内存和计算负担。

(4)学习率(Learning Rate):学习率是指每次参数更新时的步长,过大的学习率会导致模型震荡或者发散,过小的学习率会导致模型收敛缓慢,通常需要通过交叉验证等方法确定一个合适的学习率。

(5)正则化方法:正则化方法可以避免过拟合,但不同的正则化方法对模型性能和收敛速度的影响不同,需要根据实际情况选择合适的正则化方法。

(6)模型结构:模型结构决定了模型的表达能力和复杂度,需要根据实际问题选择合适的模型结构,常用的模型结构包括全连接网络、卷积神经网络、循环神经网络和注意力机制等。

(7)数据增强(Data Augmentation):数据增强可以增加训练样本量,提高模型的泛化能力常用的数据增强方法包括随机裁剪、随机翻转、添加噪声等。

综上所述,深度学习模型的优化策略需要综合考虑多个因素,通过实验来不断调整和改进模型,以获得最佳的性能和泛化能力。

2.举例说明通过修改模型结构来提高深度学习模型效果的方法?

图片分类:假设我们的任务是对一张图片进行分类,输入是一张大小为224x224x3的RGB图像,输出是这张图片属于1000个类别中的哪一类。

首先,我们可以使用一个预训练的卷积神经网络模型,如ResNet50,在ImageNet数据集上进行预训练,然后对其进行微调,以适应我们的任务。

但是,如果我们发现模型在我们的数据集上的表现并不理想,我们可以修改模型结构以提高其效果。以下是几个可能的修改方法:

(1)添加卷积层

我们可以ResNet50的最后几个卷积块中添加卷积层,以提取更高层次的特征。这样做的好处是,可以减少模型的参数量和计算量,同时提高模型的泛化能力。例如,我们可以在ResNet50的最后一个卷积块后面添加一层1x1的卷积层,然后跟随一个全局平均池化层和一个softmax层,这样就可以得到一个新的模型。

(2)添加注意力机制

我们可以在ResNet50的最后一个卷积块之后添加一个注意力机制,以自适应地聚焦于不同的区域。这样做的好处是,可以提高模型的预测精度和泛化能力。例如,我们可以使用SENet模型中的注意力机制,对ResNet50进行改进,得到一个新的模型。

(3)修改全连接层

我们可以修改ResNet50的全连接层,以适应我们的任务。例如,我们可以将其修改为多层感知机(MLP),以提高模型的表现。这样做的处是,可以提高模型的预测精度和泛化能力。例如,我们可以将ResNet50的全连接层替换为一个全连接层、一个ReLU层和一个dropout层,然后使用softmax层进行分类。

总之,通过添加、修改、组合不同的模型结构,可以提高深度学习模型的效果。需要根据实际问题选择合适的模型结构,并通过实验来不断调整和改进模型。

文本分类:

传统的文本分类方法是使用词袋模型,但是这种方法无法考虑词汇之间的关系,因此准确率和泛化能力有限。而深度学习模型可以从原始文本中自动学习特征,因此可以更准确地进行文本分类。

以卷积神经网络(CNN)为例,可以通过修改模型结构来提高效果。一种方法是使用多层卷积层和池化层来提取更多的特征。另一种方法是使用不同大小的卷积核来捕捉不同长度的文本特征。还可以使用注意力机制来强调关键词汇的重要性。这些改进方法可以提高模型的准确率和泛化能力。

例如,在情感分析任务中,可以使用CNN模型,将不同大小的卷积核应用于输入的文本,以捕捉不同长度的情感特征。此外,可以使用注意力机制,以便在分类过程中更关注重要的词汇。这些修改可以提高模型的性能,并使其更适用于实际应用。

3.传统RNN为什么会出现梯度消失和梯度爆炸?

RNN存在梯度消失和梯度爆炸的问题是因为在模型反向传播时,梯度会随时间步的增加而不断地通过链式法则进行连乘,这会导致梯度指数级地增大或减小,从而使得模型的训练变得非常困难。

具体来说,当梯度值较小时,连乘操作会使得梯度值不断减小,导致模型的参数更新变得非常缓慢,甚至停滞不前,这就是梯度消失的问题。而当梯度值较大时,连乘操作会使得梯度值不断增大,导致模型的参数更新变得非常剧烈,甚至出现不稳定的情况,这就是梯度爆炸的问题。

这些问题主要是由于RNN的循环结构所导致的。在传统的RNN中,每个时间步的输出都会被作为下一个时间步的输入,并且这个传递过程是通过不断地乘以同一个权重矩阵实现的。这种权重共享的结构使得模型的梯度很容易出现消失或爆炸的情况。

为了解决这些问题,研究者们提出了一系列的改进方法,如LSTM和GRU等。这些模型在传统的RNN的基础上加入了门控机制,从而使得模型可以自适应地控制信息的流入和流出,从而缓解了梯度消失和梯度爆炸的问题。

4.损失函数有哪些

损失函数(loss function)是机器学习中的一个重要概念。它是一个用来衡量模型预测结果与真实结果之间差距的函数。通常情况下,损失函数越小,模型的表现就越好。

常见的损失函数包括:

(1)均方误差(mean squared error,MSE):用于回归问题,计算预测值与实际值之间的平方差的平均值。

(2)交叉熵(cross-entropy):用于分类问题,计算预测值与实际值之间的差距。交叉熵越小,模型的表现就越好。

(3)对数似然损失(log loss):用于二元分类问题,计算预测值与实际值之间的差距。

(4)Hinge损失:用于支持向量机(SVM)的分类问题。

(5)KL散度(KL divergence):用于度量两个概率分布之间的差异。

选择合适的损失函数是机器学习中非常重要的一步,它直接影响了模型的表现和训练效果。

5.激活函数有哪些

激活函数在神经网络中起到非常重要的作用,它将神经元的输入信号转化为输出信号,使神经网络能够逼近任意复杂的函数。以下是激活函数在神经网络中的应用场景:

(1)二分类问题:Sigmoid函数和Tanh函数通常用于二分类问题,可以将输出值映射到0-1或-1到1之间,表示正类和负类的概率。

(2)多分类问题:Softmax函数可以将神经网络的输出转化为概率分布,用于多分类问题。

(3)隐藏层:ReLU函数和其变种(例如LeakyReLU)通常用于深度神经网络中的隐藏层,这是因为它们具有稀疏激活性质,能够减少参数数量和计算复杂度。

(4)防止过拟合:Dropout是一种特殊的激活函数,它以一定的概率将神经元的输出置为0,能够防止神经网络过拟合。

(5)提高准确率:ELU函数可以提高神经网络的稳定性和准确率,特别是在深度神经网络中表现更好

6.Transformer比LSTM的优势?

Transformer 相较于 LSTM,在以下方面有所改进:

(1)并行计算:Transformer 中的自注意力机制允许模型在处理输入序列时并行计算,相比之下,LSTM 是顺序计算的,不能很好地利用并行计算。

(2)长距离依赖:Transformer 采用了自注意力机制,允许模型关注输入序列中的任意位置,从而更好地处理长距离依赖关系。而 LSTM 的记忆单元只能接收前一时刻的隐藏状态,难以处理长序列。

(3)计算效率:由于 LSTM 是顺序计算,因此需要大量的计算和存储资源来维护和更新状态。相比之下,Transformer 中的自注意力机制减少了参与计算的参数数量,提高了计算效率。

(4)模型简洁性:LSTM 中需要维护多个状态,包括隐藏状态、细胞状态等,而 Transformer 只需要维护一个输入序列的嵌入表示,使得模型更简洁易懂。

7.协程?

协程,英文Coroutines,是一种比线程更加轻量级的存在。

协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。

一个进程可以包含多个线程,一个线程也可以包含多个协程,也就是说,一个线程内可以有多个那样的特殊函数在运行。但是有一点,必须明确,一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。这个比较好理解,毕竟协程虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但是这些函数都是串行运行的。当一个协程运行时,其他协程必须挂起。

协程的优点:

最大优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

其他一些重要的点:

协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
因此在协程调用阻塞IO操作的时候,操作系统会让线程进入阻塞状态,当前的协程和其它绑定在该线程之上的协程都会陷入阻塞而得不到调度,这往往是不能接受的。
因此在协程中不能调用导致线程阻塞的操作。也就是说,协程只有和异步IO结合起来,才能发挥最大的威力。
协程对计算密集型的任务没有太大的好处,计算密集型的任务本身不需要大量的线程切换,因为协程主要解决以往线程或者进程上下文切换的开销问题,所以协程主要对那些I/O密集型应用更好。
协程只有和异步IO结合起来才能发挥出最大的威力。

8.Python 中的 GIL

GIL 是 Python 的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行 Python 程序的时候会占用 Python 解释器(加了一把锁即 GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。多线程无法在多核cpu上运行。

9.什么是异步非阻塞
同步异步指的是调用者与被调用者之间的关系。

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值;
异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者。
阻塞非阻塞是线程或进程之间的关系。

阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活
非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程

10.函数式编程
函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。由于 Python 允许使用变量,因此,Python 不是纯函数式编程语言。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

11.python 多线程和多进程包:

多线程:threading

多进程:multiprocessing

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

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

相关文章

Revit问题:创建牛腿柱和快速生成圈梁

一、Revit中如何用体量创建牛腿柱 牛腿&#xff1a;悬臂体系的挂梁与悬臂间必然出现搁置构造&#xff0c;通常就将悬臂端和挂梁端的局部构造&#xff0c;又称梁托。牛腿的作用是衔接悬臂梁与挂梁&#xff0c; 并传递来自挂梁的荷载。牛腿柱可以用于桥梁、厂房的搭建&#xff0c…

C Primer Plus第十三章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 由于使用的是命令行参数常用于linux系…

机器学习-5 朴素贝叶斯算法

朴素贝叶斯算法 算法概述数理统计学处理的信息古典学派和贝叶斯学派的争论贝叶斯定理朴素贝叶斯分类训练朴素贝叶斯&#xff1a;朴素假设案例&#xff1a;预测打网球拉普拉斯平滑技术小结 算法流程与步骤算法应用sklearn中的朴素贝叶斯朴素贝叶斯的使用算法实例 算法概述 数理…

年营收超1700亿元 中国机器人行业走向更多场景

文 | BFT机器人 中国已经连续九年成为全球最大的工业机器人应用国&#xff0c;同时还是全球机器人第一生产大国&#xff0c;2022年机器人全行业营收超过1700亿元(人民币&#xff0c;下同)。随着《“机器人”应用行动实施方案》的落地&#xff0c;机器人应用的深度和广度加速扩…

网络安全渗透测试常用术语总结!建议收藏!

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡&#xff0c;就像在使用自己的电脑一样&#xff0c;很形象的比喻&#xff0c;就像是养的肉鸡&#xff0c;任黑客宰杀和利用。关键的是&#xff0c;在成为肉鸡后&#xff0c;只要黑客不对电脑进…

Vue打包后chunk-vendors.92223bd2.js文件过大解决方案

唠嗑部分 事情的经过是这样的&#xff0c;最近自己玩了一个小系统&#xff0c;使用的是SpringBootVue编写&#xff0c;打包部署后发现页面加载缓慢&#xff0c;打开控制台一看&#xff0c;发现是这家伙在作祟&#xff0c;请看下图 什么鬼&#xff0c;这个js文件2.6M&#xff0…

error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h“

今天创建一个静态库时&#xff0c;编译器报错&#xff1a;error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h” 网上查找了各种解决方案&#xff0c;主要是以下两种解决方案&#xff1a; 解决方式&#xff1a; 一. 在解决方案资源…

数据结构与算法07:高效的排序算法

目录 归并排序 快速排序 桶排序 计数排序 基数排序 对比各类排序算法 每日一练&#xff1a;排序链表 在上一篇文章中分析了简单的三种排序算法&#xff1a;冒泡排序、插入排序、选择排序&#xff0c;这三种排序算法的时间复杂度都是O(n^2)&#xff0c;效率不是很高。如果…

KUC711AE101 3BHB004661R0101 用于精确误差仿真的设备

KUC711AE101 3BHB004661R0101 最近推出的欧姆龙自动化产品包括CJ2H-CPU可编程自动化控制器、NS15超清晰15英寸HMI以及用于CJ和CS平台的基于PLC的高速位置控制器模块。通过以太网/IP使用CJ2H-CPU的行业标准、基于标记的编程有助于缩短程序开发时间和故障排除。CX-One有助于满足市…

分布式时序数据库DolphinDB

简介 DolphinDB不仅可作为分布式数据仓库或者内存数据库来使用&#xff0c;而且自带丰富的计算工具&#xff0c;可作为一个研究工具或研究平台来使用。DolphinDB对时间序列数据的处理特别友好&#xff0c;非常适合量化金融、物联网等领域的海量数据分析。例如在量化金融领域的交…

JavaEE进阶(5/29)Mybatis

目录 1.什么是Mybatis 2.Mybatis组成部分 3.配置Mybatis中的存放路径 4.设置路径 6.yml配置MyBatis的xml配置文件路径 1.什么是Mybatis 它是一款持久层框架&#xff0c;支持自定义SQL&#xff0c;存储过程&#xff08;一个方法&#xff0c;封装了一堆SQL&#xff08;包括判断/变…

spring security实现authorization code模式,自定义登录页面,自动授权,自定义密码编码,跳转登录页面http转https

spring security实现authorization code模式# 系列文章目录 SpringSecurity实现OAuth2 JWT和OAuth2在SpringBoot下的实现 spring security实现authorization code模式 摘要自定义登录页面自动授权自定义密码验证跳转登录页面http转https 摘要 为了将老项目接口安全暴露给第三…

在线帮助中心搭建利器:Baklib

帮助中心是一个提供服务和支持的虚拟平台&#xff0c;旨在为客户提供解决问题和获取信息的途径。它通常包含企业或组织的产品或服务的相关信息、解决方案、操作指南和常见问题等信息。通过帮助中心&#xff0c;用户可以自助查询并解决问题&#xff0c;从而提高了客户的满意度和…

Neutron — 虚拟机网卡创建过程

目录 文章目录 目录创建并绑定虚拟机的虚拟网卡1、创建 VM 和 Port 记录2、创建 VM 和 Port 实体3、更新 Port 状态 创建并绑定虚拟机的虚拟网卡 在 OpenStack 中&#xff0c;Nova 负责虚拟机的生命周期管理&#xff0c;Neutron 负责虚拟网络的生命周期管理。而虚拟机的虚拟网…

两个直线/线段的交点 - C++

问题&#xff0c;求上图中线段AB 和线段CD的交点P的坐标 根据《算法艺术与信息学竞赛》&#xff0c;公式如下 原理&#xff1a; 利用叉积求得点P分线段DC的比&#xff0c;然后利用高中学习的定比分点坐标公式求得分点P的坐标 c代码如下 #include <math.h> #include &l…

压力山大?搭建JMeter分布式压测环境轻松应对!

目录 引言 windows环境部署 1.安装环境变量 2.配置环境变量 3.修改Jmeter配置文件 4.启动jmeter 5.启动分布式服务 Linux环境部署 1.安装JDKJmeter 2.环境优化 4.编写Jmeter脚本 5.启动Jmeter 6.停止Jmeter 7.打包查看测试报告 引言 您想要提高您的应用程序的性…

【JavaSE】Java基础语法(三十五):多线程实战

文章目录 1. 多线程入门1.1 多线程相关概念1.2 什么是多线程1.3 多线程的创建方式1.3.1 继承 Thread 的方式1.3.2 实现 Runnable 接口的方式1.3.3 实现 Callable 接口的方式1.3.4 Thread 类中常用方法1.3.5 sleep() 方法 和 wait() 方法区别&#xff1a; 2. 线程安全2.1 线程安…

破坏单例模式--存在的问题---问题的解决

目录 破坏单例模式--存在的问题---问题的解决 问题演示 破坏单例模式&#xff1a; 序列化 反射 序列化反序列化&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 反射 代码&#xff1a; 运行结果&#xff1a; 问题的解决 序列化、反序列方式破坏单例模式的解…

Elasticsearch 8.X 性能优化参考 —— 筑梦之路

Elasticsearch 是实现用户无缝搜索体验的关键工具。它通过提供快速、准确和相关的搜索结果&#xff0c;彻底改变了用户与应用程序的互动方式。然而&#xff0c;要确保 Elasticsearch 部署达到最佳性能&#xff0c;就必须关注关键指标&#xff0c;并对诸如索引、缓存、查询、搜索…

monorepo 项目 Unable to resolve path to module ‘xxx‘.eslintimport/no-unresolved

同事问了一个问题&#xff0c;他现在参加了一个项目&#xff0c;这个项目是个monorepo 项目。 也就是多包管理、前后端一起都是js 写的。 问题 后端express 项目里配置的路径别名&#xff0c;eslint 不认识&#xff0c;报错。 Unable to resolve path to module /app/Prisma.e…