• 一文带你了解自监督学习中的对比学习的负样本采样策略
    自监督学习中的对比学习(Contrastive Learning)通过​​区分正样本对(相似特征)与负样本对(不相似特征)​​来学习判别性特征表示。其中,负样本采样策略是核心设计之一,直接影响模型对特征空间区分能力的学习效果。以下从​​负样本的作用机制​​出发,结合SimCLR、MoCo等经典方法,详细解析其如何通过负样本采样策略提升特征表示质量。​​一、对比学习的核心逻辑:正样本与负样本的作用​​对比学习的目标是将同一样本的不同增强视图(正样本对)映射到特征空间中相近的位置,同时将不同样本的增强视图(负样本对)映射到远离的位置。其核心损失函数(如InfoNCE)可形式化为:其中,z_i和z_j是同一原始样本的两个增强视图(正样本对),其余2N-2个样本为负样本(k \neq i)。​​负样本的关键作用​​:提供“反例”,迫使模型学习​​区分不同样本的语义边界​​,避免特征坍缩(所有样本映射到同一区域)。覆盖数据分布的多样性,使特征空间对不同样本的判别性更强。​​二、负样本采样策略的设计目标​​有效的负样本采样需满足两个核心要求:​​数量充足​​:足够的负样本能增强对比信号的强度(更多“反例”帮助模型区分)。​​多样性高​​:负样本需覆盖数据分布的广泛区域,避免模型仅适应局部模式。​​三、SimCLR:通过大批次(Large Batch Size)提升负样本数量​​SimCLR是Google提出的对比学习框架,其核心创新在于​​通过强数据增强生成高质量正样本对,并利用大批次提供丰富负样本​​。​​1. 正样本对的生成:强数据增强​​SimCLR对同一原始图像应用​​随机组合的增强操作​​(如随机裁剪、颜色抖动、高斯模糊、旋转等),生成两个视图(v_1, v_2)。这些增强操作保留了图像的语义一致性(正样本对),但引入了视觉差异(如视角、亮度变化),迫使模型学习对语义不变的特征。​​2. 负样本的采样:大批次直接提供​​SimCLR通过​​增大训练批次大小(如8192)​​,使每个批次的负样本数量达到2N-2(N为每批次原始样本数)。例如,当N=4096时,每个样本的负样本数为8192-2=8190。​​优势​​:大批次直接增加了负样本的数量,增强了对比损失的判别能力(更多“反例”帮助模型区分不同样本)。简单高效,无需额外存储或维护负样本库。​​局限性​​:批次过大会导致计算和内存开销剧增(需GPU集群支持)。​​四、MoCo:通过动量编码器与队列维护高质量负样本库​​MoCo(Momentum Contrast)针对SimCLR的大批次依赖问题,提出​​动态维护一个大规模、多样化的负样本库​​,解决了大批次不可行的场景(如单卡训练)。​​1. 负样本库的构建:队列(Queue)与动量编码器​​MoCo的核心设计是​​动量编码器(Momentum Encoder)​​和​​负样本队列(Queue)​​:​​查询编码器(Query Encoder)​​:用于编码当前批次的增强视图(查询特征q)。​​键编码器(Key Encoder)​​:初始与查询编码器相同,但通过动量更新(缓慢跟随查询编码器的参数变化),用于编码负样本(键特征k)。​​负样本队列​​:存储前几个批次的键特征(如65536个),作为当前批次的负样本。每次训练时,当前批次的键特征会被推入队列,最旧的键特征被弹出,保持队列大小固定。​​2. 负样本的采样:动态更新与去相关性​​​​负样本的多样性​​:队列存储了大量历史批次的键特征,覆盖了更广泛的数据分布(避免固定批次的负样本重复)。​​去相关性​​:键编码器通过动量更新(如m=0.999),其参数变化缓慢,避免了查询编码器与键编码器同步更新导致的负样本“过拟合”(即键特征与查询特征同时变化,对比信号减弱)。​​优势​​:负样本库规模大(如65536),无需依赖大批次,降低计算开销。队列动态更新保证了负样本的时效性和多样性,避免特征坍缩。​​实验效果​​:MoCo在ImageNet线性评估任务中,仅用单卡训练即可达到与SimCLR(需8卡大批次)相近的性能,验证了其负样本策略的有效性。​​五、负样本采样的通用优化方向​​除SimCLR和MoCo外,后续工作进一步优化了负样本策略,核心方向包括:​​1. 负样本的去重与过滤​​避免同一原始样本的多个增强视图作为负样本(如排除当前批次的正样本对)。过滤语义相似的负样本(如通过聚类剔除相似样本),减少无效对比。​​2. 负样本的语义控制​​引入跨域负样本(如其他数据集的样本),扩展特征空间的判别边界。基于类别的负采样(如针对细粒度分类,强制模型区分同类别不同实例的负样本)。​​3. 动态负样本生成​​通过生成模型(如GAN)动态生成高质量的负样本,补充真实数据的不足。​​六、总结:负样本策略如何提升特征质量?​​SimCLR、MoCo等方法的负样本采样策略通过以下方式提升特征表示质量:​​数量充足​​:大批次(SimCLR)或动态队列(MoCo)提供了足够多的负样本,增强了对比信号的强度。​​多样性高​​:强数据增强生成的正样本对(SimCLR)、历史批次的负样本队列(MoCo)覆盖了数据分布的广泛区域,迫使模型学习更鲁棒的判别特征。​​语义对齐​​:负样本与正样本的语义一致性(如同属一个类别但视觉不同)确保模型学习的是“语义不变性”而非“视觉噪声”,提升特征的泛化能力。简言之,负样本采样策略通过​​“量”与“质”的双重优化​​,使模型在对比学习中更有效地捕捉到数据的本质特征,从而提升下游任务(如分类、检测)的性能。
  • [大赛资讯] C++可以使用STL库嘛
    C++可以使用vector、cin、cout等结构嘛
  • [问题求助] 问题求助十七期
    offline测试数据中存在点数n为12833,路径长度限制为10的数据(第136个测试数据),按照题目中的叙述,得分为 100*|x|/n,四舍五入,那么|x|一定不会超过20。 2000/12833四舍五入为0,这样的话,得分岂不是一定为0,无论程序找的路径多么优秀?请官方仔细回答,不要答非所问。
  • [问题求助] 十七期求助
    第十七期的报错paths are intersected 是什么问题马,pdf中也没有说明;pdf中的C有什么用?答案是只能输出两个路劲嘛,为啥例子是三个?
  • [技术干货] 第十一期初赛第五名思路
    第十一期思路主要如下:1.将问题转化为TSP问题2.将TSP问题压缩,相同的wrap且相同anchor认为是同一个点3.求解TSP的距离矩阵(要使用numpy求解,不然时间开销很大)4.使用MST构造初始TSP序列,大概分数为7958000.5.使用or-opt优化初始解,具体过程如下:(1)找出序列的最长边a->b(2)找出以a为起点的最短边a->x(3)断开a->b, 链接a->x, 这样会导致多出一段序列a_next->...->x_pre(4)将a_next->...->x_pre插入到序列中,如果新的序列比原始序列优,替换原始序列,否则重复(1)(找第二长边)6. 最终分数大概为8340000.
  • [常见问题汇总帖] 兼容torch2.2.0的mindietorch
    我在执行.pt模型转换时遇到了torch2.1.0版本的bug,按照官方指示我尝试升级torch将torch升级为2.2.0,mindietorch并未升级再次运行转换脚本出现mindietorch与torch不兼容的错误。我继续尝试使用pip 华为源和官方软件包的方式升级mindietorch但均升级失败想请问一下兼容torch2.2.0的minidetorch在哪可以找到
  • [互动交流] AI小白,想学习下开源大语言模型的源码,比如ChatGLM3,应该怎么学习呢?有没有好的学习大语言模型源码的方法?
    AI小白,想学习下开源大语言模型的源码,比如ChatGLM3,应该怎么学习呢?有没有好的学习大语言模型源码的方法?
  • [互动交流] 最近在学习AI,学习AI的过程中需要学习的东西太多了,作为小白,有些知识点已经过时了,不需要在学习了,我应该怎么快速的学习最新的知识呢?哪些技术已经过时了,有没有同学知道下
    最近在学习AI,学习AI的过程中需要学习的东西太多了,作为小白,有些知识点已经过时了,不需要在学习了,我应该怎么快速的学习最新的知识呢?哪些技术已经过时了,有没有同学知道下
  • [互动交流] 我最近在学习AI,学习AI有没有具体的学习方法?感觉学习的东西太多了,无从下手?有没有对AI比较了解的,帮忙指导下学习流程
    我最近在学习AI,学习AI有没有具体的学习方法?感觉学习的东西太多了,无从下手?有没有对AI比较了解的,帮忙指导下学习流程
  • [互动交流] 我最近在学习AI,模型的参数是怎么确定的?有没有具体的计算公式?比如我自研一个模型,我怎么确定我的模型参数是多少?
    我最近在学习AI,模型的参数是怎么确定的?有没有具体的计算公式?比如我自研一个模型,我怎么确定我的模型参数是多少
  • [技术干货] 机器学习如何提高欺诈预防能力【转】
    前言在线欺诈是许多国家的严重问题,存在网络钓鱼攻击、身份盗窃和假冒电子商务网站等各种诈骗行为。一份报告显示,很大一部分欺诈交易发生在晚上10点至凌晨4点之间,其中60岁以上的信用卡持有者是主要受害者。机器学习有助于预防欺诈,使组织能够实时检测和防止可疑活动。传统的欺诈预防方法往往难以跟上诈骗者不断变化的策略。机器学习算法可以快速分析大量数据,帮助组织识别可能表明可疑行为的模式和异常。这些算法从过去的欺诈案例中学习,不断增强检测可疑活动的能力。通过将机器学习集成到欺诈预防策略中,组织可以领先于诈骗并有效保护其资产。机器学习在预防欺诈方面的一个关键优势是它能够在早期阶段检测可疑活动。通过分析历史数据和识别可疑行为模式,机器学习算法可以实时发现可疑交易,使组织能够迅速采取行动并防止财务损失。图数据库与机器学习一起成为欺诈检测的强大工具。图形数据库以高速率记录和分析网络交互,使其可用于各种应用,包括欺诈检测。他们可以识别大数据中的模式和关系,降低复杂性,以便检测算法可以有效地发现网络内的欺诈企图。机器学习如何提高欺诈预防能力机器学习在欺诈预防方面可以发挥重要作用,以下是一些提高欺诈预防能力的方法:数据分析和特征工程:使用机器学习技术对大量的交易数据进行分析和挖掘,发现欺诈模式和异常行为。通过特征工程,提取关键的特征用于建模。监督学习模型:使用监督学习算法,如决策树、逻辑回归、支持向量机(SVM)等,对历史数据进行建模,学习欺诈案例和正常交易之间的差异,并预测新的交易是否为欺诈。无监督学习模型:利用无监督学习算法,如聚类分析、异常检测等,发现数据中的潜在欺诈模式,识别与正常行为不同的异常交易。半监督学习:结合监督学习和无监督学习的优势,利用标记和未标记数据进行建模,提高模型的泛化能力和欺诈检测的效果。深度学习模型:使用深度学习技术,如神经网络,处理大规模数据,学习复杂的欺诈模式和特征表示,提高欺诈预测的准确性。模型集成:结合多个不同算法的预测结果,采用投票、加权平均等方法,提高模型的鲁棒性和预测性能。实时监测和反馈:建立实时监测系统,对交易进行及时监控和反馈,及时发现并阻止欺诈行为。持续优化:不断收集新数据,更新模型参数,优化模型性能,适应不断变化的欺诈手段和模式。总结总之,随着诈骗者不断发展其策略,组织必须调整其欺诈预防策略以有效应对这些威胁。机器学习和图形数据库是这场持续战斗中的强大武器。这些技术能够快速分析无数数据点,能够准确检测可疑活动,超越人类的能力。这类似于拥有一支超人欺诈侦探团队全天候不知疲倦地工作。转载自:cid:link_0
  • [技术干货] 基于机器学习的深度学习的玫瑰花种类的识别
    准备自行准备一个玫瑰花朵数据集,尽量多的种类和数量,下面教程已自备数据集。数据预处理将图片转换为模型可以处理的格式,对数据进行归一化处理。import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 设置图片大小和批次大小 IMG_SIZE = (224, 224) BATCH_SIZE = 32 # 创建ImageDataGenerator实例,用于数据增强和预处理 train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) # 加载训练数据集 train_data = train_datagen.flow_from_directory( 'flowers', target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='categorical' )模型构建使用预训练的ResNet50模型作为特征提取器,然后搭建一个全连接层用于分类from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.applications.resnet50 import ResNet50 # 加载ResNet50模型 base_model = ResNet50(weights='imagenet', include_top=False, input_shape=IMG_SIZE + (3,)) # 在ResNet50模型基础上搭建全连接层 x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(train_data.num_classes, activation='softmax')(x) # 构建完整模型 model = Model(inputs=base_model.input, outputs=predictions) # 冻结ResNet50模型的所有层 for layer in base_model.layers: layer.trainable = False模型训练和评估训练:# 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_data, epochs=10)模型训练完成后需要评估:# 加载测试数据集 test_datagen = ImageDataGenerator(rescale=1./255) test_data = test_datagen.flow_from_directory( 'test', target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='categorical' ) # 在测试集上评估模型 test_loss, test_acc = model.evaluate(test_data) print('Test accuracy:', test_acc)必要时调整模型再进行训练:# 设置训练参数 EPOCHS = 50 STEPS_PER_EPOCH = len(train_data) VALIDATION_STEPS = len(valid_data) # 开始训练模型 history = model.fit( train_data, epochs=EPOCHS, steps_per_epoch=STEPS_PER_EPOCH, validation_data=valid_data, validation_steps=VALIDATION_STEPS )
  • [技术干货] 机器学习、深度学习与神经网络:探索AI的核心概念
    前言在人工智能(AI)的领域中,机器学习、深度学习和神经网络是三个相互关联且不断发展的概念。它们在推动人工智能技术进步的过程中起着至关重要的作用,并且在诸如语音识别、图像识别、自然语言处理和推荐系统等领域有广泛的应用。机器学习机器学习是人工智能的一个子领域,它使计算机系统能够从数据中“学习”并做出决策。机器学习的目标是让计算机能够从数据中找出模式,并根据这些模式做出预测或分类。在机器学习的过程中,算法会分析输入的数据,从中找出隐藏的模式或关系,然后根据这些信息做出最佳的决策。机器学习算法可以根据其所用的技术分为多种类型,例如监督学习、无监督学习和强化学习。深度学习深度学习是机器学习的一个分支,它利用深度神经网络来处理和分析大量的数据。深度神经网络是一种复杂的计算模型,由多个层次的神经元组成,这些神经元被组织成层,每层都接收前一层的输出作为输入。深度神经网络通过训练大量的数据来学习如何识别模式,并且可以自动提取和抽象高层次的特征。深度学习的应用非常广泛,包括图像识别、语音识别、自然语言处理和游戏AI等领域。神经网络神经网络是深度学习的核心组件,它模拟了人脑神经元的工作方式。神经网络由许多神经元(或节点)组成,每个神经元都接收输入信号,并根据其权重和其他输入信号计算输出信号。神经元的输出信号会被传递给下一层的神经元,这个过程会持续进行直到产生最终的输出。神经网络的训练过程是通过调整神经元之间的权重来优化模型的性能。随着数据和计算能力的增加,神经网络的规模和复杂性也在不断增长,从而推动了深度学习的进步。总结:机器学习、深度学习和神经网络是人工智能领域的核心概念,它们相互关联并推动着彼此的发展。机器学习让计算机系统能够从数据中学习和做出决策;深度学习利用深度神经网络处理和分析大量数据,并自动提取和抽象高层次的特征;而神经网络则是深度学习的核心组件,模拟人脑神经元的工作方式来进行模式识别和预测。随着技术的不断进步和应用领域的不断拓展,这三个概念将继续在人工智能领域发挥重要的作用。
  • [分享交流] 机器学习中的线性回归
    机器学习中的线性回归简介线性回归是机器学习领域中最简单而有效的模型之一。它用于建立自变量(输入)和因变量(输出)之间的线性关系。在实际应用中,线性回归广泛用于预测、分析和建模。让我们深入了解线性回归的基本原理和应用。基本原理线性回归基于假设,即自变量和因变量之间存在线性关系。这种关系通常可以表示为一条直线的方程:$$ y = mx + b $$ 其中,(y) 是因变量,(x) 是自变量,(m) 是斜率,(b) 是截距。模型的目标是找到最适合数据的直线,使得预测值与实际值之间的差异最小化。公司应用许多公司在实际业务中使用线性回归来解决各种问题,例如销售预测、市场分析、资源规划等。下面是一些公司应用线性回归的实际场景:1. 零售行业零售公司可以使用线性回归来预测产品销售量。通过分析历史销售数据,他们可以建立一个模型,考虑因素如季节性、促销活动和市场趋势,以便更好地管理库存和优化供应链。2. 金融领域金融公司可能使用线性回归来评估贷款申请的信用风险。通过分析借款人的信用历史、收入和其他因素,他们可以预测违约的概率,从而更明智地决定是否批准贷款。3. 医疗保健医疗机构可以利用线性回归来预测患者的住院时间或治疗成本。通过考虑患者的健康状况、疾病历史和其他变量,他们可以制定更有效的治疗计划和资源分配。Python 代码演示下面是一个使用 Python 进行线性回归的简单示例。我们将使用 scikit-learn 库,这是一个强大的机器学习库。# 导入必要的库 import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt # 生成一些示例数据 np.random.seed(42) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # 将数据拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建并拟合线性回归模型 model = LinearRegression() model.fit(X_train, y_train) # 打印模型的系数和截距 print("Coefficient:", model.coef_) print("Intercept:", model.intercept_) # 在测试集上进行预测 y_pred = model.predict(X_test) # 绘制原始数据和回归线 plt.scatter(X_test, y_test, color='black') plt.plot(X_test, y_pred, color='blue', linewidth=3) plt.xlabel('X') plt.ylabel('y') plt.title('Linear Regression Example') plt.show()以上代码演示了如何创建一个简单的线性回归模型,将数据拆分为训练集和测试集,并绘制原始数据及拟合的回归线。进阶主题1. 多变量线性回归前面的例子是单变量线性回归,但线性回归也适用于多个自变量的情况。多变量线性回归的方程可以表示为: $$ y = b_0 + b_1 \cdot x_1 + b_2 \cdot x_2 + \ldots + b_n \cdot x_n $$ 其中, $$ x_1, x_2, \ldots, x_n $$ 是多个自变量, $$ b_0, b_1, b_2, \ldots, b_n $$ 是模型的系数。这样的模型可用于更复杂的现实场景。2. 正则化为了防止过拟合,线性回归模型通常会使用正则化。L1 正则化和 L2 正则化是两种常见的方法。它们通过在成本函数中引入正则化项,惩罚系数过大的模型,从而提高模型的泛化能力。# 使用 L2 正则化的线性回归 from sklearn.linear_model import Ridge ridge_model = Ridge(alpha=1.0) # alpha 是正则化强度 ridge_model.fit(X_train, y_train)3. 多项式回归在某些情况下,数据可能不是线性的,这时可以使用多项式回归。它通过引入自变量的高次项来拟合曲线关系。from sklearn.preprocessing import PolynomialFeatures # 将特征转换为多项式特征 poly_features = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly_features.fit_transform(X) # 然后使用线性回归拟合多项式特征 poly_model = LinearRegression() poly_model.fit(X_poly, y)更多实际应用1. 房价预测房地产公司可以使用线性回归来预测房屋价格。模型可以考虑诸如房屋大小、地理位置、周围设施等因素。2. 股票价格预测金融公司可能使用线性回归来分析股票价格的趋势。考虑因素如市场指数、公司业绩等,可以帮助他们制定投资策略。3. 营销效果分析营销团队可以使用线性回归来分析广告投放对销售的影响。这有助于优化广告预算和选择最有效的营销渠道。模型评估与调优1. 模型评估指标在使用线性回归模型时,了解模型的性能是至关重要的。一些常用的模型评估指标包括:均方误差(Mean Squared Error, MSE): 衡量模型预测值与实际值之间的平方差的平均值。from sklearn.metrics import mean_squared_error mse = mean_squared_error(y_test, y_pred) print("Mean Squared Error:", mse)R平方(R-squared): 衡量模型解释因变量变化的比例,取值范围在0到1之间。from sklearn.metrics import r2_score r2 = r2_score(y_test, y_pred) print("R-squared:", r2)2. 模型调优为了提高模型性能,可能需要进行一些调优步骤:特征工程: 选择合适的特征对模型性能至关重要。可以通过特征选择或创建新的特征来改进模型。# 示例:使用 SelectKBest 进行特征选择 from sklearn.feature_selection import SelectKBest, f_regression selector = SelectKBest(score_func=f_regression, k=2) X_new = selector.fit_transform(X, y)超参数调优: 调整模型的超参数,如正则化强度、多项式次数等,以获得更好的性能。# 示例:使用网格搜索调整超参数 from sklearn.model_selection import GridSearchCV param_grid = {'alpha': [0.1, 1.0, 10.0]} grid_search = GridSearchCV(Ridge(), param_grid, cv=5) grid_search.fit(X_train, y_train) best_alpha = grid_search.best_params_['alpha']如果大家觉得有用的话,可以关注我下面的微信公众号,极客李华,我会在里面更新更多行业资讯和企业面试内容,让大家更好学习编程,我的抖音,B站也是极客李华。
  • [课程学习] K-means鸢尾花聚类实验
    目的与要求实验目的:学习 PyTorch 基础: 通过实现一个简单的卷积神经网络,学习如何使用PyTorch 构建深度学习模型。熟悉卷积神经网络结构: 了解卷积层、池化层、全连接层等卷积神经网络的基本组件,以及它们在图像分类任务中的作用。实践深度学习训练循环: 通过编写训练和测试循环,理解深度学习模型的训练过程,包括前向传播、反向传播、损失计算等步骤。掌握 PyTorch 工具: 学会使用 PyTorch 提供的工具和模块,例如优化器(Optimizer)和学习率调度器(Learning Rate Scheduler)。实验结果分析: 通过测试模型并分析测试结果,评估模型在手写数字识别任务上的性能。2、 实验要求:使用 PyTorch 实现一个卷积神经网络(CNN),并使用 MNIST 数据集进行训练和测试,从而实现手写数字识别实验原理1、卷积神经网络 (CNN):一类专门设计用于处理网格状数据(如图像)的深度学习模型。它包含卷积层、池化层和全连接层。卷积层能够有效地提取图像中的特征,而池化层则用于降采样,减小计算量。这有助于CNN学习图像中的局部模式和整体结构。2、MNIST 数据集:包含手写数字图像,每个图像都是28x28像素的灰度图。它是一个常用的基准数据集,用于测试图像分类算法的性能。每个图像都带有相应的标签,表示图像中的数字。3、激活函数 (Activation Function): 在神经网络中,激活函数引入非线性性质,允许网络学习复杂的映射关系。在本实验中,Rectified Linear Unit(ReLU)是主要的激活函数,用于在卷积层和全连接层之间引入非线性。4、损失函数 (Loss Function): 用于度量模型输出与真实标签之间的差异。5、优化器 (Optimizer): 用于更新模型参数以最小化损失。6、学习率调度器 (Learning Rate Scheduler): 用于动态调整学习率,帮助模型更好地收敛。7、训练循环: 包括前向传播、反向传播和参数更新。在训练期间,模型通过多次迭代学习如何准确地预测手写数字的标签。8、测试循环: 在训练结束后,模型通过测试集进行评估。测试集上的性能指标,如损失和准确率,可用于评估模型的泛化能力。使用环境PyTorchTorchvisionPyCharm2022.3.2四、实验结果及分析    Test set:  Average Loss :0.0473  Accuracy :9851/10000 99%五、附录未修改 batch_size和learning_rate的代码:from __future__ import print_functionimport argparseimport torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.optim.lr_scheduler import StepLR# 定义神经网络模型class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 卷积层 self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) # 丢弃层 self.dropout1 = nn.Dropout(0.25) self.dropout2 = nn.Dropout(0.5) # 全连接层 self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): # 卷积和激活层 x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) # 最大池化层 x = F.max_pool2d(x, 2) x = self.dropout1(x) # 展平数据以供全连接层使用 x = torch.flatten(x, 1) # 全连接层,包括激活和丢弃 x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) # 输出层使用对数softmax激活 output = F.log_softmax(x, dim=1) return output# 训练模型的函数def train(args, model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) # 负对数似然损失 loss = F.nll_loss(output, target) loss.backward() optimizer.step() if batch_idx % args.log_interval == 0: print('训练 Epoch: {} [{}/{} ({:.0f}%)]\t损失: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) if args.dry_run: break# 测试模型的函数def test(model, device, test_loader): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device)
总条数:5192 到第
上滑加载中