-
导语结束比赛有几天了,这几天一直在处理前段时间堆积的工作,今天得空对自己的方案进行梳理总结。今年7月多结束魔镜杯后,将之前的内容整理了一下,刚好看到华为垃圾分类比赛,由于我的工作内容还是偏图像,所以就想玩玩,有幸拿了一个亚军。这次比赛是基于华为云的modelArts平台,免费的gpu硬件环境,全新的结果提交验证方法。感谢组织方华为云,喜欢打比赛的小伙伴也可以多留意该平台,会不定期举办各种数据类竞赛。我们队共有三人:谢赋(老虎)、舒欣(up)和文瑞(一休),大家交流分工合作,才能不断奋力前进。这次分享主要是针对决赛阶段,该阶段要求模型的推理时间不能大于100ms,不能使用融合和TTA。故关于模型融合和TTA技巧,本次不会涉及到,后面还会有图像分类的专题分享。一 解题思路拿到数据后,我们首先做了数据分析。统计数据样本分布,尺寸分布,图片形态等,基于分析可以做一些针对性的数据预处理算法,对后期的模型训练会有很大的帮助。选择好的baseline。需要不断的尝试各种现有的网络结构,进行结果对比,挑选出适合该网络的模型结构,然后基于该模型进行不断的调参,调试出性能较好的参数。做结果验证,分析badcase。将上述模型在验证集上做结果验证,找出错误样本,分析出错原因,然后针对性的调整网络和数据。基于新数据和模型,再次进行模型调优二 数据分析(EDA)原始共有43个类别,共计19459张图片。图像类别数据不均衡,其中较少数据为类别3(牙签)、类别40(毛巾)和类别41(饮料盒);数据较多的为类别11(菜叶根)和类别21(插头电线)。 图片长宽比有一定的差异性,下图是h/w比例数据分布图(只显示该类数量大于100的比例),长宽比大多数集中于1,后来模型输入尺寸设为1:1基于分析对图像进行简单的数据增强操作,包括图像的等比填充缩放裁剪,水平翻转、高斯噪声等。其中第一项目,对结果影响较大。这里是先将原始图像以最大边为基准做等比缩放,不足的地方填充0,这里缩放后的边是最终输入边长的256/224倍,然后在进行剪切,这里输入模型的尺寸为288*288。下图是对比图,如果不进行等比缩放,最终的结果是最右边的图片,最后的输出就极易识别为筷子。等比缩放的代码如下:class Resize(object): def __init__(self, size, interpolation=Image.BILINEAR): self.size = size self.interpolation = interpolation def __call__(self, img): # padding ratio = self.size[0] / self.size[1] w, h = img.size if w / h < ratio: t = int(h * ratio) w_padding = (t - w) // 2 img = img.crop((-w_padding, 0, w+w_padding, h)) else: t = int(w / ratio) h_padding = (t - h) // 2 img = img.crop((0, -h_padding, w, h+h_padding)) img = img.resize(self.size, self.interpolation) return img三 模型设计与训练首先对原始的数据进行分组,9:1的比例分为训练集和测试集,基于此做线下验证。模型结构baseline准确率seresnext5032x4d93.10seresnext10132x4d93.59Senet15494.38resnext50_32*8d95.01resnext10132*16dwsl95.56resnext10132*32dwsl95.32Pnasnet5large94.38efficientnet-b795.20基于上述结果验证,采用了resnext10132*16dwsl网络作为基本的baseline,进行结果调优,最后的网络结构如下图,红色的部分为调整的网络部分,模型最后全连接层添加dropout降低过拟合,首层卷积添加cbam注意力机制增强特征表征能力,关注重要特征抑制不必要特征。基于此网络,现在训练20个epoch就能收敛到最高分,训练时间大概5个小时左右。在模型参数选择和调整方面,尝试了很多参数,针对损失函数分别尝试了CrossEntropyLoss和focal loss, 优化函数:adabound、Radam、adam、sgd和sgd + warm up, 其中adabound在起始收敛的速度较快,但是最终还是sgd的网络精度较高。学习率优化方面使用了ReduceLROnPlateau和定值优化两种方法,定值优化需要根据实验选择适合的降分点。并且也要针对不同的模型调整学习率,最终采用的参数如下:使用预训练参数优化函数: sgd学习率:0.001学习率优化:ReduceLROnPlateau自己设置的网络层,初始学习率是预加载参数网络的5倍四 结果分析在验证集上做结果验证,得到下图所示的混淆矩阵。基于此分析各类别预测结果分布,分析badcase,采取措施进行数据扩充或数据增强工作。五 展望对网络结果中的全部残差块添加时间和空间注意力机制对模型进行量化和剪枝,在保证精度的同时提高模型速度转化为二分类问题,使用人脸的arcfaceloss + triplet loss + focal loss联合loss优化在落地的场景中增加反馈机制,收集用户的反馈信息,对模型进行在线训练,不断增加训练数据优化模型。参考文献Robustness properties of Facebook’s ResNeXtWSL modelsFaceNet: A Unified Embedding for Face Recognition and ClusteringFocal Loss for Dense Object Detection最后比赛这种东西,即使第一次没有得奖,多参加两次,多熬两个夜就会得奖了,大多数比赛技巧性都比较强,相信自己可以的。如果感觉自己一个人学习太孤单,欢迎添加下方微信群,一块交流成长,如果二维码失效也可通过微信下方链接加群。参加每一次项目,如果感觉可以,或者有用,我会把代码直接放出,方便新手学习,快速成长,关注微信公众号回复:垃圾分类,即可获得本次决赛代码,接下也会将分类任务整理一下,包含主流的一些网络,敬请关注。
-
Jeff Dean(也称Jeffrey Adgate Dean)是一名美国计算机科学家和软件工程师,出生于1968年,毕业于华盛顿大学,主要作品有《MapReduce》eff Dean:2021年之后,机器学习领域的五大潜力趋势2021 年之后,机器学习将会对哪些领域产生前所未有的影响?在过去的数年,见证了机器学习(ML)和计算机科学领域的许多变化。按照这种长弧形的进步模式,人们或许将在接下来的几年中看到许多令人兴奋的进展,这些进步最终将造福数十亿人的生活,并产生比以往更深远的影响。 在一篇总结文章中,谷歌 AI 负责人、知名学者 Jeff Dean 重点介绍了 2021 年之后机器学习最具潜力的五个领域:趋势 1:能力、通用性更强的机器学习模型趋势 2:机器学习持续的效率提升趋势 3:机器学习变得更个性化,对社区也更有益趋势 4:机器学习对科学、健康和可持续发展的影响越来越大趋势 5:对机器学习更深入和更广泛的理解
-
内容介绍本文重点在于如何利用python收集各类型因子并进行预处理最终用于构建量化选股模型。工具介绍本代码所需要调用的包如下图所示:import pandas as pdimport tushare as tspro = ts.pro_api()import numpy as npimport timeimport mathimport statsmodels.api as smfrom sklearn import preprocessingfrom sklearn.decomposition import PCAimport os这里需要用到的是python中的pandas和statsmodels模块,分别用于数据处理和做多元回归。另外,还需要获取股票和指数的各项数据,这里所用到的是tushare,tushare拥有丰富的数据内容,如股票、基金等行情数据,公司财务理等基本面数据。通过tushare平台赚取一定的积分可以免费获取平台提供的数据。(个人ID:419382)数据获取本段代码展示了如何通过tushare获取相关数据并清洗成为所需因子,共展示了估值因子,成长因子,财务质量因子,杠杆因子,动量反转因子,波动率因子以及beta的构建。其中beta因子是取个股与指数收益率线性回归的回归系数。def get_all_factors(codes_list,date,start,end,one_m_start,beta_start,beta_end): #获取估值因子 evaluate_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定交易日的指标 df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,trade_date,pe_ttm,pb,ps_ttm,dv_ttm") evaluate_factors = evaluate_factors.append(df1) time.sleep(0.4) print("第%d支股票估值因子获取成功"%i) #根据指标计算因子 evaluate_factors["EP"] = 1/evaluate_factors["pe_ttm"] evaluate_factors["BP"] = 1/evaluate_factors["pb"] evaluate_factors["SP"] = 1/evaluate_factors["ps_ttm"] evaluate_factors["DP"] = evaluate_factors["dv_ttm"] evaluate_factors = evaluate_factors[["ts_code","trade_date","EP","BP","SP","DP"]] #获取成长因子 growth_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定日期最近的财报 df1 = pro.income(ts_code=codes_list[i],end_date=date, fields="ts_code,end_date,revenue,n_income") df1 = df1.drop_duplicates(subset=["end_date"]) #根据财报计算因子 df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[[0,4],:] revenue = df1["revenue"].tolist() n_income = df1["n_income"].tolist() sales_G = revenue[0]/revenue[1] - 1 profit_G = n_income[0]/n_income[1] - 1 df2 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df2 = df2.drop_duplicates(subset=["end_date"]) df2["end_date"] = df2["end_date"].astype("int64") df2 = df2.iloc[[0,4],:] roe = df2["roe"].tolist() ROE_G = roe[0]/roe[1] - 1 df3 = pd.DataFrame({"ts_code":codes_list[i],"sales_G":sales_G,"profit_G":profit_G,"ROE_G":ROE_G},index=[20201231]) growth_factors = growth_factors.append(df3) time.sleep(1.2) print("第%d支股票成长因子获取成功"%i) all_factors = evaluate_factors.merge(growth_factors) #获取财务质量因子 quality_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定日期最近的财报 df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[0,:] df1 = df1[["ts_code","roe","assets_turn"]] quality_factors = quality_factors.append(df1) time.sleep(1) print("第%d支股票财务质量获取成功"%i) all_factors = all_factors.merge(quality_factors) #获取杠杆因子 leverage_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[0,:] df1 = df1[["ts_code","debt_to_assets"]] leverage_factors = leverage_factors.append(df1) time.sleep(0.8) print("第%d支股票杠杆因子获取成功"%i) all_facotrs = all_factors.merge(leverage_factors) #获取市值因子 capital_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,total_mv") df1["total_mv"] = df1["total_mv"].apply(lambda x:math.log(x)) capital_factors = capital_factors.append(df1) time.sleep(0.5) print("第%d支股票市值因子获取成功"%i) all_factors = all_facotrs.merge(capital_factors) #获取动量反转因子 return_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = ts.pro_bar(ts_code=codes_list[i], freq='M', adj='hfq') df1["trade_date"] = df1["trade_date"].astype("int64") close = df1["close"].tolist() return_1m = df1["pct_chg"].tolist()[0] return_3m = close[0]/close[3] - 1 df2 = ts.pro_bar(ts_code=codes_list[i], adj='hfq') df2["trade_date"] = df2["trade_date"].astype("int64") df3 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate") df3["trade_date"] = df3["trade_date"].astype("int64") df2 = df2[df2["trade_date"]>=start] w_return_3m = (df2["pct_chg"]*df3["turnover_rate"]).sum()/len(df2) df_1m_return = df2[df2["trade_date"]>=one_m_start] df_1m_turnover = df3[df3["trade_date"]>=one_m_start] w_return_1m = (df_1m_return["pct_chg"]*df_1m_turnover["turnover_rate"]).sum()/len(df_1m_return) df4 = pd.DataFrame({"ts_code":codes_list[i], "return_1m":return_1m,"return_3m":return_3m,"w_return_1m":w_return_1m,"w_return_3m":w_return_3m},index=[0]) return_factors = return_factors.append(df4) print("第%d支股票动量反转因子获取成功"%i) all_factors = all_factors.merge(return_factors) #获取波动率因子 vol_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = ts.pro_bar(ts_code=codes_list[i], adj='hfq') df1["trade_date"] = df1["trade_date"].astype("int64") df2 = df1[df1["trade_date"]>=start] std_1m = df2["pct_chg"].std() df3 = df1[df1["trade_date"]>=one_m_start] std_3m = df3["pct_chg"].std() df4 = pd.DataFrame({"ts_code":codes_list[i],"std_1m":std_1m,"std_3m":std_3m},index=[0]) vol_factors = vol_factors.append(df4) print("第%d支股票波动率因子获取成功"%i) all_factors = all_factors.merge(vol_factors) #获取beta beta_factors = pd.DataFrame() rf = 1.03**(1/360) - 1 hs300 = pro.index_daily(ts_code="399300.SZ",start_date=beta_start,end_date=beta_end) hs300["rm"] = hs300["pct_chg"]/100 - rf for i in range(len(codes_list)): df1 = pro.daily(ts_code=codes_list[i],start_date=beta_start,end_date=beta_end) df1["rp"] = df1["pct_chg"]/100 - rf df_model = pd.merge(hs300[["trade_date","rm"]],df1[["trade_date","rp"]],on="trade_date") df_model.index = pd.to_datetime(df1.trade_date) df_model.sort_index(inplace=True) model = sm.OLS(df_model["rp"],sm.add_constant(df_model["rm"])) result = model.fit() beta = result.params["rm"] df2 = pd.DataFrame({"ts_code":codes_list[i],"beta":beta},index=[0]) beta_factors = beta_factors.append(df2) print("第%d支股票beta因子获取成功"%i) all_factors = all_factors.merge(beta_factors) #获取换手率因子 turn_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate") df1["trade_date"] = df1["trade_date"].astype("int64") turn_3m = df1["turnover_rate"].sum().mean() df2 = df1[df1["trade_date"]>=one_m_start] turn_1m = df2["turnover_rate"].sum().mean() df3 = pd.DataFrame({"ts_code":codes_list[i],"turn_1m":turn_1m,"turn_3m":turn_3m},index=[0]) turn_factors = turn_factors.append(df3) print("第%d支股票换手率因子获取成功"%i) time.sleep(0.3) all_factors = all_factors.merge(turn_factors) return all_factors 数据预处理本段的数据预处理显示获取个股所属行业,这一部分需要先在网上下载一份上司公司所属中信一级行业的表格(即代码中的“ industry.xlsx ”)。之后再用merge函数合并进数据表中。之后可以利用所属行业进行行业市值中性化处理,其他预处理步骤包括中位数去极值,缺失值处理,标准化和PCA。这里的PCA主要是为了去除多重共线性的影响,不在于筛选因子。#获取标签def get_tag(data,date): stocks = data["ts_code"].tolist() rm = pro.index_monthly(ts_code="399300.SZ",trade_date=date).pct_chg.tolist() return_list=[] for i in range(len(stocks)): r = pro.monthly(ts_code=stocks[i], trade_date=date).pct_chg.tolist() return_list.append(r[0]-rm[0]) print("第%d支股票超额收益计算完成"%i) time.sleep(0.5) data["ex_return"] = return_list return data#获取行业def get_industry(data): df1 = pd.read_excel(r"industry.xlsx",dtype="object") df1 = df1.rename(columns={"code":"ts_code"}) ts_codes = data["ts_code"].tolist() data["ts_code"] = data["ts_code"].apply(lambda x:x[0:6]) data = data.merge(df1,on="ts_code") data["ts_code"] = ts_codes return data#数据预处理#中位数去极值def MAD(data,n): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): Dm = data[indexes[i]].quantile(0.5) Dm1 = ((data[indexes[i]] - Dm).abs()).quantile(0.5) max_range = Dm + n*Dm1 min_range = Dm - n*Dm1 data[indexes[i]] = np.clip(data[indexes[i]],min_range,max_range) return data#缺失值处理def Miss_data(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): data[indexes[i]] = data.groupby("industry")[indexes[i]].transform(lambda x:x.fillna(x.mean())) return data#市值行业中性化def Indifference(data): data2 = data.drop_duplicates(subset=["industry"]) list1 = data2["industry"].tolist() list2 = data["industry"].tolist() industry_matrix = pd.DataFrame(columns=list1) industry_names = industry_matrix.columns.values.tolist() for each in range(len(industry_names)): for i in range(len(list2)): if list2[i] == list1[each]: list2[i] = 1 else: list2[i] = 0 industry_matrix[list1[each]] = list2 list2 = data["industry"].tolist() indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): model = sm.OLS(data[indexes[i]],sm.add_constant(industry_matrix)) result = model.fit() data[indexes[i]] = result.resid return data#标准化def Standardize(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] data[indexes] = preprocessing.scale(data[indexes]) return data #主成分分析def PCA_data(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] pca = PCA(n_components=20) new_data = pca.fit_transform(data[indexes]) new_data = pd.DataFrame(new_data) data[indexes] = new_data return data模型构建到这里之后用于回归模型的数据集就已经构建完成了,利用传统机器学习的步骤,将数据集分为训练集和测试集,训练集为T-2期至T-12期的数据,测试集为T-1期的数据,本模型最终目的是利用T-1期的数据预测T期个股的超额收益率。
-
赛题介绍这次比赛的赛道主要是针对金相显微图片来预测其对应定级,本次建模思路是当作一个分类问题来做,给定一个图像预测其所属的定级。比赛链接参赛队员本次比赛的队员有,裴森(中国科学院自动化研究所)、孙嘉玺(中国科学院自动化研究所)、安迪(南加大USC)、刘丹(山东财经大学)、张文轩(西安交通大学)我们的方法数据处理拿到数据后,我们首先对数据进行筛查,在筛查过程中我们发现,数据中主要包含两类错误,第一类就是同一张图片包含在数据集中有多个定级标签。第二类错误,就是图片明显的标签错误,因为标签是按照图片中晶元密度给定的,所以人眼就可以检测出来。具体实例如下:为了处理这些数据,我们采用了基于模型的清洗方法。因为在模型的训练中,一般outlier很难拟合。基于这个知识,我们首先将模型训练到0.9正确率,那么预测错误的0.1很可能含有outlier。这时候我们通过人工的手段,对这0.1预测错误的数据进行清洗。清洗后,如果模型表现更好,说明我们人工清洗的数据是对的,否则需要重新对数据进行清洗。数据增强为了提高训练阶段模型的泛化性能,我们使用了训练增强的技术。因为晶元的分布在显微图像上具有不均匀性,所以需要整个图像的信息才能判断出图像的定级。因此在数据增强上不建议使用随机裁剪,在我们的模型上,随机裁剪也会对我们模型的表现有消极影响。完整的数据增强的一些trick和其效果如下:随机旋转:小角度(5°)范围内随机旋转,可提升模型泛化能力(≈+0.5% )随机裁切:可以保留细节信息,但是全局信息受限,分级任务不过分强调局部信息(≈-0.7%)全局下采样:细节信息部分丢失,全局信息被较好地保留,分级任务依赖图像整体(≈+1.2% )色彩变换:对于包含语义信息的目标识别或者分类比较有效,分级任务收益较小(≈+0.0% )镜像翻转: 不改变金相图的含义与图像尺寸,可扩充样本数量,不会带来负面影响(≈+0.9% )尺度完备网络:Kernel Completed Net (KCN)我们这个模型也是从传统方法截点法得到的启发。这个模型有三个特点:输入时图像中的某一行或者列使用多个卷积神经网络并行提取多尺度感受野信息使用Attention机制对冗余感受野进行权重上的屏蔽首先为什么使用图像中的某一行作为输入呢?因为截点法就是在图像中画一个线,通过这些线与晶元边界交点的个数来计算定级。这就说明,某些行就包含了足够的定级信息。另外因为不同定级的晶元大小时不同的,因为对于大的晶元来说需要大的感受野对晶元进行计数,对于小的晶元来说,需要小的感受野对晶元进行计数。多以多尺度的感受野特诊提取是必要的。但是这同样引入一个问题,就是会有冗余的感受野,比如在对小晶元进行计数的时候,大的感受野输出结果是没有任何参考价值的,所以需要把大感受的输出进行屏蔽。我们使用的屏蔽方法就是用Attention机制来学习一个权重,把冗余信息的权重调小。网络架构入下:首先输入的图像行或者图像列被并行的卷积网络处理成多个不同长度的序列,这些序列经过自适应池化归一化成512长度。将这些序列堆叠到一起后,再经过Attention层的处理,就被送到MLP层预测分类结果。对比式残差网络:Contrast ResNet(CRN)我们为比赛设计的第二个模型就是对比式残差网络,这个网络使用了对比学习和有监督学习融合的训练方式,因为也继承了两者的优点。比如能捕捉更多类内信息和鲁棒性更高、精度更高等。架构如下:输入图像首先经过两次数据增强后得到三张图像,这三张图像经过ResNet得到三个特征向量,我们把这三个向量看作三张图的语义表示。将这三个向量经过Channel Attention的校正,送到MLP里面,就可以输出最终的分类结果。模型集成因为我们的模型是异构的,因此集成到一起可以大大提升最终效果。在集成公式上,我们选择Adaboost的集成公式对两个模型进行集成,最终获得了1.8%的性能提升。赛后总结这次比赛取得了不错的成绩。但是比赛完成后,复盘整个比赛,还是可以发现很多可以提升的地方,比如在问题的定义上,如果定义成回归问题,那么效果会不会更好。如果在我们的方法可以将截点法自动化建模,就算精度提升不多,但是比直接输出图片定级概率更有意义。因此学无止境,未来路上继续努力求索!撰写人:孙嘉玺 2021/11/10
-
成员介绍本次比赛我们的队长是 何笑韬,队员是何向萌和梁保金。我们都来自西安交通大学电信学部信通学院图像所, 主要研究方向为图像质量评价和视觉显著性分析。下面介绍我们团队的解决方案。一、赛题分析本赛题的任务是基于显微镜成像的金相图片评估定级结果,可将其抽象为一个图像分类任务或者是一个回归任务,赛题存在如下的几个难点,下面我们结合数据集和赛题,详细说明其具体难点。1.图片数量有限,尺寸较大本次比赛数据集图片较少,且图片尺寸较大,数据集中图片可以四张组合在一起为一张完整的大图。2.图片局部区域的晶粒度差异大本次比赛数据集图片内部patch区域的晶粒度差异较大,如下图所示。3.图片标注误差由于人为标注的不确定性,数据集中存在部分标注错误图片/重复图片,如下图所示。4.混合评分标准本次比赛的评分标准混合考虑了acc0和acc0_5的内容,因此需要指定合适的训练策略,有的放矢。5.图片特性分析最后就是赛题的图片内容上表现出,色彩单一,形状不敏感的特性,可据此采用不同的增强策略。二、数据预处理和增强根据上面的分析,我们可以制定出如下的数据预处理和数增强策略,(√)表示有效,(×)表示无效:数据预处理数据清洗(√)利用md5值查找重复图片,对于同标签的重复图片,保留一张对于不同标签的重复图片,通过人工标注的方式选择合适的标签,最终删除重复图片数:319张;更改标签图片数:35张。cleanlab数据清洗(×)使用五折训练,将预测结果使用cleanlab进行错误标签查找,具体流程如下: 3.针对准确率较差的数据人工清洗(×) 我们针对模型识别率较差的晶粒度9.0/9.5 7.0/6.5图片进行人工清洗,但效果不佳。数据增强离线切块训练baseline的RandomResizedCrop不符合此任务的实际,改用RandomCrop后,在线训练时难以收敛,为了增加数据量的同时,提高模型的训练稳定性,我们采用一种折衷的策略,即离线裁剪图像块,进行离线训练的策略。最终我们对训练集图片进行了重叠裁剪,将原始图片裁剪为224*224的patch,裁剪步长设置为56,即重叠3/4,最后得到训练图片1178688张。在线增强对于在线增强,我们主要采用了如下的增强策略,但只有随机水平和竖直翻转有效。三、网络选择和损失函数设计网络选择网络模型的选择上,我们尝试了很多网路,但最终发现小模型就可以满足精度要求,增大模型对最终的推理精度没有很大提升。我们还尝试了(1)结合梯度图,训练双分支网络(2)将分类问题退化为回归问题,最后都没有取得很好的结果。因此最终我们选择resnet34作为最终模型。损失函数设计本次比赛除了考虑了acc0还考虑了acc0_5,因此我们设计了如下的损失函数,其可以有效提高acc0_5的得分。四、模型训练此次比赛我们的训练中使用前面所生成的裁剪后的1178688张图片进行训练,5个epoch左右即可收敛,参数如下:(1)数据集将数据集按照9:1的比例划分为训练集与验证集训练集按照步长56、尺寸224×224进行滑动剪裁,获得训练集图片1178688张验证集图片380张 图片尺寸1376×1104(2)batch_size 32(3)训练epoch 8 选择最优线下epoch上传(4)初始学习率和更迭策略:1e-2,每1epoch衰减为原来的0.1倍(5)优化器:SGD(6)损失函数: 0.5CrossEntropyLoss + 0.5mapL1loss五、推理策略本次比赛中,为了提高模型推理的效果,我们还进行了测试增强,主要尝试了以下三种策略,如下图所示:大图预测:对整图预测,结合TTA,得到最终分类结果小图预测:大图裁成小块,预测小块,结合预测策略,得到分类结果小图滑动预测:大图重叠裁成小块,预测小块,结合预测策略,得到分类结果最终,我们采用的策略是:小图滑动裁剪,结合小图预测结果的众数,得到最终分类结果。这一策略在线上取得最优结果。六、性能提升曲线结合前面所说的解决方案,我们的性能提升曲线如下图:飞龙在天2021/11/10
-
一、赛题理解1. 任务分析任务:基于显微镜成像的金相图片评估定级结果。有三种定级方法,通过分析他们的原理可知,他们都是通过不同策略来估计单位面积晶粒个数。特点:晶粒度定级规则与面积有关,即选用数据增强策略时应尽量避免导致原始图片大小发生变化的方法任务需要评估整幅图像的平均状态,而非某一部分的状态由于定级规则,标注天然存在噪声,且不易区分噪声样本与困难样本2. 数据探索数据中存在重复图片,其中存在部分重复图片标注不同的情况晶粒度在同一张图片上不同区域,有时不同,中间级别这种情况相对较多一些二、 解决方案1. 数据预处理2. 模型选择最终选用了EfficientNet-B2作为比赛模型3. 数据增强首选使用了两个常见第数据增强策略修改数据裁剪策略,初赛阶段得到一定提升更进一步优化数据裁剪策略,多个随机尺寸进行训练4. 训练策略预训练权重: ImageNet训练的EfficientNet-B2权重损失函数: CrossEntropyLoss优化器: AdamW初始学习率: 3e-4BatchSize: 16训练Epoch数: 1200学习率调度: StepLR(step=[400, 800, 1000])5. 模型推理推理时选用1024x1024大小区域作为模型输入,预测结果。推理采用单模型、无TTA,提交后半小时左右出分。三、总结思考总结:根据数据量及任务情况选择合适的模型,并非越大模型越好训练时适当减少裁剪区域范围,可提高模型泛化能力未来思考:如果标注成本可以接受的情况下,由专家人工标注晶粒边界,利用语义分割算法进行边界提取,再进行截线法或面积法进行定级
-
团队介绍我们是来自广西师范大学计算机科学与工程学院的研二学生。队长冼添涛,队员何凯杰,主要研究方向为图像描述,跨模态检索,目标追踪。下面介绍我们团队的解决方案。1. 任务基于显微镜成像的金相图片评估定级结果2. 数据分析拿到初始数据后,我们对数据的类别进行了分析,如图中所示,数据集包含4222张图片,类别之间存在着严重的不均衡,最少的类别只有161张,最多的类别有524张,3倍多的差距。 使用图片查重工具Duplicate Photo Finder Plues,发现总共有621张重复图片,占总量的14.7%。 我们把重复数据分为三类: 类内重复、邻居重复(正负0.5范围的重复)和间隔重复(超出正负0.5的重复)。对不同类型采取不同的策略,尽量减少图片损失。3. 数据预处理通过观察数据,我们发现四张连号的图片是一张大图切分而来。如果1/4小大的局部信息就足以判断图片的类别,我们大胆假设图片的局部信息之间不存在强关联,那么可以通过打乱图片的局部位置获得新的图片,来作为数据扩充。 具体来说,我们把一张图分为四个小块,随机组合,那么一张图可以获得4x3x2x1=24种组合。 通过上述扩充,我们的获得了9465张图片的训练集和280张图片的验证集。注:验证集不包括任何扩充图片。4. 实验设置模型:Swin-Base-384学习率:初始1e-4, 策略ReduceLROnPlateau(5个epoch无提升则*0.5)损失函数 :Label Smothing(平滑因子0.2 ) 优化器 :Adam Batch size::24Epoch:805. 预测分类训练数据增强RandomGridShuffleGaussianBlurGridDistortionRandomResizedCropRandomHorizontalFlipRandomVerticalFlipRandomRotationRandomErasing本阶段主要是让Swin-Transformer拟合数据集。最终在初赛获得90.53,复赛85.99的成绩。6. 相似度分类训练受启发于比较法,除了让模型学习学习预测类别,我们也可以显式地训练模型根据对比图片的相似度判断类别。核心思想:基于对比学习的思想, 让相似的图片距离近,不相似的图片距离远。 实际上,在单纯的模型分类能力训练中,模型已经隐式的学习到了这种对比能力。为了强化模型的判断能力,我们设计了一种对比训练方法,对上一阶段得到的模型进行显式训练。对比学习的大概框架如图:为此,我们对模型结构进行了修改。我们新增了一个相似度计算头,把每张图片编码为144x512的向量表示注:本阶段只训练相似度头的参数。具体实现1. 对批次内的输入图片编码, 得到大小为 [batch,144,512] 的特征矩阵2. 对验证集所有图片编码,按类求均值,得到大小为 [14,144,512] 的特征矩阵,作为14个类别的对比图片表示3. 每张输入图片会对14个类别对比图片表示进行余弦相似度计算,得到大小为 [batch, 14] 的相似度矩阵4. 损失计算 损失函数该损失函数的核心思想为,当输入图片与正样本的相似度 >= 与负样本相似度 + α ,损失-> 0 。因此,为了最小化损失值,模型会在每个迭代拉大与同类对比图片的相似度,缩减与不同类对比图片的相似度,最终获得很好的分类能力。7. 结合完成第二阶段训练后,对所有图片(训练集+验证集)进行编码,按类别均值,得到大小为 [14, 144, 512] 的特征矩阵作为线上测试时候的对比集。最终分类结果 = 预测分类概率 + 相似度分类概率。 最终得到复赛成绩86.32。
-
一.前言我们组是一个很神奇的队伍,组长黄泽瀚,组员李敏君、彭潇枫,三个人在参加这次比赛前,Pytorch都不会用的,报名比赛纯粹是为了学习一下Pytorch。能在245支团队中进入前12,参加这次高手云集的决赛,完全是Efficent Net的强大和一点点点点点...(此处省略n个点)运气。(在2021年11月5日进行决赛答辩时,只能在角落留下没有知识的泪水(〒_〒)(〒_〒)(〒_〒))二、思路我们的思路很简单,面向搜索引擎:最强的图像分类网络搜索提升模型精度的方法搜索提升模型泛化能力的方法此处萌新三连!萌新三连!萌新三连!思路一:网络选择EfficientNet 兼顾了速度与精度,b0分辨率略微不足,B6和B7经测试需要训练时间过长,B7 训练的模型大小超过比赛限制。我们折中选择了b4。实际上EfficientNet 潜力巨大,甚至发现一个问题:应该都不需要B4就能拿到很高分数。思路二:数据增强我们组都是人工智能小萌新,还没有能力去完全理解和有效地改动一个神经网络,我们的主要精力放在数据增强上。经过多次实践,我们发现其中两种对模型精度提升很大:仿射变换和垂直变换。随机仿射变换以下这组参数经测试,有1%以上的稳定提升transforms.RandomAffine(degrees=(0, 25), translate=(0.05, 0.20))随机垂直翻转、随机水平翻转加入垂直翻转后,并修改随机概率,也能有1%以上的稳定提升transforms.RandomVerticalFlip(p=0.4), transforms.RandomHorizontalFlip(p=0.4)至此,b0 + 随机仿射变换 + 随机垂直翻转后,初赛能拿到0.84~0.85左右的成绩。思路三:参数调优查阅资料,提升泛化能力简单方式有如下:经验正则化,即提前终止和模型集成。使用Dropout,在训练过程中,随机的丢弃一部分输入,此时丢弃部分对应的参数不会更新。 我们主要运用了Dropout , 实际上EfficentNet_pytorch有相关实现,调整网络参数即可。调整EfficentNet Dropout :model = EfficientNet.from_pretrained( "efficientnet-b4", advprop=True, num_classes=class_num, dropout_rate = 0.6, drop_connect_rate = 0.3)至此,B4加上之前的数据增强,初赛能拿到0.86左右的成绩,复赛能有0.81上下的成绩。 (此处三个小萌新流下了欣慰的泪水,有了一个新的突破!)我们最后的提升是在指定Epoch下调学习率实现的,减少无用训练的次数:optimizer = torch.optim.AdamW(model.parameters(), lr = 1e-3)lr_scheduler = torch.optim.lr_scheduler.MultiStepLR( optimizer=optimizer, milestones=[20,36,45,52,60], gamma=0.1)最终复赛得到的最高成绩:0.8274小结:由于理论知识和比赛经验的不足,我们能走的方向不多,在复赛中我们算是迷茫了。到了决赛才知道,还有很多工作可以做,如数据扩充、缩放裁剪的选择、推理代码的优化等等。思考:得多读书加深理论知识,多角度去思考问题,不要只停留某一个点上!追龙组2021/11/12
-
一、前言团队介绍:三个来自于西安交通大学的研二学生: 高泱晗,专业:控制科学与工程 研究方向:社交网络,多分类问题 张 洁,专业:控制科学与工程 研究方向:智能电网 张潇然,专业:信息与通信工程, 研究方向:图像隐写,信息隐藏队伍宣言:岂曰无饭 与子同甘 干饭狂魔 拒绝摆烂(合影就不放大赛要求那个合照了,像是罚站一样)二、比赛历程和思路输入输出说明:输入是RGB的三通道数据;输出为类别。在确定完输入输出之后,首先按照惯例,进行一波baseline的复现。Baseline采用的是ResNet50。ResNet理解: 当深度学习网络层数越深时,理论上网络的表达能力会更强,但是CNN网络达到一定的深度后,再加深,分类性能不会提高,而是会导致网络收敛更缓慢,准确率也随着降低,即使把数据集增大,解决过拟合的问题,分类性能和准确度也不会提高,ResNet应运而生 。对于“随着网络加深,准确率下降”的问题,Resnet提供了两种选择方式,也就是identity mapping和residual mapping。分类结果正确率约为70%。后续优化思路也很清晰:1、基于数据的预处理和特征抽取;2、基于算法的优化。思路一:数据清洗:异常值处理 原始数据集中,部分图像被赋于了不正确的标签,例如以下两张图均为label=6.5的样本。当模型在训练集上充分拟合时,我们会获得较小的训练误差。但是,对于不可见的测试集模型的测试误差会增大。因而,标签错误数据将会成为噪声,干扰模型的训练。对于此类数据通过人工选取的方式进行剔除。思路二:数据增强图像随机地进行旋转;图像随机地进行水平翻转;图像随机地进行垂直翻转;调整图像的亮度,对比度和色调。目的:在不改变图像的尺寸与语义的前提下扩充图像样本,增强模型的泛化性能。思路三:改造数据集/TTA测试时数据增强(Test-Time Augmentation)数据增强是一种在模型训练期间通常使用的方法,它使用训练数据集中修改过的样本副本来扩展训练集。通常使用图像数据来执行数据增强,其中通过执行一些图像操作技术来创建训练数据集中的图像副本,例如缩放、翻转、移动等等。(transform/flip/rotation)思路四:模型的选择分别选用不同ResNet网络进行测试,根据奥卡姆剃刀原则,同时考虑到ResNet模型越复杂,越容易产生过拟合现象;最终选用ResNet 18;结果更新:89.96%。对于单一模型,初赛成绩为:0.8996(第七名);复赛成绩为:0.8432。引入TTA后,最终成绩为:0.8477(第五名) 。三、反思和感悟反思:比赛结束之后,最主要的遗憾是在发现数据处理和数据增强对于模型的准确率有巨大帮助之后,后期在尝试更多的模型的时候均为浅尝辄止,也并未模型融合的思想。感悟:比赛的初衷只是想丰富简历,抱着试试的态度,最后获得了大赛的第六名也是意料之外,欣喜若狂。最大的感慨在于:绝大多数情况下,我们所畏惧的就是恐惧本身,真刀真枪干的时候才发现很多困难并不是不可逾越的大山。BTW:感谢大赛组委员,比赛全过程公正公平公开,让每一位参赛人员都可以享受其中。同时感谢每一位工作人员,大家都很善解人意且认真。
-
成员介绍本次比赛我们的队长是 陈致远,队员是陈毅铧、俸萍、陈震海,指导老师是唐振军老师。我们都来自广西师范大学计算机科学与工程学院, 主要研究方向为深度学习,多媒体信息安全等。下面介绍我们团队的解决方案。一、赛题分析首先进入赛题分析,本次竞赛主要是针对钢铁金相图片进行评估定级,展示出来的图例,从左到右,从上到下依次是6.5到13.0,以0.5级为间隔,共14类数据的图片。我们可以清楚的看到金像图片整体质量较好,扰动较少。并且通过图例可知,分级的依据主要是根据晶界的疏密程度进行划分的。稠密的级别会高一些,稀疏的会低一些。因此针对这项赛事任务,可以看做是一种特殊的图像质量评价问题,金像图片是根据晶界的疏密程度进行分类,那么我们可以提取出金像图片的边缘特征,通过纹理的稠密程度进行分级。但这会存在一个问题:由于图像标签是离散值,也就是7.0这一类的图片存在有实际是6.8的,也可能有实际是7.3的,但他们都打了7.0的标签,所以无法得到精细分类结果。这项赛事任务也可以直接看做是图像分类问题,但由于类与类之间差距比较小,直接分类很容易出现类间混淆的情况。因此综上,我们采取的方案是通过质量评价网络进行粗分类调优数据集,然后再设计精细的评级网络进行分类。二、数据分析我们团队对训练集的数据做了分析,简单的将训练集数据分成了三类。即重复图片,难例图片和准确图片。我们通过图片的md5值将重复的图片鉴别出来,发现存在相同图片标注为不同类别的情况,并且在误差范围外。如:难例图片我们是以节点法为判断依据进行筛选的,也存在类别标注不准确的问题。因此存在问题的图片会对最终评级的精度造成干扰,需要纠正存在问题的图片,向评级网络送入高质量数据,提升精度。三、竞赛方案我们整体的竞赛方案分为两个阶段,在数据预处理阶段,我们将筛选出的重复图片和难例图片使用Scharr算子提取出边缘特征,送往我们CNN-Transformer级联融合的图像质量评价网络进行粗分类,根据结果对标注有误的图片进行纠正。纠正好数据后,通过浅层ResNet网络级联Vision Transformer网络构成的评级网络实现评级。使用质量评价网络粗调优的方式如下:有三张相同的图片,分别标注了6.5,7.0,8.5三个类别。我们将该图片使用Scharr提取出边缘信息送往我们的图像质量评价网络得到的预测类别为6.5 7.0,之后再辅以节点法进行判断,将标注为8.5的重复图片进行删除。同样的对难例图片一样处理对难例数据和重复数据纠正完全后,接下来就可以送往我们的评级网络进行评级。四、数据增强策略训练时数据增强情况如下:保持长宽比下采样后采取了亮度对比度变换,水平翻转,之后随机裁剪固定大小输入评级网络,经过我们实验验证,发现过于丰富的数据增强方式反而会带来不合理性。测试时数据增强情况如下:一样的保持长宽比下采样,然后将图片剪裁成5张(4个角和中心),最终评级结果取5次结果的平均。晶界评级对尺度变化的敏感性较高。因此测试时图集要保持和训练图集同一尺度,增强方式也要在训练增强方式的范围内。我们对输入模型的图片尺寸,优化器的选择,损失函数的选择做了实验。发现较大尺寸有利于提升模型性能。SGD+Momentum的选择有助于模型逃脱平稳区,使模型不易陷入局部极小值,泛化能力更好。使用了标签平滑的策略会提升模型泛化性能表现最好。此外,还可以做一些特殊的增强操作如数据扩充等。五、性能比较情况我们在竞赛期间也尝试了很多现有的模型,这是我们筛选出的一些比较有标志性的模型的性能对比情况,最后发现使用了级联融合的模型得到了最好的性能, 此外也发现,我们对图像集进行了预处理调整后也有提升。GXNU-HashLab2021/11/11
-
赛题任务赛题是基于显微镜成像的金相图片评估定级,要求对于金相图片给出离散的评级以及置信度,因此我们将此评级任务视为图像分类任务来完成。数据处理在训练和推理过程中,我们将图像统一缩放到800×640。在训练时随机从图像中裁剪出384×384的区域作为网络输入。而在测试时从图像的中心以及四个角落进行裁剪。这种数据处理方式主要是出于以下两点:在思考数据处理方式时,考虑到尺度变换会影响到晶粒的形状和大小,所以我们认为应该尽量保持图片的长宽比,并且对图像进行统一尺度的缩放。此外,我们还有一个非常矛盾的观点,就是一方面想让模型“看到”的区域尽可能大(给出预测所依据的区域越大,给出的预测就越有代表性),一方面又不想让模型“看到”的区域过大(因为模型固定了输入的尺寸,我们觉得对较大的的区域进行下采样会使图像丢失过多细节)但是在学习了其他参赛队伍的方案之后,我们意识到我们可能低估了神经网络的鲁棒性,应该对数据进行更大胆的缩放和增强。模型训练首先训练swin-window12-patch4-base-384,训练所用参数:随后训练DeiT-patch16-base-384对swin transformer进行蒸馏,使用参数为:初赛中蒸馏得到的DeiT相对于swin提升了1.34%评分。(在训练DeiT时,虽然DeiT的论文中在imagenet上的结果是hard distillation好于soft distillation,但是我们的实验中是soft distillation好于hard distillation)模型推理由于在数据处理时我们采取了折中的方式,因此我们使用测试时数据增强来增加预测结果对整张图片的代表性,既对图像中心和四个角落的裁剪图片分别预测得到x_{1}~x_{5}五个score,然后对x_{1}~x_{5}进行以下操作:在初赛中,测试时数据增强能为我们所有尝试过的模型带来1.5%左右的评分提升。总结数据清洗与数据增强十分重要,虽然在比赛过程中我们也尝试了对错误数据进行纠正以及进行数据增强,但是由于缺乏经验和方法,并没有得到比较好的效果。这次比赛使我们有机会学习大佬们对数据的理解以及处理方法,学习的收获对于我们来说也是参赛奖励,所以十分庆幸能有这次参赛机会。
-
成员介绍我们是来自广西大学电气工程学院的队伍,我们的指导老师是高放老师,主要研究方向是深度学习,图像处理,量子人工智能,队长为李雪涛,主要研究方向是深度学习和图像分类,其他两名成员分别是王家宝和孙晴艺,主要研究方向是深度学习、深度图像处理和3D位姿估计。一、赛题分析众所周知,钢铁是当代社会重要的结构性材料之一,而晶粒度级别是评价钢材性能的重要指标,传统晶粒度定级方法是通过人眼比对,或者通过计数等方式对其定级,但是当一张钢材截面中晶粒数量按指数级倍增时,依靠肉眼是无法对其进行判断的,所以有什么方法可以代替传统定级方法对钢铁进行又快又准的定级呢?我们的答案是深度学习,我们对基于CNN的模型进行了很多尝试,下表是所尝试的模型,这些模型精度表现残次不齐,经过比对之后,Densenet121以最少的参数量以及较高的分数表现最优,所以我们选择了Densenet121作为backbone进行后续优化二、数据分析通过观察原数据集,我们发现原数据集中存在许多脏数据,如果这种数据过多,会影响系统的鲁棒性,所以我们决定对数据进行清洗。2.1 数据清洗清洗原则是如果多个模型对训练集的某张图片均判断错误,则通过列表记录图片名称,再通过人工判断是否应该对该图片进行删除。2.2 数据扩增清洗过后由于样本数过小,我们对清洗后的数据进行了扩充,首先我们对原图进行裁剪,分别在四个角裁出四张640X640的图片,然后我们对序号为偶数的图片进行了水平翻转,对序号为奇数的图片进行了垂直翻转,再对翻转之后的图片进行同样的裁剪操作,这样进行扩充之后即保证了样本的多样性,也保证了数据集容量。2.3 数据处理结果这是官方数据、清洗后的数据以及清洗扩展后的数据分布,我们可以直观地看到扩充之后的数据集在数量上和多样性上都有提升。经过数据处理后,初赛分数实现了由0.835到0.855的提升三、模型设计这是我们所选的backbone densenet121的网络结构。他由四个dense模块串联组成,其中每个dense块中又分别以稠密连接进行连接,这种连接方式可以对图中特征进行保留,并且可以通过dropout对参数量级进行缩小,因此虽然模型连接很稠密,但是模型参数量却很小。在此基础上我们引进了自适应权重通道注意力机制AWCA模块,和上下文注意力机制PSNL模块虽然说Attention is all your need!但是每当我们处理一个事情之前都需要考虑这三个问题,就是:WHY?HOW?WHAT?为什么做,怎么做,有什么效果。3.1 Why AWCA and PSNL?首先第一个问题,为什么要加入AWCA注意力机制,是因为注意力机制可以让机器有目的性地去学习与目标任务相关的图像信息,这些是经过AWCA处理之后的可视化图片,这里有128个通道的特征图,我们挑出了两张权重值相差较大的图片进行对比,可以看到权重值较大的图片可能会更多地去关注晶粒的面积信息。这是经过PSNL的特征图,可以看到经过上下文注意力机制后的特征图可能更多的会去关注晶粒的边缘信息。3.2 How AWCA and PSNL Work?AWCA具体的工作原理是,通过对原图进行维度变换,平面拉伸,正则化,点乘等操作计算出一个自适应权重对每个通道赋予权重,如图所示,输出图片的特征图可能在某个通道的权重值会比较高。PSNL模块首先会将图片分为四个大小相同的图像块,再对每个图像块进行变形,转置,叉乘,最后与原始图片进行相加操作。此操作可以将相隔较远的信息进行融合,实现空间加权操作以得到更强的特征表示。3.3 What can them do?最后,通过加入这两个注意力模块后,初赛得分从0.855提升至0.8793.4 其他的提分策略3.4.1 优化图片预处理其他提分的策略包括对图片预处理的优化,baseline中预处理步骤是先随机裁剪成任意大小,再统一缩放成224X224。这会损失很多图像信息。我们更改后的训练前的图片预处理是直接将整个图片缩小成640x797,再裁剪成640x640,最大程度保留了全图的信息。经过此操作后,初赛分数由0.879提升至0.881.3.4.2 优化预测结果此外,我们通过投票机制优化了预测结果,首先我们让模型对同一张图片进行五次预测,再对预测的出的结果进行投票选出重复次数最多的预测结果,此操作后,初赛分数由0.881提升至0.884.四、总结与展望总结针对数据进行数据清洗与扩充,增加了模型鲁棒性提出DenseNet121与通道级注意力机制、全文注意力机制结合的连接模型优化对图片的预处理,最大程度保留原图特征基于pytorch实现端到端训练,模型简洁,易复现模型容量小,参数量少(71M)展望潜力大,可通过优化模型结构对性能继续提升可对模型进行量化与剪枝,在保证精度的同时进一步提升模型速度可落地形成产品,并且在落地场景中增加反馈机制,对模型进行在线训练,可不断优化模型参数可利用多模态学习方法对模型进行优化撰写人:李雪涛2021/11/13
-
赛题介绍本次比赛需要选手基于显微镜成像的金相图片进行智能评估定级,原始数据为钢铁经过一系列处理后在500倍的显微镜下成像的金相图片,标签则在常见的定级范围[6.5,13.0]内以0.5级为间隔截断成14类分类标签,因此该比赛可以视为14分类的多分类问题。精度评价指标在初赛和复赛有所不同,但均为带有允许偏差的准确率指标。数据探索性分析我们首先对本次比赛的数据进行了一定的探索性分析,结果主要分为三个部分1.标签均衡:对标签的统计分析显示,该赛题提供的数据在14个类别间分布比较均衡,没有出现严重的倾斜2.尺寸恒定:所有金相图片均为1376x1104的固定尺寸图像3.高类纹理密度极大:在10.0以上的类别中晶粒分布非常密集,需要较高解析度的图片才能清晰分辨另外,我们还观察到了非常严重的图片重复与批次效应解决方案数据清洗Mean Nearest Maintaining 均值最邻近保留对于一组完全重复的图片,我们将其标签值进行平均,与组内原始标签集合进行对比,保留最邻近的数据并删除其它,在不修改原始标签的情况下去除了重复并且最小化人工噪声采样与增强随机滑窗采样将数据等比缩小至512x638,并在训练过程中在线使用512x512的随机滑窗进行均匀采样,在不破坏数据尺度的情况下获取经扩充的高分辨率面向应用的启发式数据增强利用金属晶体的对称性使用随机旋转/翻转进行数据扩充,并针对中大型金相显微镜可能发生的对焦问题引入了随机高斯模糊,另外根据现有数据中存在的金相组织缺陷的尺寸及数量加入了随机块擦除。此外,由于标签是由连续值截断而来,我们使用了Cutmix方法来扩增数据并将标签软化,防止模型对离群值产生过高置信度。基于簇的分类模型为了在数据有限的情况下避免过拟合,我们使用EfficientNetB0作为骨干网络,并在池化层后使用线性瓶颈模块将特征降维至512维为了适应基于簇分类时类数多、类内少的特点,我们在分类器的输出层加入对角度的间隔惩罚,与一般的softmax损失相比,使类内更加聚集,类间更加分离级联模型测试集存在簇外样本只针对簇进行分类时,本地交叉验证与在线提交成绩存在较大差距,由于测试集文件名不可见,所以推断为在线测试集中存在训练集中不存在的簇外样本级联分类模型基于这种假设,我们在簇分类模型之后级联了直接定级的分类模型,对于簇分类时置信度较低的簇外样本额外进行定级以提升准确率BatchTTA后处理卷积核的不对称性由于训练过程中卷积网络可能产生各向异性,我们在推理时将同一张图片进行了八方向的翻转,并将其推理结果进行均值融合。BatchTTA策略为了提升推理速度,我们将8张增强后图像叠加作为batch。如此仅需一次推理即可获得八个结果。相比单张推理仅增加了30%的推理时间,并大幅提升模型精度及泛化性能。消融实验基于V100 GPU的推理时间测试为了保证解决方案的可行性,我们对方案内每一个创新点带来的收益及对推理时间的影响进行了详细测定。最终方案在V100GPU FP16 Batch=1下可实现30FPS实时推理
-
Transformer 在自然语言处理和视觉任务中取得了令人瞩目的成果,然而预训练大模型的推理代价是备受关心的问题,华为诺亚方舟实验室的研究者们联合高校提出针对视觉和 NLP 预训练大模型的后训练量化方法。在精度不掉的情况下,比 SOTA 训练感知方法提速 100 倍以上;量化网络性能也逼近训练感知量化方法。大型预训练模型在计算机视觉和自然语言处理中展现了巨大的潜力,但是模型大、参数多的问题也给它们的商业化落地带来了很大挑战。模型压缩技术是当前的研究热点,模型量化是其中的一个重要分支。 当下预训练模型的量化为了保证性能,大多采用量化感知训练(Quantization-aware Training, QAT)。而模型后量化(Post-training Quantization, PTQ)作为另一类常用量化方法,在预训练大模型领域却鲜有探索。诺亚方舟实验室的研究者从以下四个方面对 QAT 与 PTQ 进行了详细对比:训练时间:QAT 由于模拟量化算子等操作,训练耗时远远超出全精度训练(FP),而 PTQ 仅仅需要几十分钟,大大缩短量化流程;显存开销:QAT 显存消耗大于全精度训练(FP),使得在显存有限的设备上难以进行量化训练。而 PTQ 通过逐层回归训练,无需载入整个模型到显存中,从而减小显存开销;数据依赖:QAT 需要获取整个训练数据集,而 PTQ 只需要随机采样少量校准数据,通常 1K~4K 张 / 条图像或者标注即可;性能:鉴于 QAT 在整个训练集上充分训练,其性能在不同的量化 bit 上均领先 PTQ。因此性能是 PTQ 的主要瓶颈。基于以上观测,研究者提出了针对视觉和 NLP 任务的 PTQ 方法,在保持其训练时间、显存开销、数据依赖上优势的同时,大大改善其性能,使其逼近量化感知训练的精度。具体而言,仅使用 1% 的训练数据和 1/150 的训练时间,即可达到 SOTA 量化方法的精度。 接下来将分别介绍这两项工作。 论文 1 《Post-Training Quantization for Vision Transformer》 论文链接:https://arxiv.org/pdf/2106.14156.pdf 方法概述 下图为视觉 Transformer 后训练量化算法框架: 排序损失量化 自注意力层是 Transfomer 结构中十分重要的部分,也是 Transformer 与传统卷积神经网络不同的地方。对于自注意力层,研究者发现量化使得注意力特征的相对顺序变得不同,会带来很大的性能下降。因此,他们在量化过程中引入了一个排序损失: 其中表示成对的排序损失函数,表示权衡系数。然后,研究者将排序损失函数与相似度损失函数相结合,得到了最终的优化目标函数: 论文当中采用了比尔森相关系数作为特征相似度的度量,研究者认为皮尔森相关系数减去了均值,所以对特征的分布表示更加地敏感。 为了进一步减少量化带来的误差,他们在优化量化步长过程中采用了量化误差补偿的方法,以减小量化误差对之后的网络层带来影响。因此对每个网络层的输出都进行了量化误差补偿。 在实现过程中,误差的期望值可以通过校验数据集来计算,然后在网络层的 bias 参数中去修正。 混合比特量化 不同的 transformer 网络层有不同的数据分布,因为有不同的量化「敏感度」。研究者提出了混合精度量化,对于更加「敏感」的网络层分配更多的比特宽度。 在论文中,研究者提出使用 MSA 模块中注意力层特征和 MLP 中输出特征矩阵的核范数来作为度量网络层「敏感度」的方法。与 HAWQ-V2 中的方法类似,他们使用了一种帕累托最优的方式来决定网络层的量化比特。该方法的主要思想是对每个候选比特组合进行排序,具体的计算方式如下所示: 给定一个目标模型大小,会对所有的候选比特组合进行排序,并寻找值最小的候选比特组合作为最终的混合比特量化方案。 实验验证 研究者首先在图像分类任务上对后训练量化算法进行了验证。从下表可以看出,在 ViT(DeiT)经典 transformer 模型上,论文的量化算法均优于之前的卷积神经网络量化算法【1】【2】。例如,在 ImageNet 数据集上,量化 Deit-B 模型也取得了 81.29% 的 Top-1 准确率。 图像分类任务上的后训练量化结果。 研究者还将后训练量化算法应用于目标检测任务中,其中在 COCO2017 数据集上,对 DETR 进行量化,8bit 模型的性能可以达到 41.7 mAP,接近全精度模型的性能。 目标检测任务上的后训练量化结果。 论文链接:https://arxiv.org/pdf/2109.15082.pdf 方法概述 下图为并行蒸馏下的模型后量化总体框架: 模块化重构误差最小化 由于 Transformer-based 的预训练语言模型通常含有多个线性层耦合在一起,如果采用现有的逐层重构误差优化的方法【3】,作者发现很容易陷入局部最优解。为了考虑多个线性层内部的交互,如上图所示,研究者把预训练语言模型切分成多个模块,每个模块含有多个 Transformer 层。 因此该方法聚焦于逐个重构模块化的量化误差,即最小化全精度网络模块(教师模型)的输出与量化后模型模块(学生网络)的输出之间的平方损失: 并行知识蒸馏训练 与逐个模块化重构量化误差不同,后量化还可以并行化训练。研究者把每个切分后的模块可以放在不同的 GPU 上,在不同模块之间设置输入缓冲池(input queue)来收集上一个模块的输出,同时为下一个模块的输入做准备。不同模块可以通过重置抽样从输入池获取输入样本来进行本地训练,无需等待其前继模块。因此,该设计可以使并行训练,并且实现接近理论加速比。 另外一个与逐模块训练不同的点在于,在并行知识蒸馏训练的初期,下一个模块获得的输入是从上一个未经过充分训练的模块中获得。因此,未充分训练的模块的输出可能依旧含有较大的量化误差,并且该误差会逐层传播,影响后续模块训练。 为了解决该问题,研究者受教师纠正(teacher forcing) 在训练循环网络中的启发,将第 n 个全精度模块的输出导入为第 (n+1) 个量化模块的输入,从而中断在后续模块的量化误差传播。然而,这种跨模块输入打破了与量化模型自身前继模块的联系,造成训练和推理前向不一致。为了实现平稳过渡,他们采用了如下的凸组合: 实验验证 研究者首先在 MNLI 数据集上进行验证。由下表可以发现,对比逐层后量化训练(REM)算法,提出的逐模块量化误差重构 (MREM-S)大大提升了后量化的准确率;同时,MREM-S 性能也可以接近量化感知训练(QAT)的方法,对于 BERT-base 和 BERT-large 在 W4A8 的设定下仅仅比 QAT 低了 1.1% 和 0.8%,训练时间、显存开销和数据消耗也有了减小。 当结合并行知识蒸馏时(MREM-P),后量化训练时间可以进一步缩短 4 倍,而且没有明显性能损失。例如,MREM-P 仅耗时 6 分钟,占用 3.7GB 即可完成 BERT-base 上 2 比特权重的后量化训练。 在 MNLI 上与 QAT 和 REM 的对比。 研究者同时在 GLUE 上与现有的其他算法进行了对比。如下表所示,本文的方法 (MREM-S 和 MREM-P) 比后量化方法 GOBO【4】取得更好的效果,甚至在多个任务上接近量化感知训练方法 TernaryBERT。 在 GLUE 公开数据集上与现有方法对比。 参考文献: 【1】Di Wu, Qi Tang, Yongle Zhao, Ming Zhang, Ying Fu, and Debing Zhang. Easyquant: Posttraining quantization via scale optimization. arXiv preprint arXiv:2006.16669, 2020. 【2】Peisong Wang, Qiang Chen, Xiangyu He, and Jian Cheng. Towards accurate post-training network quantization via bit-split and stitching. In International Conference on Machine Learning, pages 9847–9856. PMLR, 2020. 【3】I. Hubara, Y. Nahshan, Y. Hanani, R. Banner, and D. Soudry, “Improving post training neural quantization: Layer-wise calibration and integer programming,” in Proceedings of the International Conference on Machine Learning, 2021. 【4】A. H. Zadeh, I. Edo, O. M. Awad, and A. Moshovos, “Gobo: Quantizing attention-based nlp models for low latency and energy efficient inference,” Preprint arXiv:2005.03842, 2020.
hellohelloya
发表于2022-01-12 10:35:35
2022-01-12 10:35:35
最后回复
hellohelloya
2022-01-12 10:35:35
1307 0 -
原文链接:https://blog.csdn.net/weixin_43212535/article/details/122393250线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量),线性回归通常可以应用在股价预测、营收预测、广告效果预测、销售业绩预测当中。一元线性回归:基本概念:一元线性回归是分析只有一个自变量(自变量x和因变量y)线性相关关系的方法。一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析。数据集可以表示成{(x1,y1),(x2,y2),…,(xn,yn)}。其中,xi表示自变量x的第i个值,yi表示因变量y的第i个值,n表示数据集的样本量。当模型构建好之后,就可以根据其他自变量x的值,预测因变量y的值,该模型的数学公式可以表示成: python中展示:导入我们需要的包和相关库#引入sklearn库,使用其中的线性回归模块from sklearn import datasets,linear_model#引入train_test_split来把我们的数据集分为训练集和测试集from sklearn.model_selection import train_test_splitimport numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 创建数据集 比如我们现在有10行2列数据,第一列是身高,第二列是体重,通常做法:将原始数据切分时,将原始数据的80%作为训练数据来训练模型,另外20%作为测试数据,通过测试数据直接判断模型的效果,在模型进入真实环境前不断改进模型;data = np.array([[152,51],[156,53],[160,54],[164,55], [168,57],[172,60],[176,62],[180,65], [184,69],[188,72]]) # X,y分别存放特征向量和标签,这里边使用reshape的目的是data[:,0]是一个一维的数组,但后边模型调用的时候要求是矩阵的形式X,y = data[:,0].reshape(-1,1),data[:,1]# 训练集和测试集区分开# train_size=0.8的意思就是随机提取80%的数据作为训练数据X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=0.8) # 实现线性回归算法模型regr = linear_model.LinearRegression()# 拟合数据,训练模型regr.fit(X_train,y_train)# score得到的返回结果是决定系数R平方值regr.score(X_train,y_train)决定系数R的平方值 = 1-u/vu = (y的实际值-y的预期值)的平方的求和v = (y的实际值-y的实际值的平均值)的平方的求和--输出结果R的平方值=0.963944147932503font = {'family':"SimHei",'size':20}plt.rc('font',**font)##训练数据plt.scatter(X_train,y_train,color='r')##画拟合线plt.plot(X_train,regr.predict(X_train),color='b')plt.scatter(X_test,y_test,color='black')# 测试数据plt.xlabel('身高')plt.ylabel('体重')plt.show() 下面让我们简单的做一个预测,加入身高是170的人,他的体重是多少那?np.round(regr.predict([[170]]),1)array([59.8]),可以看到170的人,经过我们的预测他的体重是59.8公斤。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第三期2026/08/21 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;念擎-华为云AI开发者运营案例开发专家
本期直播内容:AI六层能力首次详细解读 + 新一代华为云开发者空间亮相 + 校园案例直播带练
回顾中
热门标签