版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
人工智能导论实验指导手册目录第2章人工智能数学基础 1实验一.全批量梯度下降与小批量梯度下降的优化轨迹对比 1实验二多种优化算法的迭代行为与收敛特性对比 3第3章机器学习基础 8实验一.“泰坦尼克号:生还预测”数据集分类 8实验二.“心衰临床记录”数据集分析 9实验三.“fruits-360”数据集中的苹果图像分类 12实验四.通过动态规划求解迷宫寻路任务的最优策略 16第4章深度学习新方法 21实验一.基于激活最大化的卷积神经网络可视化 21实验二.基于集成梯度算法的归因可视化 23第6章智能体系统 27实验一.基于工具函数调用的智能体任务执行 27实验二.单智能体闭环流程模拟 29第7章人工智能实践 32实验一.旧金山犯罪分类数据集多分类预测 32实验二.基于DQN的CartPole平衡控制 34实验三.KaggleTitanic乘客生存预测 37第2章人工智能数学基础实验一.全批量梯度下降与小批量梯度下降的优化轨迹对比1.实验目的(1)理解批量大小(BatchSize)对梯度估计稳定性、参数更新路径的影响,掌握全批量梯度下降(FGD)与小批量梯度下降(MBGD)的差异。;(2)掌握线性回归模型下均方误差(MSE)目标函数的构造方法,以及基于负梯度方向更新模型参数的基本流程。(3)学会在参数空间中绘制损失等高线并叠加优化轨迹,从可视化角度对比两种方法的“平滑下降”与“振荡前行”。2.实验准备安装Python3.8及以上版本,并确保已安装NumPy与Matplotlib两个依赖库(命令:pipinstallnumpymatplotlib)。3.实验内容编写程序,按以下步骤完成。(1)生成合成数据。设输入服从标准正态分布,噪声项ε服从均值为0、标准差为0.4的正态分布,按方程生成100条样本作为训练集。(2)定义均方误差损失函数,并实现其关于和的一阶偏导数。(3)实现批量梯度下降算法。统一从出发,学习率取0.05,训练50个轮次(Epoch),记录每次参数更新后的和。(4)分别按批量大小为100的全批量梯度下降(FGD)和批量大小为10的小批量梯度下降(MBGD)运行训练过程,并输出两组方法的最终参数。(5)在参数平面上计算MSE损失等高线,将两种方法的优化轨迹叠加在等高线图上,并标注起始点与全局最优点。(6)完成结果分析。从轨迹平滑程度、更新次数、最终参数三个角度,说明小批量随机性对优化过程的影响,并将图像保存为PNG图片。4.参考代码importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#1.全局参数设置SEED=42LR=0.05EPOCHS=50N_SAMPLES=100TRUE_W,TRUE_B=2.0,1.0INIT_W,INIT_B=-2.0,3.0#2.生成合成数据y=2x+1+epsilonnp.random.seed(SEED)X=np.random.randn(N_SAMPLES)noise=np.random.randn(N_SAMPLES)*0.4y=TRUE_W*X+TRUE_B+noise#3.均方误差损失与梯度defmse_loss(w,b,X,y):returnnp.mean((y-(w*X+b))**2)defmse_grad(w,b,X,y):pred=w*X+bgrad_w=-2.0*np.mean(X*(y-pred))grad_b=-2.0*np.mean(y-pred)returngrad_w,grad_b#4.梯度下降训练deftrain(batch_size):np.random.seed(SEED)w,b=INIT_W,INIT_Bw_hist,b_hist=[w],[b]indices=np.arange(N_SAMPLES)forepochinrange(EPOCHS):np.random.shuffle(indices)forstartinrange(0,N_SAMPLES,batch_size):idx=indices[start:start+batch_size]gw,gb=mse_grad(w,b,X[idx],y[idx])w-=LR*gwb-=LR*gbw_hist.append(w)b_hist.append(b)returnnp.array(w_hist),np.array(b_hist)fgd_w,fgd_b=train(batch_size=100)mbgd_w,mbgd_b=train(batch_size=10)#5.可视化:损失等高线+优化轨迹defplot_results():w_range=np.linspace(-3.0,3.5,100)b_range=np.linspace(-0.5,4.5,100)W_grid,B_grid=np.meshgrid(w_range,b_range)Z_loss=np.zeros_like(W_grid)foriinrange(W_grid.shape[0]):forjinrange(W_grid.shape[1]):Z_loss[i,j]=mse_loss(W_grid[i,j],B_grid[i,j],X,y)fig,ax=plt.subplots(figsize=(8,7))levels=np.arange(0.5,8.0,0.8)cntr=ax.contour(W_grid,B_grid,Z_loss,levels=levels,colors='gray',linewidths=1.0,alpha=0.7)ax.clabel(cntr,inline=True,fontsize=8,fmt='%.1f')ax.plot(mbgd_w,mbgd_b,color='black',linestyle='--',linewidth=2.0,alpha=0.8,label='小批量梯度下降(MBGD)')ax.plot(fgd_w,fgd_b,color='#2e7fb7',linestyle='-',linewidth=2.5,alpha=0.9,zorder=10,label='全批量梯度下降(FGD)')ax.plot(INIT_W,INIT_B,marker='o',color='black',markersize=8,linestyle='None',zorder=11,label='起始点')ax.plot(TRUE_W,TRUE_B,marker='*',color='#2e7fb7',markersize=16,linestyle='None',zorder=12,label='全局最优点')ax.set_xlabel('权重参数w',fontsize=14)ax.set_ylabel('偏置参数b',fontsize=14)ax.legend(loc='upperleft',fontsize=12)ax.grid(True,linestyle=':',alpha=0.4)ax.set_xlim(-2.8,3.2)ax.set_ylim(-0.2,4.2)plt.tight_layout()plt.savefig('case2_1_result.png',bbox_inches='tight',dpi=300)plt.show()if__name__=="__main__":plot_results()实验二多种优化算法的迭代行为与收敛特性对比1.实验目的(1)理解Rosenbrock函数作为非凸优化测试函数的典型特征,认识狭长谷形目标函数给梯度优化带来的困难。(2)掌握SGD、Momentum、Adagrad、RMSprop与Adam五种优化算法的更新规则,理解动量项、历史梯度累积与自适应学习率机制的作用。(3)学会通过参数空间优化轨迹图与目标函数对数收敛曲线,对比不同算法的收敛速度、稳定性与路径形态。2.实验准备安装Python3.8及以上版本,并确保已安装NumPy与Matplotlib两个依赖库(命令:pipinstallnumpymatplotlib)。3.实验内容编写程序,按以下步骤完成。(1)实现Rosenbrock函数,其全局最优解为,对应函数值为0。(2)计算其一阶偏导数,实现,其中,。(3)设置停止条件,综合使用梯度范数、函数值变化、位置变化与最大迭代次数4种准则判断算法是否收敛。(4)分别实现SGD、Momentum、Adagrad、RMSprop与Adam五种参数更新规则,统一从初始点出发,记录优化轨迹与目标函数值序列。(5)绘制双子图。左图绘制Rosenbrock函数的等高线,并叠加5种算法的优化轨迹;右图绘制目标函数值随迭代次数变化的半对数曲线。(6)完成结果分析。比较5种算法的迭代次数、最终点与最终函数值,结合动量与自适应学习率机制说明收敛差异,并将图像保存为PNG图片。4.参考代码importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=Falsedeffun(x,y):"""Rosenbrock函数"""return(1-x)**2+100*(y-x**2)**2defgrad(x,y):df_dx=-2*(1-x)-400*x*(y-x**2)df_dy=200*(y-x**2)returndf_dx,df_dy#停止条件GRADIENT_TOL=1e-6FUNCTION_TOL=1e-8POSITION_TOL=1e-8MAX_ITER=3000defcheck_convergence(x_new,y_new,x_old,y_old,dx,dy,f_new,f_old,k):ifnp.hypot(dx,dy)<GRADIENT_TOL:returnTrueifk>0andabs(f_new-f_old)<FUNCTION_TOL:returnTrueifk>0andnp.hypot(x_new-x_old,y_new-y_old)<POSITION_TOL:returnTruereturnk>=MAX_ITER-1defrun_optimizer(name,lr=1e-3,**kwargs):x,y=-1.2,1.0path_x,path_y=[x],[y]f_values=[fun(x,y)]vx=vy=0#MomentumGx=Gy=0#AdagradSx=Sy=0#RMSpropmx=my=0#Adam一阶矩vax=vay=0#Adam二阶矩x_old,y_old,f_old=x,y,f_values[0]foriinrange(MAX_ITER):dx,dy=grad(x,y)ifname=='SGD':x-=lr*dxy-=lr*dyelifname=='Momentum':m=kwargs.get('momentum',0.9)vx=m*vx+lr*dxvy=m*vy+lr*dyx-=vxy-=vyelifname=='Adagrad':eps=1e-8Gx+=dx**2Gy+=dy**2x-=lr/np.sqrt(Gx+eps)*dxy-=lr/np.sqrt(Gy+eps)*dyelifname=='RMSprop':d=kwargs.get('decay_rate',0.9)eps=1e-8Sx=d*Sx+(1-d)*dx**2Sy=d*Sy+(1-d)*dy**2x-=lr/np.sqrt(Sx+eps)*dxy-=lr/np.sqrt(Sy+eps)*dyelifname=='Adam':b1=kwargs.get('beta1',0.9)b2=kwargs.get('beta2',0.999)eps=1e-8mx=b1*mx+(1-b1)*dxmy=b1*my+(1-b1)*dyvax=b2*vax+(1-b2)*dx**2vay=b2*vay+(1-b2)*dy**2mxh=mx/(1-b1**(i+1))myh=my/(1-b1**(i+1))vxh=vax/(1-b2**(i+1))vyh=vay/(1-b2**(i+1))x-=lr*mxh/(np.sqrt(vxh)+eps)y-=lr*myh/(np.sqrt(vyh)+eps)f_new=fun(x,y)path_x.append(x)path_y.append(y)f_values.append(f_new)ifcheck_convergence(x,y,x_old,y_old,dx,dy,f_new,f_old,i):breakx_old,y_old,f_old=x,y,f_newreturn{'path_x':np.array(path_x),'path_y':np.array(path_y),'f_values':np.array(f_values),'iterations':i+1}#运行5种优化算法results={'SGD':run_optimizer('SGD',lr=0.002),'Momentum':run_optimizer('Momentum',lr=0.001,momentum=0.9),'Adagrad':run_optimizer('Adagrad',lr=0.2),'RMSprop':run_optimizer('RMSprop',lr=0.01),'Adam':run_optimizer('Adam',lr=0.05),}#绘图:左图轨迹,右图收敛曲线defplot_results(results):fig,axes=plt.subplots(1,2,figsize=(14,6),constrained_layout=True)THEME_BLUE='#2e7fb7'styles={'SGD':{'color':'#999999','linestyle':':','linewidth':2.0},'Momentum':{'color':'black','linestyle':'--','linewidth':1.8},'Adagrad':{'color':'black','linestyle':'-.','linewidth':1.8},'RMSprop':{'color':THEME_BLUE,'linestyle':'--','linewidth':2.0},'Adam':{'color':THEME_BLUE,'linestyle':'-','linewidth':2.5},}#子图1:优化轨迹ax1=axes[0]x_range=np.linspace(-1.5,1.5,200)y_range=np.linspace(-0.5,1.5,200)X,Y=np.meshgrid(x_range,y_range)Z=fun(X,Y)levels=np.logspace(-1,3,20)ax1.contour(X,Y,Z,levels=levels,colors='lightgray',linewidths=1.0,alpha=0.8)forname,styleinstyles.items():d=results[name]px,py=d['path_x'],d['path_y']iflen(px)>1000:idx=np.linspace(0,len(px)-1,1000,dtype=int)px,py=px[idx],py[idx]ax1.plot(px,py,label=name,**style,alpha=0.9)ax1.plot(-1.2,1.0,'ko',markersize=8,label='起始点',zorder=10)ax1.plot(1.0,1.0,'*',color=THEME_BLUE,markersize=16,label='全局最优点',zorder=10)ax1.set_xlabel('参数w1',fontsize=14)ax1.set_ylabel('参数w2',fontsize=14)ax1.set_xlim(-1.4,1.4)ax1.set_ylim(-0.2,1.4)ax1.legend(loc='best',fontsize=11)ax1.grid(True,linestyle=':',alpha=0.3)#子图2:目标函数收敛曲线(半对数)ax2=axes[1]forname,styleinstyles.items():ax2.semilogy(results[name]['f_values'],label=name,**style,alpha=0.9)ax2.set_xlabel('迭代次数',fontsize=14)ax2.set_ylabel('目标函数值f(x)(对数刻度)',fontsize=14)ax2.set_xlim(0,500)ax2.grid(True,linestyle=':',alpha=0.3,which='both')ax2.legend(loc='best',fontsize=11)plt.savefig('case2_2_result.png',bbox_inches='tight',dpi=300)plt.show()if__name__=="__main__":plot_results(results)
第3章机器学习基础实验一.“泰坦尼克号:生还预测”数据集分类1.实验目的(1)掌握如何通过XGBoost模型实现数据集分类;(2)掌握k折交叉验证方法。2.实验准备实验环境配置:通过anaconda等工具配置python、pandas、numpy、matplotlib、sklearn等必要的基础环境及扩展程序库。3.实验内容(1)下载“泰坦尼克号:生还预测”数据集(下载地址:/datasciencedojo/datasets/master/titanic.csv);(2)通过一个包含了10棵决策树的XGBoost模型对数据集进行分类;(3)通过5折交叉验证进行实验验证,最终输出该模型在该数据集上的平均准确率。4.参考代码importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimportKFoldfromsklearn.metricsimportaccuracy_scorefromsklearn.ensembleimportRandomForestClassifierfrommatplotlib.font_managerimportFontProperties#==========================================#1.字体与排版配置#==========================================plt.rcParams['font.family']='serif'plt.rcParams['font.serif']=['TimesNewRoman']plt.rcParams['axes.unicode_minus']=Falseplt.rcParams['mathtext.fontset']='stix'zh_fonts=['SimHei','NotoSansCJKSC','MicrosoftYaHei','sans-serif']font_label=FontProperties(family=zh_fonts,size=18)font_tick=FontProperties(family=zh_fonts,size=14)#==========================================#2.数据获取与5-Fold执行#==========================================url="/datasciencedojo/datasets/master/titanic.csv"df=pd.read_csv(url)X=df[['Pclass','Sex','Age']].copy()X['Sex']=X['Sex'].map({'female':0,'male':1})X['Age']=X['Age'].fillna(X['Age'].median())y=df['Survived']kf=KFold(n_splits=5,shuffle=True,random_state=42)fold_accuracies=[]forfold_idx,(train_idx,val_idx)inenumerate(kf.split(X)):X_train,X_val=X.iloc[train_idx],X.iloc[val_idx]y_train,y_val=y.iloc[train_idx],y.iloc[val_idx]clf=RandomForestClassifier(n_estimators=10,max_depth=3,random_state=42)clf.fit(X_train,y_train)fold_accuracies.append(accuracy_score(y_val,clf.predict(X_val)))#==========================================#3.可视化绘制#==========================================fig,ax=plt.subplots(figsize=(12,6),facecolor='white')folds_label=[rf"第${i+1}$折"foriinrange(5)]ax.bar(folds_label,fold_accuracies,color='0.9',edgecolor='black',linewidth=1.2)mean_acc=np.mean(fold_accuracies)print(mean_acc)ax.axhline(mean_acc,color='#1f77b4',linestyle='--',linewidth=2.5)text_str=rf"平均准确率:${mean_acc*100:.2f}\%$"ax.text(0.5,mean_acc+0.01,text_str,color='#1f77b4',ha='center',va='bottom',fontproperties=font_label)#标签处理ax.set_ylabel(r"预测准确率",fontproperties=font_label)ax.set_xlabel(r"验证折数",fontproperties=font_label)#纵轴设置ax.set_ylim(0.6,0.88)current_ticks=ax.get_yticks()ax.set_yticks(current_ticks[:-1])ax.set_yticklabels([rf"${t:.1f}$"fortincurrent_ticks[:-1]],fontproperties=font_tick)#刻度设置ax.set_xticklabels(folds_label,fontproperties=font_tick)forlabelinax.get_yticklabels():label.set_fontproperties(font_tick)#移除冗余边框ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.grid(axis='y',linestyle=':',alpha=0.5)plt.tight_layout()plt.show()实验二.“心衰临床记录”数据集分析1.实验目的(1)理解逻辑回归模型在二分类任务中的基本应用;(2)掌握临床记录数据的标准化处理与特征贡献分析方法。2.实验准备实验环境配置:通过anaconda等工具配置python、pandas、matplotlib、seaborn、sklearn等必要的基础环境及扩展程序库。3.实验内容(1)下载“心衰临床记录”数据集(下载地址:/ml/machine-learning-databases/00519/heart_failure_clinical_records_dataset.csv);(2)对临床特征进行标准化处理,并训练逻辑回归模型预测死亡事件;(3)根据模型标准化系数分析各临床指标对心衰风险的影响,并绘制特征贡献柱状图。4.参考代码importpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.linear_modelimportLogisticRegressionfromsklearn.preprocessingimportStandardScalerimportmatplotlib.font_managerasfm#==========================================#1.字体底层配置:确保中英文字体正确加载#==========================================defget_font_names():zh_font='SimHei'en_font='TimesNewRoman'fonts=[forfinfm.fontManager.ttflist]ifzh_fontnotinfonts:zh_font='sans-serif'ifen_fontnotinfonts:en_font='serif'returnzh_font,en_fontzh_font_name,en_font_name=get_font_names()#设定全局字号LABEL_SIZE=18TICK_SIZE=14#==========================================#2.数据处理与建模(Kaggle心力衰竭数据集)#==========================================url="/ml/machine-learning-databases/00519/heart_failure_clinical_records_dataset.csv"df=pd.read_csv(url)feature_mapping={'age':'年龄','anaemia':'贫血','creatinine_phosphokinase':'肌酸激酶','diabetes':'糖尿病','ejection_fraction':'射血分数','high_blood_pressure':'高血压','platelets':'血小板','serum_creatinine':'血清肌酐','serum_sodium':'血清钠','sex':'性别','smoking':'吸烟'}X=df[list(feature_mapping.keys())]y=df['DEATH_EVENT']scaler=StandardScaler()X_scaled=scaler.fit_transform(X)model=LogisticRegression(penalty='l2',C=1.0)model.fit(X_scaled,y)attr_df=pd.DataFrame({'特征':[feature_mapping[f]forfinfeature_mapping.keys()],'标准化系数':model.coef_[0]}).sort_values(by='标准化系数',ascending=False)#==========================================#3.绘图#==========================================fig,ax=plt.subplots(figsize=(12,6),facecolor='white')#使用灰度值:深灰(0.3)代表正向风险,浅灰(0.7)代表负向保护#添加黑色边框(edgecolor)提升印刷清晰度colors=['0.3'ifx>0else'0.7'forxinattr_df['标准化系数']]sns.barplot(x='标准化系数',y='特征',data=attr_df,palette=colors,edgecolor='black',linewidth=0.8,ax=ax)#设置标签ax.set_xlabel('标准化系数',fontsize=LABEL_SIZE,fontname=zh_font_name)ax.set_ylabel('临床特征指标',fontsize=LABEL_SIZE,fontname=zh_font_name)#显式设置刻度字体forlabelinax.get_yticklabels():label.set_fontname(zh_font_name)label.set_fontsize(TICK_SIZE)forlabelinax.get_xticklabels():label.set_fontname(en_font_name)label.set_fontsize(TICK_SIZE)#绘制中心参考线ax.axvline(0,color='black',linestyle='-',linewidth=1.0)#设置网格ax.grid(axis='x',linestyle='--',alpha=0.3,color='gray')#添加黑白图例(Legend)frommatplotlib.patchesimportPatchlegend_elements=[Patch(facecolor='0.3',edgecolor='black',label='增加风险'),Patch(facecolor='0.7',edgecolor='black',label='降低风险')]leg=ax.legend(handles=legend_elements,loc='lowerright',prop={'family':zh_font_name,'size':TICK_SIZE},frameon=True)leg.get_frame().set_edgecolor('black')plt.tight_layout()plt.show()实验三.“fruits-360”数据集中的苹果图像分类1.实验目的(1)了解卷积神经网络在图像分类任务中的基本结构与训练流程;(2)掌握使用PyTorch和torchvision构建、训练和评估图像分类模型的方法。2.实验准备实验环境配置:通过anaconda等工具配置python、torch、torchvision、numpy等必要的深度学习环境及扩展程序库,并准备fruits-360数据集。3.实验内容(1)下载并整理fruits-360数据集,按照Training和Test目录组织图像数据;(2)构建包含卷积层、批归一化、池化层和全连接层的卷积神经网络;(3)完成数据增强、模型训练、验证评估和最优模型保存,输出苹果图像分类结果。4.参考代码(用于训练一个简单的卷积神经网络以进行苹果分类)importos,math,time,copy,argparsefrompathlibimportPathimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFfromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transforms##Model#classCNN64BN(nn.Module):def__init__(self,in_ch=3,num_classes=131,p_drop=0.3):super().__init__()self.features=nn.Sequential(#64x64nn.Conv2d(in_ch,16,3,padding=1,bias=False),nn.BatchNorm2d(16),nn.ReLU(inplace=True),nn.MaxPool2d(2),#32x32nn.Conv2d(16,32,3,padding=1,bias=False),nn.BatchNorm2d(32),nn.ReLU(inplace=True),nn.MaxPool2d(2),#16x16nn.Conv2d(32,32,3,padding=1,bias=False),nn.BatchNorm2d(32),nn.ReLU(inplace=True),nn.MaxPool2d(2),#8x8nn.Conv2d(32,64,3,padding=1,bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(2),#4x4)self.classifier=nn.Sequential(nn.Flatten(),#4*4*64=1024nn.Dropout(p_drop),nn.Linear(1024,256),nn.ReLU(inplace=True),nn.Dropout(p_drop),nn.Linear(256,num_classes))defforward(self,x):x=self.features(x)x=self.classifier(x)returnx##LabelSmoothingCE#classLabelSmoothingCrossEntropy(nn.Module):def__init__(self,smoothing=0.1):super().__init__()self.smoothing=smoothingdefforward(self,preds,target):#preds:(N,C),target:(N,)n_classes=preds.size(-1)log_probs=F.log_softmax(preds,dim=-1)withtorch.no_grad():true_dist=torch.zeros_like(log_probs)true_dist.fill_(self.smoothing/(n_classes-1))true_dist.scatter_(1,target.unsqueeze(1),1.0-self.smoothing)returntorch.mean(torch.sum(-true_dist*log_probs,dim=-1))##Utilities#defaccuracy(logits,y):preds=logits.argmax(dim=1)return(preds==y).float().mean().item()defget_loaders(data_root,img_size=64,batch_size=128,num_workers=4):mean=[0.485,0.456,0.406]std=[0.229,0.224,0.225]train_tfms=transforms.Compose([transforms.RandomResizedCrop(img_size,scale=(0.7,1.0)),transforms.RandomHorizontalFlip(),transforms.RandomRotation(10),transforms.ColorJitter(0.2,0.2,0.2,0.1),transforms.ToTensor(),transforms.Normalize(mean,std),])val_tfms=transforms.Compose([transforms.Resize(int(img_size*1.15)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize(mean,std),])train_dir=Path(data_root)/"Training"val_dir=Path(data_root)/"Test"train_ds=datasets.ImageFolder(train_dir,transform=train_tfms)val_ds=datasets.ImageFolder(val_dir,transform=val_tfms)train_loader=DataLoader(train_ds,batch_size=batch_size,shuffle=True,num_workers=num_workers,pin_memory=True)val_loader=DataLoader(val_ds,batch_size=batch_size,shuffle=False,num_workers=num_workers,pin_memory=True)returntrain_loader,val_loader,len(train_ds.classes)defcosine_warmup(optimizer,total_steps,warmup_steps=500,min_lr=1e-6):deflr_lambda(step):ifstep<warmup_steps:return(step+1)/warmup_stepsprogress=(step-warmup_steps)/max(1,total_steps-warmup_steps)returnmin_lr+0.5*(1-min_lr)*(1+math.cos(math.pi*progress))returntorch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda)##Train/Validate#deftrain_one_epoch(model,loader,optimizer,scaler,criterion,device,max_grad_norm=1.0):model.train()loss_sum,acc_sum,n=0.0,0.0,0forimgs,labelsinloader:imgs,labels=imgs.to(device,non_blocking=True),labels.to(device,non_blocking=True)optimizer.zero_grad(set_to_none=True)withtorch.cuda.amp.autocast(enabled=(device.type=='cuda')):logits=model(imgs)loss=criterion(logits,labels)scaler.scale(loss).backward()ifmax_grad_normisnotNone:scaler.unscale_(optimizer)torch.nn.utils.clip_grad_norm_(model.parameters(),max_grad_norm)scaler.step(optimizer)scaler.update()bs=labels.size(0)loss_sum+=loss.item()*bsacc_sum+=accuracy(logits.detach(),labels)*bsn+=bsreturnloss_sum/n,acc_sum/n@torch.no_grad()defevaluate(model,loader,criterion,device):model.eval()loss_sum,acc_sum,n=0.0,0.0,0forimgs,labelsinloader:imgs,labels=imgs.to(device,non_blocking=True),labels.to(device,non_blocking=True)logits=model(imgs)loss=criterion(logits,labels)bs=labels.size(0)loss_sum+=loss.item()*bsacc_sum+=accuracy(logits,labels)*bsn+=bsreturnloss_sum/n,acc_sum/n##Main#defmain():parser=argparse.ArgumentParser()parser.add_argument('--data',type=str,required=True,help='pathtofruits-360root(containsTraining/andTest/)')parser.add_argument('--epochs',type=int,default=40)parser.add_argument('--batch-size',type=int,default=128)parser.add_argument('--lr',type=float,default=3e-4)parser.add_argument('--weight-decay',type=float,default=0.01)parser.add_argument('--img-size',type=int,default=64)parser.add_argument('--num-workers',type=int,default=4)parser.add_argument('--label-smoothing',type=float,default=0.1)parser.add_argument('--patience',type=int,default=7,help='earlystoppingpatience(epochs)')parser.add_argument('--dropout',type=float,default=0.3)parser.add_argument('--seed',type=int,default=42)args=parser.parse_args()torch.manual_seed(args.seed)torch.cuda.manual_seed_all(args.seed)device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')train_loader,val_loader,num_classes=get_loaders(args.data,args.img_size,args.batch_size,args.num_workers)model=CNN64BN(in_ch=3,num_classes=num_classes,p_drop=args.dropout).to(device)criterion=LabelSmoothingCrossEntropy(smoothing=args.label_smoothing)optimizer=torch.optim.AdamW(model.parameters(),lr=args.lr,weight_decay=args.weight-decayifhasattr(args,'weight-decay')elseargs.weight_decay)total_steps=args.epochs*len(train_loader)scheduler=cosine_warmup(optimizer,total_steps,warmup_steps=min(500,total_steps//10))scaler=torch.cuda.amp.GradScaler(enabled=(device.type=='cuda'))best_acc,best_w=0.0,copy.deepcopy(model.state_dict())epochs_no_improve=0forepochinrange(1,args.epochs+1):t0=time.time()tr_loss,tr_acc=train_one_epoch(model,train_loader,optimizer,scaler,criterion,device)val_loss,val_acc=evaluate(model,val_loader,criterion,device)scheduler.step()dt=time.time()-t0print(f'Epoch{epoch:>3}/{args.epochs}|'f'trainloss{tr_loss:.4f}acc{tr_acc*100:5.2f}%|'f'valloss{val_loss:.4f}acc{val_acc*100:5.2f}%|'f'{dt:.1f}s')#Earlystoppingonval_accifval_acc>best_acc:best_acc=val_accbest_w=copy.deepcopy(model.state_dict())epochs_no_improve=0torch.save({'model':best_w,'acc':best_acc},'best_fruits360_cnn64bn.pth')else:epochs_no_improve+=1ifepochs_no_improve>=args.patience:print(f'Noimprovementfor{args.patience}epochs.Earlystop.')breakmodel.load_state_dict(best_w)val_loss,val_acc=evaluate(model,val_loader,criterion,device)print(f'BestValAcc:{best_acc*100:.2f}%|FinalEvalAcc:{val_acc*100:.2f}%')print('Savedweights->best_fruits360_cnn64bn.pth')if__name__=='__main__':main()实验四.通过动态规划求解迷宫寻路任务的最优策略1.实验目的(1)理解马尔可夫决策过程中的状态、动作、奖励和策略等基本概念;(2)掌握利用动态规划和值迭代方法求解迷宫寻路最优策略的过程。2.实验准备实验环境配置:通过anaconda等工具配置python、numpy、matplotlib等必要的基础环境及扩展程序库。3.实验内容(1)根据迷宫结构建立网格状态空间,设置墙体、陷阱、起点和目标位置;(2)定义不同状态动作对应的奖励函数,并通过值迭代计算各状态价值;(3)根据最优价值函数生成最优策略,并绘制包含状态价值和方向箭头的迷宫图。4.参考代码from__future__importannotationsfrompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpfrommatplotlib.colorsimportListedColormapfrommatplotlib.patchesimportRectangleOUTPUT_PATH=Path("exp-3-4.png")defbuild_grid()->np.ndarray: """Returna4x4layoutencodedbyintegersforplotting.""" #3:start,4:goal,2:trap,1:wall,0:freespace returnnp.array( [ [0,0,0,0], [0,1,1,0], [1,0,0,0], [0,0,0,0], ] )defbuild_rewards()->dict: """Returntherewardfunctionasperuserspecification.""" return{ (0,0):{3:1,1:-1},#(1,1)右+1,下-1 (0,1):{2:-1,3:1},#(1,2)左-1,右+1 (0,2):{2:-1,3:1},#(1,3)左-1,右+1 (0,3):{2:-1,1:1},#(1,4)左-1,下+1 (1,0):{0:1},#(2,1)上+1 (1,3):{0:-1,1:1},#(2,4)上-1,下+1 (2,1):{3:20,1:-1},#(3,2)右+20(目标),下-1 (2,3):{2:20,0:-1,1:-1},#(3,4)左+20(目标),上-1,下-1 (3,0):{3:1},#(4,1)右+1 (3,1):{2:-1,3:1,0:1},#(4,2)左-1,右+1,上+1 (3,2):{2:-1,3:-1,0:20},#(4,3)左-1,右-1,上+20(目标) (3,3):{2:1,0:1}#(4,4)左+1,上+1 }defbuild_colormap()->ListedColormap: """Createahigh-contrastgrayscalepaletteforeasierdifferentiation.""" colors=[ "#f7f7f7",#freespace "#c2c2c2",#wall "#6a6a6a",#trap "#111111",#start "#ffffff",#goal ] returnListedColormap(colors)defoverlay_textures(ax:plt.Axes,grid:np.ndarray)->None: """Addhatchtexturessowallsandtrapsremaindistinctingrayscaleprints.""" textures={ 1:{"hatch":"//","edgecolor":"#4a4a4a","linewidth":0.6}, 2:{"hatch":None,"edgecolor":"#4a4a4a","linewidth":0.6}, 3:{"hatch":None,"edgecolor":"#111111","linewidth":0.8}, 4:{"hatch":None,"edgecolor":"#444444","linewidth":0.8}, } n_rows,n_cols=grid.shape forrowinrange(n_rows): forcolinrange(n_cols): style=textures.get(grid[row,col]) ifstyleisNone: continue rect=Rectangle( (col-0.5,row-0.5), 1, 1, facecolor=(0,0,0,0), hatch=style["hatch"], edgecolor=style["edgecolor"], linewidth=style["linewidth"], ) ax.add_patch(rect)defvalue_iteration(grid:np.ndarray,rewards:dict,gamma=0.9,epsilon=1e-6)->tuple[dict,dict]: """Performvalueiterationtocomputeoptimalstatevaluesandpolicyusingthegivenrewards.""" n_rows,n_cols=grid.shape states=[(r,c)forrinrange(n_rows)forcinrange(n_cols)ifgrid[r,c]==0] V={s:0forsinstates} goal=(2,2) ifgoalinV: V[goal]=0#absorbingstate actions=[0,1,2,3]#up,down,left,right defget_next(s,a): r,c=s ifa==0:nr,nc=r-1,c elifa==1:nr,nc=r+1,c elifa==2:nr,nc=r,c-1 elifa==3:nr,nc=r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 减重代谢手术中食管裂孔疝处理共识2026
- 签署霸王就业协议书
- 项目赔付流程说明函4篇范文
- 2026年湖北省咸宁市事业编单位人员招聘考试参考题库及答案详解
- 2026年河南省新乡市网格员招聘笔试备考题库及答案详解
- 2026年开封市郊区事业编单位人员招聘考试模拟试题及答案详解
- 2026年浙江省宁波市社区工作者招聘考试参考题库及答案详解
- 2026年日照市东港区事业编单位人员招聘笔试参考题库及答案详解
- 2026年西安市莲湖区事业编单位人员招聘考试备考试题及答案详解
- 2026年泸州市纳溪区网格员招聘笔试参考试题及答案详解
- 危石清理施工方案
- JJG 264-2025 谷物容重器检定规程
- T/CACE 065-2022废旧动力电池拆解管理规范
- 2025中国平煤神马集团开封华瑞化工新材料股份有限公司招聘21人笔试参考题库附带答案详解
- 瓷砖行业法规与消费者权益-全面剖析
- 中考英语话题作文训练题库100题(含范文)
- 《陈士铎医学全书》
- 2023-2024学年北师大版八年级下册期末数学试卷2(考试版)
- 新苏教版四年级科学下册教案教学设计
- 2025届佛山市普通高中高一数学第二学期期末统考试题含解析
- 蓝幸测试题-网络优化附有答案
评论
0/150
提交评论