版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《机器学习与人工智能基础》习题答案第1章一、问答题1.人工智能是研究使计算机具有人类智能的科学,而机器学习是人工智能的重要分支和核心技术。机器学习通过从数据中自动学习规律,使计算机具备自我改进能力,从而实现智能化。它为语音识别、图像识别、自然语言处理等人工智能应用提供了关键支撑,推动了人工智能的快速发展。2.监督学习是在有输入和输出标签的数据下训练模型,目的是建立输入与输出之间的映射关系,如语音助手、股票价格等。无监督学习是在没有标签的数据上进行训练,用于发现数据的内在结构或分布规律,如客户分群、商品推荐、文本聚类等。两者的主要区别在于是否存在输出标签。3.数据预处理可以提高模型训练的准确性和效率,减少噪声与异常值的影响。列举几个常见方法:(1)缺失值处理:用均值或中位数填充缺失数据。(2)数据标准化或归一化:消除不同特征的量纲差异。(3)异常值处理:去除或修正不合理数据。这些方法有助于提升模型的稳定性与性能。二、实践题#######代码####################导入必要的库importnumpyasnpimportpandasaspdfromsklearn.linear_modelimportLinearRegressionimportmatplotlib.pyplotasplt#构造数据集data={"面积":[50,60,80,100,120,150,180,200,250,300],"卧室数":[1,1,1,2,2,3,3,3,4,4],"价格":[150,180,240,300,350,400,450,500,600,700]}df=pd.DataFrame(data)#特征变量(X)和目标变量(y)X=df[["面积","卧室数"]]y=df["价格"]#建立并训练线性回归模型model=LinearRegression()model.fit(X,y)#输出模型参数print("截距β0:",ercept_)print("回归系数β:",model.coef_)#预测y_pred=model.predict(X)#可视化对比plt.scatter(y,y_pred)plt.xlabel("真实价格(万元)")plt.ylabel("预测价格(万元)")plt.title("多元线性回归预测效果")plt.show()#示例预测test=np.array([[150,3]])#150m²,3卧室predicted_price=model.predict(test)print(f"预测房价(150m²,3卧室)≈{predicted_price[0]:.2f}万元")#######运行效果###################截距β0:59.61371961371964回归系数β:[1.8944388918.7978688]预测房价(150m²,3卧室)≈400.17万元一、问答题简述多层感知机(MLP)在处理复杂数据时的优势,并解释其工作原理。多层感知机的优势:与线性模型和单层感知机相比,MLP的核心优势在于:1)突破线性限制:通过引入隐藏层和非线性激活函数,MLP可以学习和表示数据中极其复杂的非线性关系与模式。这是它处理图像、语音等复杂数据的根本原因。2)自动特征工程:其多层结构像一个特征加工流水线。底层网络学习基础特征(如图像中的边缘),高层网络将这些基础特征组合成更抽象的概念(如眼睛、鼻子)。这种分层特征学习能力减少了对人工设计特征的依赖。3)强大的拟合能力:理论上,只要神经元足够多,一个隐藏层的MLP就能以任意精度逼近任何连续函数,这被称为通用近似定理。工作原理简述:MLP的工作是一个不断学习和自我修正的循环,核心是“前向传播”和“反向传播”。1)前向传播输入:数据从输入层送入。处理:数据在每一层经历“加权求和+偏置”,然后通过一个激活函数(如ReLU)。激活函数的作用是引入非线性,没有它,网络再深也只是一个线性模型。输出:信号经过层层传递与变换,最终在输出层产生预测结果。2)计算损失将网络的预测结果与真实答案进行比较,通过一个损失函数计算出“误差”有多大。3)反向传播与优化反向传播:将计算出的总误差,沿着网络反向从输出层传回输入层。在这个过程中,利用微积分的链式法则,精确计算出每一个连接权重和每一个偏置对总误差应负多少“责任”(即梯度)。参数更新:使用优化器(如梯度下降),根据计算出的梯度,对所有参数(权重和偏置)进行微调,目标是让总误差减小。总结循环:输入数据→前向计算得预测→计算误差→反向传播定责任→更新参数降误差。这个过程周而复始,直到模型表现令人满意。解释前向传播和反向传播在神经网络训练中的作用,并简述它们的主要区别。一、各自的作用1)前向传播-作用:进行预测与评估过程:输入数据从网络的输入层开始,逐层向后传递。在每一层,数据都会进行“加权求和+偏置+激活函数”的运算,最终在输出层产生一个预测结果。核心目的:计算预测值:得到模型对于当前输入的输出。计算损失:将预测值与真实标签进行比较,通过损失函数计算出一个标量误差值。这个值代表了模型当前表现的“糟糕程度”。简单来说,前向传播的作用是:让数据“走过”整个网络,看看模型现在能得多少分。2)反向传播-作用:优化与学习过程:将前向传播计算出的总误差(损失),从输出层开始,利用链式法则,逆向逐层传播回网络的每一层,并计算出损失函数对于每一个权重和每一个偏置的梯度(即导数)。核心目的:计算梯度:精确地确定每一个网络参数(权重和偏置)对最终误差应负多少“责任”。指导参数更新:为后续的优化步骤(如梯度下降)提供方向和数据,告诉我们每个参数应该向哪个方向、调整多少才能降低误差。简单来说,反向传播的作用是:分析试卷,找出是哪些知识点(权重/偏置)掌握不牢导致了扣分,并为修正它们提供精确的指导。比较深度学习与传统机器学习在处理不同类型数据时的效率和适用性,并举例说明。深度学习(DeepLearning)和传统机器学习(MachineLearning)在数据处理方式、特征表达能力以及硬件依赖程度上均存在明显差异。在不同类型的数据条件下,两者的效率和适用性也有所不同。一、两类方法的总体区别1)特征工程方式不同传统机器学习依赖人工特征提取,需要人为设计、选择关键特征。深度学习具备自动特征学习能力,可从原始数据中直接学习高层抽象特征。2)对数据规模的要求不同传统方法适合样本量较小的数据集。深度学习通常需要大量数据才能体现优势。3)计算资源需求不同传统方法计算量较小,CPU即可高效训练。深度学习模型结构复杂,大多依赖GPU加速。二、在不同类型数据上的效率与适用性对比1)图像数据(ImageData)项目传统机器学习深度学习数据适用性对图像直接处理能力弱,需人工提取SIFT、HOG等特征原始图像直接输入CNN,实现端到端处理效率特征提取耗时,模型训练较快训练耗时长,但识别准确率显著更高适用性小规模图像数据大规模图像分类、目标检测、分割任务示例:使用传统机器学习进行手写数字识别时,需要先提取方向梯度特征,再用SVM分类。使用深度学习(如CNN)时,可直接输入像素,模型能学习到边缘、局部纹理等特征,效果更佳。2)语音与音频数据(Speech/Audio)项目传统机器学习深度学习数据处理方式依赖MFCC、能量谱等手工特征深度网络可自动学习时间和频率特征效率特征工程复杂且耗时网络训练需要GPU,但端到端性能优越性能对噪声敏感鲁棒性更高,适合实际应用示例:传统方法:使用MFCC+GMM/HMM进行语音识别。深度学习方法:使用RNN、CNN或Transformer实现端到端语音识别(如ASR系统)。3)文本数据(NLP)项目传统机器学习深度学习特征表示依赖TF-IDF、n-gram自动学习词表示(Word2Vec、BERT等)对上下文理解弱强,可处理长距离依赖效率特征向量稀疏,模型简单Transformer计算量大但效果显著更优示例:传统方法使用TF-IDF+朴素贝叶斯做文本分类。深度学习方法使用LSTM或BERT,效果远优传统方法,尤其在语义理解任务上。4)表格结构化数据(TabularData)项目传统机器学习深度学习表现表现非常好,尤其是树模型一般不如梯度提升树效率训练快,参数易调模型复杂且不易收敛适用性小样本、中等规模企业级数据需要大规模高维特征、复杂关系才能体现优势示例:在银行贷款预测、信用评分等结构化数据任务中,XGBoost通常比深度网络表现更好。5)时间序列数据(TimeSeries)项目传统机器学习深度学习特征需求需要人工构造时间相关特征RNN、LSTM、Transformer可自动学习时序依赖效率特征设计耗时,模型训练较快模型训练慢,但可以捕捉复杂动态模式适用性简单时序预测多步预测、非线性时序、复杂模式示例:传统方法使用ARIMA预测股价趋势。深度学习使用LSTM/Transformer,可捕捉多周期模式和非线性特征。二、实践题改进多层感知机(MLP)用于MNIST分类。要求:调整学习率,以加速训练过程并提高模型性能。在训练完成后,评估模型在测试集上的准确率,并打印出每个类别的准确率。importtorchimporttorch.nnasnnimporttorch.optimasoptimimporttorchvisionimporttorchvision.transformsastransformsimportnumpyasnp#数据预处理transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])#加载MNIST数据集train_dataset=torchvision.datasets.MNIST(root='./data',train=True,download=True,transform=transform)test_dataset=torchvision.datasets.MNIST(root='./data',train=False,download=True,transform=transform)#数据加载器train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=128,shuffle=True)#增大batch_sizetest_loader=torch.utils.data.DataLoader(dataset=test_dataset,batch_size=1000,shuffle=False)#定义改进的MLP模型classImprovedMLP(nn.Module):def__init__(self):super(ImprovedMLP,self).__init__()self.fc1=nn.Linear(28*28,512)self.fc2=nn.Linear(512,256)self.fc3=nn.Linear(256,128)self.fc4=nn.Linear(128,10)self.relu=nn.ReLU()self.dropout=nn.Dropout(0.2)#添加dropout防止过拟合defforward(self,x):x=x.view(-1,28*28)x=self.relu(self.fc1(x))x=self.dropout(x)x=self.relu(self.fc2(x))x=self.dropout(x)x=self.relu(self.fc3(x))x=self.dropout(x)x=self.fc4(x)returnx#初始化模型、损失函数和优化器model=ImprovedMLP()criterion=nn.CrossEntropyLoss()#尝试不同的学习率策略#方案1:较大的初始学习率配合学习率调度器optimizer=optim.Adam(model.parameters(),lr=0.001,weight_decay=1e-5)#使用Adam优化器scheduler=optim.lr_scheduler.StepLR(optimizer,step_size=5,gamma=0.5)#每5个epoch学习率减半#方案2:也可以尝试SGD配合momentum#optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.9,nesterov=True)print("开始训练...")#训练模型num_epochs=15train_losses=[]test_accuracies=[]forepochinrange(num_epochs):model.train()running_loss=0.0forimages,labelsintrain_loader:outputs=model(images)loss=criterion(outputs,labels)optimizer.zero_grad()loss.backward()optimizer.step()running_loss+=loss.item()current_lr=optimizer.param_groups[0]['lr']epoch_loss=running_loss/len(train_loader)train_losses.append(epoch_loss)#更新学习率scheduler.step()#每个epoch后在测试集上评估model.eval()correct=0total=0withtorch.no_grad():forimages,labelsintest_loader:outputs=model(images)_,predicted=torch.max(outputs.data,1)total+=labels.size(0)correct+=(predicted==labels).sum().item()accuracy=100*correct/totaltest_accuracies.append(accuracy)print(f'Epoch[{epoch+1}/{num_epochs}],Loss:{epoch_loss:.4f},TestAcc:{accuracy:.2f}%,LR:{current_lr:.6f}')print("\n最终测试结果:")#最终测试模型性能model.eval()all_predicted=[]all_labels=[]withtorch.no_grad():correct=0total=0class_correct=list(0.foriinrange(10))class_total=list(0.foriinrange(10))forimages,labelsintest_loader:outputs=model(images)_,predicted=torch.max(outputs,1)total+=labels.size(0)correct+=(predicted==labels).sum().item()#记录每个类别的预测结果all_predicted.extend(predicted.cpu().numpy())all_labels.extend(labels.cpu().numpy())#计算每个类别的准确率c=(predicted==labels).squeeze()foriinrange(labels.size(0)):label=labels[i]class_correct[label]+=c[i].item()class_total[label]+=1#打印总体准确率print(f'总体测试准确率:{100*correct/total:.2f}%')#打印每个类别的准确率print("\n每个类别的准确率:")foriinrange(10):ifclass_total[i]>0:accuracy=100*class_correct[i]/class_total[i]print(f'数字{i}:{accuracy:.2f}%')else:print(f'数字{i}:无样本')#计算并打印混淆矩阵print("\n混淆矩阵:")fromsklearn.metricsimportconfusion_matriximportmatplotlib.pyplotaspltcm=confusion_matrix(all_labels,all_predicted)print("预测→")print("真实↓")print(cm)#可选:绘制训练曲线plt.figure(figsize=(12,4))plt.subplot(1,2,1)plt.plot(train_losses)plt.title('TrainingLoss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.subplot(1,2,2)plt.plot(test_accuracies)plt.title('TestAccuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy(%)')plt.tight_layout()plt.show()主要改进点:1)学习率优化:使用Adam优化器(自适应学习率),初始学习率设为0.001添加学习率调度器,每5个epoch学习率减半添加权重衰减(L2正则化)防止过拟合2)模型结构改进:增加了一个隐藏层(512→256→128→10)添加Dropout层(0.2)防止过拟合3)训练过程优化:增大batch_size到128,加速训练增加训练epoch到15每个epoch后都评估测试集准确率4)详细评估:计算并打印每个数字类别的准确率生成混淆矩阵绘制训练损失和测试准确率曲线这些改进能显著提高训练速度和模型性能。Adam优化器通常比SGD收敛更快,学习率调度器有助于在训练后期更精细地调整参数。深度学习环境配置一、问答题
1.简述深度学习环境的基本要求有哪些方面。答:主要包括硬件(CPU/GPU性能、内存/显存大小)、软件(操作系统、编程语言、深度学习框架)、依赖库(科学计算、数据处理类库)及环境配置(版本兼容、虚拟环境隔离)四个方面。
简述CUDA及其作用。答:CUDA是NVIDIA推出的并行计算平台和编程模型,可让GPU实现通用计算,核心作用是为深度学习框架提供GPU加速,大幅提升模型训练和推理速度。
3.简述Python虚拟环境的意义和作用。答:Python虚拟环境的意义是避免不同项目间依赖库版本冲突;作用包括隔离项目依赖、统一开发环境、便于项目迁移和部署,同时节省系统资源。二、实践题
构建基于PyTorch框架的深度学习CPU计算运行环境。
要求:基于PyTorch深度学习框架,选择仅CPU支持版本,并运行代码查看硬件支持答:创建虚拟环境#创建虚拟环境(命名为pytorch-cpu)python-mvenvpytorch-cpu#激活虚拟环境#WindowsCMD:pytorch-cpu\Scripts\activate.bat#WindowsPowerShell:.\pytorch-cpu\Scripts\Activate.ps1#macOS/Linux:sourcepytorch-cpu/bin/activate2、安装pytorch版本#示例(Windows/macOS/Linux通用CPU命令)pip3installtorchtorchvisiontorchaudio--index-url/whl/cpu3环境验证importtorch#查看PyTorch版本print("PyTorch版本:",torch.__version__)#查看CPU支持情况(返回True表示CPU可用)print("CPU是否可用:",torch.cuda.is_available()isFalseandtorch.backends.mkl.is_available())#输出设备信息print("当前设备:",torch.device("cpu"))参考答案1.在图像处理中,已知一幅大小为10×10的灰度图像,使用一个3×3的卷积核进行卷积操作,步长为1,填充为0。请计算卷积操作后输出特征映射的大小。如果将步长改为2,输出特征映射的大小又会是多少?请详细说明计算过程,并解释步长对输出特征映射大小的影响。参考答案:卷积操作中,输出特征映射大小的计算公式为:OutputSize=⌊(InputSize-KernelSize+2×Padding)/Stride⌋+1,其中⌊⌋表示向下取整,InputSize为输入图像边长,KernelSize为卷积核边长,Padding为填充像素数,Stride为步长。当输入图像大小为10×10,卷积核为3×3,填充为0时:步长为1时,代入公式得:⌊(10-3+2×0)/1⌋+1=⌊7⌋+1=8,因此输出特征映射大小为8×8。步长为2时,计算过程为:⌊(10-3+2×0)/2⌋+1=⌊3.5⌋+1=3+1=4,因此输出特征映射大小为4×4。步长是卷积核在输入图像上移动的步幅,步长越大,卷积核每次移动跳过的像素越多,对输入图像的采样次数越少,输出特征映射的尺寸就越小;反之,步长越小,采样越密集,输出尺寸越大。同时,步长增大能减少模型计算量,但可能丢失局部细节;步长为1时保留细节最多,但计算量最大。2.卷积层、池化层和全连接层在卷积神经网络中各自发挥着重要作用。请阐述如果在一个图像分类的卷积神经网络模型中,去掉池化层,会对模型的性能产生哪些影响?相反,如果去掉全连接层,又会对模型产生怎样的影响?从计算量、特征提取能力和模型泛化能力等方面进行分析。参考答案:卷积神经网络中,池化层、全连接层与卷积层分工不同,去掉任意一层都会显著影响模型性能。若去掉池化层,影响主要包括:计算量会大幅激增,因为池化层的核心作用是下采样(缩小特征图尺寸),去掉后后续卷积层的输入尺寸未被压缩,导致参数数量和卷积计算次数显著增加,训练和推理速度变慢;特征提取能力会下降,池化层能通过下采样扩大感受野,帮助模型整合全局信息,缺少池化层后,模型仅能捕捉局部特征,对大目标的识别能力减弱;泛化能力也会降低,池化层带来的平移不变性消失,输入图像的微小位移(如数字的轻微偏移)会导致特征剧烈变化,容易引发过拟合。若去掉全连接层,影响则表现为:计算量会显著降低,因为全连接层通常是CNN中参数最密集的部分(如AlexNet的全连接层参数占比超90%),去掉后参数和计算量大幅减少;但特征提取能力会严重受损,卷积层输出的是空间特征图,需要全连接层将其“扁平化”并转化为全局特征向量,再映射到分类标签空间,缺少全连接层后,模型无法完成“特征到类别”的映射,无法实现分类任务;泛化能力会先升后降,短期可能因参数减少降低过拟合风险,但由于无法有效整合全局特征,模型整体表达能力不足,最终分类准确率会大幅下降。3.在使用MNIST数据集进行图像分类时,人们对数据进行了预处理,包括归一化等操作。请解释为什么要对数据进行归一化处理?如果不进行归一化,可能会对模型的训练和分类结果产生什么影响?另外,除了归一化,你还能想到哪些其他的数据预处理方法可以提高模型的分类准确率?参考答案:在MNIST等图像分类任务中,数据预处理是提升模型性能的关键步骤,其中归一化尤为重要。数据归一化的核心目的是优化训练过程、提升收敛效率和分类精度。一方面,它能加速梯度下降收敛:不同特征的尺度差异会使损失函数轮廓呈“狭长状”,导致梯度更新震荡,归一化后特征尺度一致,损失函数更“圆润”,梯度更新更稳定快速;另一方面,它能避免特征主导偏差:大尺度特征会在梯度计算中占据主导地位,使模型忽略小尺度关键特征(如边缘、纹理),归一化后所有特征权重均衡,模型能全面学习有效信息。若不进行归一化,会导致训练效率低下、模型难以收敛(大尺度特征的梯度可能“淹没”小尺度特征,使模型无法学习关键信息,甚至训练失败),最终分类准确率显著下降。除归一化外,其他能提升分类准确率的预处理方法包括:数据增强(通过旋转、翻转、随机裁剪、亮度调整等扩充数据集多样性,提升模型泛化能力);去均值处理(将每个特征减去均值,使数据围绕0分布,辅助梯度收敛);图像标准化(通过“(数据-均值)/标准差”将数据转化为均值0、标准差1的分布,适用于特征尺度差异大的场景)。4.YOLO模型在目标检测任务中具有检测速度快的优势。请解释YOLO模型是如何实现快速检测的?与传统的目标检测算法相比,YOLO模型的创新点体现在哪些方面?另外,随着YOLO模型版本的不断更新,其性能也在不断提升。请分析YOLOv8相较于之前版本,在网络结构和训练方法上有哪些主要的改进?这些改进如何提升了模型的检测精度和速度?参考答案:YOLO(YOLOv1)实现快速检测的核心在于“单阶段端到端检测”:传统两阶段算法(如R-CNN)需先生成上千个候选框,再逐个分类,步骤冗余;而YOLO直接将输入图像划分为S×S的网格,每个网格预测B个边界框和类别概率,通过一次前向传播完成所有检测,无需单独生成候选框。同时,YOLO基于全局图像特征预测,减少了局部候选框的重复计算,且网络结构轻量化(早期版本采用简洁的卷积层+全连接层),进一步提升了速度。与传统目标检测算法相比,YOLO的创新点体现在:首次提出单阶段端到端检测框架,将“候选框生成”与“分类回归”整合为一步,打破了两阶段框架的速度瓶颈;充分利用全局信息,能更好地判断目标与背景的关系,减少“局部候选框误判背景为目标”的问题;首次实现实时检测能力,早期YOLOv1在CPU上可达45FPS,GPU上达155FPS,适用于自动驾驶、视频监控等实时场景。YOLOv8通过网络结构和训练方法的改进,进一步提升了性能。在网络结构上,其Backbone用C2f模块替代了YOLOv5的C3模块,通过增加残差连接和分支数量,增强了特征提取能力和梯度传播效率,能捕捉更细粒度的目标细节;Neck部分采用“SPPF+卷积融合”结构,强化多尺度特征融合,提升了对不同大小目标(如大汽车、小行人)的检测精度;部分版本采用Anchor-Free设计,去掉预定义锚框,直接回归目标中心和宽高,减少了锚框匹配的计算量,同时提升了对不规则目标的适应性。在训练方法上,YOLOv8引入改进版的Mosaicv2和MixUp数据增强,通过更灵活的图像拼接和像素混合,提升了模型对复杂场景(如遮挡、光照变化)的鲁棒性;采用CIoU损失的改进版,在边界框损失计算中融入中心点距离、宽高比等信息,提升了定位精度;还支持半监督训练,通过模型自身预测的“伪标签”扩充数据,减少对标注数据的依赖,增强泛化能力。这些改进使YOLOv8在COCO数据集上表现较好,尤其对小目标和遮挡目标效果更优,仍保持实时性。第五章循环神经网络与自然语言处理一、问答题1.简述循环神经网络的基本原理。答:循环神经网络(RNN)的基本原理:核心是通过隐藏层的循环连接保留历史信息,像“带记忆的神经网络”。它在处理序列数据时,每个时刻的输出不仅依赖当前输入,还会结合上一时刻隐藏层的状态,实现对时序信息的捕捉和传递。
2.简述时间序列与RNN的关系。答:时间序列与RNN的关系:时间序列是具有时序依赖的序列数据(如股价、气温),而RNN的核心优势是通过循环结构捕捉时序信息,二者是“数据类型”与“适配模型”的对应关系,RNN是处理时间序列预测、分类等任务的经典模型。3.简述循环神经网络的局限性及解决思路。答:局限性:存在梯度消失/爆炸问题,难以捕捉长序列依赖;模型复杂度高时训练效率低。解决思路:用LSTM(长短期记忆网络)或GRU(门控循环单元)替代传统RNN,通过门控机制控制信息传递,缓解梯度问题;也可采用梯度裁剪、优化初始化等方法辅助改进。二、实践题
基于PyTorch库包实现Word2Vec文本分类。要求:基于PyTorch库包实现Word2Vec文本分类,过程包括数据收集、预处理、Word2Vec模型训练和评估等主要步骤。
答:1环境准备pipinstalltorchtorchvisionnumpypandasnltkgensimscikit-learn2数据收集importnumpyasnpimportpandasaspdfromsklearn.datasetsimportfetch_20newsgroupsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_report#加载数据(过滤无关信息,仅保留文本内容)newsgroups=fetch_20newsgroups(subset='all',remove=('headers','footers','quotes'),categories=None,#保留所有20个类别shuffle=True,random_state=42)#转换为DataFrame,便于处理data=pd.DataFrame({'text':newsgroups.data,'label':newsgroups.target})#划分训练集和测试集(8:2)train_texts,test_texts,train_labels,test_labels=train_test_split(data['text'],data['label'],test_size=0.2,random_state=42)3数据处理importnltkfromnltk.corpusimportstopwordsfromnltk.tokenizeimportword_tokenizeimportre#下载nltk依赖(首次运行需执行)nltk.download('punkt')nltk.download('stopwords')#定义预处理函数defpreprocess_text(text):#1.小写转换text=text.lower()#2.去除特殊字符、数字和多余空格text=re.sub(r'[^a-zA-Z\s]','',text)text=re.sub(r'\s+','',text).strip()#3.分词tokens=word_tokenize(text)#4.去停用词(英文停用词)stop_words=set(stopwords.words('english'))tokens=[tokenfortokenintokensiftokennotinstop_wordsandlen(token)>2]#过滤短词returntokens#对训练集和测试集文本进行预处理train_corpus=[preprocess_text(text)fortextintrain_texts]test_corpus=[preprocess_text(text)fortextintest_texts]#过滤空文本(预处理后可能为空)train_corpus=[tokensfortokensintrain_corpusiflen(tokens)>0]test_corpus=[tokensfortokensintest_corpusiflen(tokens)>0]#同步过滤对应标签train_labels=train_labels[:len(train_corpus)]test_labels=test_labels[:len(test_corpus)]4模型训练fromgensim.modelsimportWord2Vec#配置Word2Vec参数w2v_params={'vector_size':100,#词向量维度'window':5,#上下文窗口大小'min_count':2,#最小词频(过滤低频词)'sg':1,#1=Skip-gram模型,0=CBOW模型'workers':4,#并行训练线程数'epochs':10#训练轮数}#训练Word2Vec模型w2v_model=Word2Vec(sentences=train_corpus,**w2v_params)#保存Word2Vec模型(可选)w2v_model.save("word2vec.model")defget_text_vector(tokens,w2v_model,vector_size):"""将文本转化为词向量均值"""vectors=[]fortokenintokens:iftokeninw2v_model.wv:#仅保留在Word2Vec中存在的词vectors.append(w2v_model.wv[token])iflen(vectors)==0:#若文本中无有效词,返回零向量returnnp.zeros(vector_size)returnnp.mean(vectors,axis=0)#提取训练集和测试集的文本特征vector_size=100train_features=np.array([get_text_vector(tokens,w2v_model,vector_size)fortokensintrain_corpus])test_features=np.array([get_text_vector(tokens,w2v_model,vector_size)fortokensintest_corpus])5pytorch模型##构建数据集importtorchfromtorch.utils.dataimportDataset,DataLoaderfromtorchimportnn,optim#定义自定义数据集类classTextClassificationDataset(Dataset):def__init__(self,features,labels):self.features=torch.tensor(features,dtype=torch.float32)self.labels=torch.tensor(labels,dtype=torch.long)def__len__(self):returnlen(self.features)def__getitem__(self,idx):returnself.features[idx],self.labels[idx]#创建数据加载器(批量训练)batch_size=32train_dataset=TextClassificationDataset(train_features,train_labels)test_dataset=TextClassificationDataset(test_features,test_labels)train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)##分类模型定义classTextClassifier(nn.Module):def__init__(self,input_dim,num_classes):super(TextClassifier,self).__init__()#全连接层:输入维度=词向量维度(100),输出维度=类别数(20)self.fc1=nn.Linear(input_dim,512)self.fc2=nn.Linear(512,256)self.fc3=nn.Linear(256,num_classes)self.dropout=nn.Dropout(0.5)#防止过拟合self.relu=nn.ReLU()defforward(self,x):x=self.relu(self.fc1(x))x=self.dropout(x)x=self.relu(self.fc2(x))x=self.dropout(x)x=self.fc3(x)returnx#初始化模型:输入维度=100,类别数=20model=TextClassifier(input_dim=vector_size,num_classes=20)##模型训练与评估#损失函数(多分类任务用交叉熵损失)criterion=nn.CrossEntropyLoss()#优化器(Adam)optimizer=optim.Adam(model.parameters(),lr=1e-3)#训练轮数epochs=20#设备配置(CPU/GPU自动适配)device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")model.to(device)defevaluate_model(model,test_loader,device):model.eval()#评估模式all_preds=[]all_labels=[]withtorch.no_grad():#禁用梯度计算forfeatures,labelsintest_loader:features,labels=features.to(device),labels.to(device)outputs=model(features)_,preds=torch.max(outputs,1)#获取预测类别all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())#计算准确率并输出分类报告accuracy=accuracy_score(all_labels,all_preds)print(f"\nTestAccuracy:{accuracy:.4f}")print("\nClassificationReport:")print(classification_report(all_labels,all_preds,target_names=newsgroups.target_names))#启动评估evaluate_model(model,test_loader,device)第6章生成对抗网络与深度生成模型一、问答题
1.简述对抗生成网络的概念和作用。答:对抗生成网络的概念:GAN是一种深度学习模型,由生成器和判别器两个网络通过对抗博弈训练。生成器生成模拟真实数据的样本,判别器区分样本是真实数据还是生成器伪造的,二者相互迭代优化,最终达到纳什均衡。对抗生成网络的作用:核心是生成逼真的合成数据,同时能学习数据的潜在分布,为无监督/半监督学习提供强大工具。列举并简述对抗生成网络的主要变体。下面列举对抗生成网络的主要变体
-DCGAN(深度卷积GAN):用卷积层替代全连接层,生成器和判别器均采用转置卷积/卷积结构,大幅提升图像生成质量,是图像GAN的基础框架。-CGAN(条件GAN):在生成器和判别器中加入条件信息(如标签、属性),可定向生成特定类别的数据(如生成指定数字的手写体)。-CycleGAN(循环GAN):用于跨域图像转换,无需成对数据,通过“循环一致性损失”实现双向转换(如马→斑马、照片→油画)。-WGAN(WassersteinGAN):改进损失函数,用Wasserstein距离替代JS散度,解决GAN训练不稳定、模式崩溃问题,提升生成多样性。-StyleGAN:引入风格迁移思想,可精细控制生成图像的风格(如人脸的发型、表情),生成超高分辨率、细节丰富的图像。列举深度生成模型的应用场景。下面列举深度生成模型的主要应用场景-图像领域:图像生成(如人脸、风景)、图像修复(补全老照片破损部分)、图像编辑(换脸、风格转换)、超分辨率重建。-自然语言处理:文本生成(诗歌、小说、新闻)、对话系统(生成自然回复)、文本摘要与翻译。-语音领域:语音合成(TTS)、语音转换(变声、跨语言语音转换)、语音修复(去噪、补全)。-跨模态生成:文本生成图像(如DALL·E)、图像生成文本(图像描述)、语音生成文本(ASR)。-其他场景:数据增强(生成标注样本提升模型泛化能力)、异常检测(通过学习正常数据分布识别异常)、药物分子生成(设计新型药物分子结构)。二、实践题
构建基于PyTorch框架和FashionMNIST数据来源实现DCGAN生成手写数字图像。要求:基于PyTorch深度学习框架,选择GPU运行环境运行。答:以下是完整的DCGAN实现代码,包含数据加载、网络构建、训练流程及图像生成,适配GPU运行环境。importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transformsfromtorchvision.utilsimportsave_imageimportmatplotlib.pyplotaspltimportnumpyasnp#--------------------------1.环境配置与参数设置--------------------------#设备配置(自动检测GPU)device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")print(f"使用设备:{device}")#超参数设置latent_dim=100#噪声向量维度img_channels=1#图像通道数(FashionMNIST为灰度图)img_size=28#图像尺寸(28x28)batch_size=128epochs=50lr=0.0002beta1=0.5#Adam优化器动量参数#--------------------------2.数据加载(FashionMNIST)--------------------------#图像预处理:归一化到[-1,1](DCGAN常用)transform=transforms.Compose([transforms.Resize(img_size),transforms.ToTensor(),transforms.Normalize([0.5],[0.5])#灰度图单通道归一化])#加载FashionMNIST数据集dataset=datasets.FashionMNIST(root='./data',train=True,download=True,transform=transform)dataloader=DataLoader(dataset,batch_size=batch_size,shuffle=True,num_workers=2)#--------------------------3.生成器(Generator)构建--------------------------classGenerator(nn.Module):def__init__(self):super(Generator,self).__init__()self.model=nn.Sequential(#输入:(batch_size,latent_dim,1,1)nn.ConvTranspose2d(latent_dim,512,4,1,0,bias=False),nn.BatchNorm2d(512),nn.ReLU(True),#输出:(batch_size,512,4,4)nn.ConvTranspose2d(512,256,4,2,1,bias=False),nn.BatchNorm2d(256),nn.ReLU(True),#输出:(batch_size,256,8,8)nn.ConvTranspose2d(256,128,4,2,1,bias=False),nn.BatchNorm2d(128),nn.ReLU(True),#输出:(batch_size,128,16,16)nn.ConvTranspose2d(128,64,4,2,1,bias=False),nn.BatchNorm2d(64),nn.ReLU(True),#输出:(batch_size,64,32,32)nn.ConvTranspose2d(64,img_channels,4,2,15,bias=False),#调整padding适配28x28nn.Tanh()#输出归一化到[-1,1]#最终输出:(batch_size,1,28,28))defforward(self,x):returnself.model(x)#--------------------------4.判别器(Discriminator)构建--------------------------classDiscriminator(nn.Module):def__init__(self):super(Discriminator,self).__init__()self.model=nn.Sequential(#输入:(batch_size,1,28,28)nn.Conv2d(img_channels,64,4,2,1,bias=False),nn.LeakyReLU(0.2,inplace=True),#输出:(batch_size,64,14,14)nn.Conv2d(64,128,4,2,1,bias=False),nn.BatchNorm2d(128),nn.LeakyReLU(0.2,inplace=True),#输出:(batch_size,128,7,7)nn.Conv2d(128,256,4,2,1,bias=False),nn.BatchNorm2d(256),nn.LeakyReLU(0.2,inplace=True),#输出:(batch_size,256,3,3)nn.Conv2d(256,512,4,2,1,bias=False),nn.BatchNorm2d(512),nn.LeakyReLU(0.2,inplace=True),#输出:(batch_size,512,1,1)nn.Conv2d(512,1,3,1,0,bias=False),nn.Sigmoid()#输出概率(0-1))defforward(self,x):returnself.model(x).view(-1,1)#展平为(batch_size,1)#--------------------------5.模型初始化与配置--------------------------#初始化生成器和判别器并移至GPUgenerator=Generator().to(device)discriminator=Discriminator().to(device)#损失函数(二分类交叉熵)criterion=nn.BCELoss()#优化器(Adam)optimizer_G=optim.Adam(generator.parameters(),lr=lr,betas=(beta1,0.999))optimizer_D=optim.Adam(discriminator.parameters(),lr=lr,betas=(beta1,0.999))#固定噪声(用于训练过程中可视化生成效果)fixed_noise=torch.randn(16,latent_dim,1,1).to(device)#--------------------------6.训练流程--------------------------print("开始训练...")forepochinrange(epochs):fori,(real_imgs,_)inenumerate(dataloader):batch_size=real_imgs.size(0)real_imgs=real_imgs.to(device)#--------------------------训练判别器--------------------------#标签:真实图像为1,生成图像为0real_labels=torch.ones(batch_size,1).to(device)fake_labels=torch.zeros(batch_size,1).to(device)#1.判别真实图像output=discriminator(real_imgs)d_loss_real=criterion(output,real_labels)#2.判别生成图像noise=torch.randn(batch_size,latent_dim,1,1).to(device)fake_imgs=generator(noise)output=discriminator(fake_imgs.detach())#冻结生成器d_loss_fake=criterion(output,fake_labels)#3.判别器总损失与优化d_loss=d_loss_real+d_loss_fakeoptimizer_D.zero_grad()d_loss.backward()optimizer_D.step()#--------------------------训练生成器--------------------------#生成器希望判别器将生成图像判为1output=discriminator(fake_imgs)g_loss=criterion(output,real_labels)#生成器损失与优化optimizer_G.zero_grad()g_loss.backward()optimizer_G.step()#--------------------------打印日志--------------------------if(i+1)%100==0:print(f"Epoch[{epoch+1}/{epochs}],Step[{i+1}/{len(dataloader)}],"f"D_Loss:{d_loss.item():.4f},G_Loss:{g_loss.item():.4f}")#--------------------------保存生成图像--------------------------generator.eval()#评估模式withtorch.no_grad():fake_imgs=generator(fixed_noise)#反归一化(从[-1,1]到[0,1])fake_imgs=fake_imgs/2+0.5save_image(fake_imgs,f'generated_imgs/epoch_{epoch+1}.png',nrow=4)generator.train()#恢复训练模式#--------------------------7.模型保存--------------------------torch.save(generator.state_dict(),'generator.pth')torch.save(discriminator.state_dict(),'discriminator.pth')print("训练完成!模型已保存。")#--------------------------8.生成图像可视化--------------------------defshow_generated_imgs():generator.load_state_dict(torch.load('generator.pth'))generator.to(device)generator.eval()withtorch.no_grad():noise=torch.randn(9,latent_dim,1,1).to(device)generated_imgs=generator(noise)generated_imgs=generated_imgs/2+0.5#反归一化#绘制9张生成图像fig,axes=plt.subplots(3,3,figsize=(9,9))fori,axinenumerate(axes.flat):img=generated_imgs[i].cpu().numpy().squeeze()#转为numpy并去除通道维ax.imshow(img,cmap='gray')ax.axis('off')plt.suptitle('DCGANGeneratedFashionMNISTImages',fontsize=16)plt.show()#调用可视化函数show_generated_imgs()第7章大模型概述问答题
1.简述Transformer模型的基本结构。答:Transformer模型核心基于自注意力机制,由编码器(Encoder)和解码器(Decoder)两大模块构成,辅以输入嵌入、位置编码、层归一化及全连接层。编码器通常堆叠N个相同层,每层含多头自注意力机制与前馈神经网络,且均搭配残差连接和层归一化,负责提取输入序列的全局上下文特征;解码器同样堆叠N层,在编码器层结构基础上,新增掩码多头自注意力(防止前瞻)和编码器-解码器交叉注意力(关联输入特征),负责逐元素生成目标序列。输入嵌入将离散元素转为向量,位置编码注入序列顺序信息,最终通过输出层映射为目标词汇概率分布,实现并行计算与全局依赖捕捉。简述Transformer模型中编码器的工作流程。答:编码器先对输入序列做嵌入转换,叠加位置编码以注入顺序信息,得到初始向量。随后向量进入多头自注意力机制,通过拆分查询、键、值并独立计算注意力,捕捉全局依赖后拼接投影。接着经残差连接与层归一化稳定训练,再输入前馈神经网络进行非线性映射。最后重复残差连接与层归一化,形成单编码器层输出。该流程堆叠N次后,输出含全局上下文特征的向量,完成输入序列的特征提取。
3.简述Transformer模型中解码器的工作流程。答:解码器先对目标序列做嵌入转换并叠加位置编码,得到初始向量。向量先经掩码多头自注意力机制(屏蔽后续信息)捕捉前文依赖,再通过残差连接与层归一化。随后进入交叉注意力机制,以自身输出为查询、编码器输出为键值,关联输入序列特征,同样经残差连接与层归一化。接着输入前馈神经网络做非线性映射,再经残差连接与层归一化,形成单解码器层输出。该流程堆叠N次后,通过输出层映射为词汇概率分布,逐元素生成目标序列。二、实践题
利用BERT模型进行英文文本的精准分类任务。要求:使用PyTorch和Transformers库包,数据集任选。答:基于PyTorch和Transformers库实现BERT英文文本精准分类的完整代码示例,选用经典的IMDB影评情感分类数据集(二分类:正面/负面),代码兼顾可读性与实用性,包含数据预处理、模型构建、训练及评估全流程。运行环境准备#安装依赖库包pipinstalltorchtransformersdatasetsscikit-learn2、代码实现importtorchimporttorch.nnasnnfromtorch.utils.dataimportDataLoaderfromtransformersimportBertTokenizer,BertForSequenceClassification,AdamWfromtransformersimportget_linear_schedule_with_warmupfromdatasetsimportload_datasetfromsklearn.metricsimportaccuracy_score,classification_report#1.配置参数DEVICE=torch.device("cuda"iftorch.cuda.is_available()else"cpu")MODEL_NAME="bert-base-uncased"#基础版BERT(小写英文)BATCH_SIZE=16EPOCHS=3LEARNING_RATE=2e-5MAX_SEQ_LEN=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年小浣熊美术教案
- 2025-2026学年大班音乐《买菜》教案
- 2025-2026学年践行诚信教学设计
- 电池厂釜体清洗制度
- 2025-2026学年教案分析论文
- 2025-2026学年配音教学设计灵感
- 职业病诊断鉴定流程及要求
- 饮用水检测报告扫码公示管理办法
- 职业规划管理强化
- 2025-2026学年用彩墨画鱼大单元教学设计
- 2026年伊春职业学院单招职业适应性考试题库附参考答案详解(b卷)
- 2026官方离婚协议书(标准版)
- 2026年湖南铁道职业技术学院单招职业技能笔试备考试题含答案解析
- 清洁生产审核制度
- 伤口造口专科护理标准化体系构建与临床实践全指南
- 三维成像技术课件
- 2026年青岛港湾职业技术学院单招综合素质笔试备考试题附答案详解
- (2025)泵站运行工中高级考试题库含答案
- 2025年广东省深圳市中考道德与法治真题(含答案)
- 《液压与气压传动 第5版》课后习题答案
- 2026年永州职业技术学院单招职业技能考试题库及答案详解1套
评论
0/150
提交评论