DNNRegression(pytorch)

news/2025/11/28 16:49:18/文章来源:https://www.cnblogs.com/ylxn/p/19283339

最近开始学习 pytroch,照着kaggle 简单实现优化了一个 DNN

需要搭建网络、把数据放入dataset,然后定义前向传播

  • 搭建net
  • 手写 l2正则 loss
  • 手写 early_stop

 

import matplotlib.pyplot as plt
import torch
from matplotlib.pyplot import figure
from torch.utils.data import DataLoaderfrom kaggle.covid.data_loader import CovidDataLoaderclass CovidTaskUtil:@staticmethoddef get_dataset_loss(validation_set, model, device):model.eval()total_loss = 0for x, y in validation_set:x, y = x.to(device), y.to(device)with torch.no_grad():prediction = model(x)mse_loss = model.cal_loss_l2(prediction, y, 0.000075)  # compute losstotal_loss += mse_loss.detach().item() * len(x)  # accumulate losstotal_loss = total_loss / len(validation_set.dataset)  # compute averaged lossreturn total_loss@staticmethoddef train(train_set, validation_set, model, config, device):n_epochs = config['n_epochs']  # Maximum number of epochsoptimizer = getattr(torch.optim, config['optimizer'])(model.parameters(), **config['optim_hparas'])min_mse = 1000.loss_record = {'train': [], 'validation': []}  # for recording training lossearly_stop_cnt = 0epoch = 0while epoch < n_epochs:model.train()  # set model to training modefor x, y in train_set:  # iterate through the dataloaderoptimizer.zero_grad()  # set gradient to zerox, y = x.to(device), y.to(device)  # move data to device (cpu/cuda)prediction = model(x)  # forward pass (compute output)mse_loss = model.cal_loss_l2(prediction, y, 0.000075)  # compute lossmse_loss.backward()  # compute gradient (backpropagation)optimizer.step()  # update parametersloss_record['train'].append(mse_loss.detach().item())# After each epoch, test your model on the validation set.validation_loss = CovidTaskUtil.get_dataset_loss(validation_set, model, device)if validation_loss < min_mse:min_mse = validation_lossprint(f'Saving model (epoch = {epoch + 1}, loss = {min_mse})')torch.save(model.state_dict(), config['save_path'])  # Save model to specified pathearly_stop_cnt = 0else:early_stop_cnt += 1epoch += 1loss_record['validation'].append(validation_loss)if early_stop_cnt > config['early_stop']:breakprint('Finished training after {} epochs'.format(epoch))return min_mse, loss_record@staticmethoddef get_predictions(tt_set, model, device):model.eval()predictions = []for x in tt_set:x = x.to(device)with torch.no_grad():prediction = model(x)predictions.append(prediction.detach().cpu())predictions = torch.cat(predictions, dim=0).numpy()return predictions@staticmethoddef get_device():device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")return device@staticmethoddef plot_learning_curve(loss_record, title=''):total_steps = len(loss_record['train'])x_1 = range(total_steps)# same lengthx_2 = x_1[::len(loss_record['train']) // len(loss_record['validation'])]figure(figsize=(6, 4))plt.plot(x_1, loss_record['train'], c='tab:red', label='train')plt.plot(x_2, loss_record['validation'], c='tab:cyan', label='validation')plt.ylim(0.0, 5.)plt.xlabel('Training steps')plt.ylabel('MSE loss')plt.title('Learning curve of {}'.format(title))plt.legend()plt.show()@staticmethoddef plot_prediction(data_set, model, device, lim=35., predictions=None, targets=None):if predictions is None or targets is None:model.eval()predictions, targets = [], []for x, y in data_set:x, y = x.to(device), y.to(device)with torch.no_grad():prediction = model(x)predictions.append(prediction.detach().cpu())targets.append(y.detach().cpu())predictions = torch.cat(predictions, dim=0).numpy()targets = torch.cat(targets, dim=0).numpy()figure(figsize=(5, 5))plt.scatter(targets, predictions, c='r', alpha=0.5)plt.plot([-0.2, lim], [-0.2, lim], c='b')plt.xlim(-0.2, lim)plt.ylim(-0.2, lim)plt.xlabel('ground truth value')plt.ylabel('predicted value')plt.title('Ground Truth v.s. Prediction')plt.show()@staticmethoddef prep_dataloader(path, mode, batch_size, n_jobs=0, indexes=None):dataset = CovidDataLoader(path, mode=mode, indexes=indexes)dataloader = DataLoader(dataset, batch_size, shuffle=(mode == 'train'), drop_last=False,num_workers=n_jobs, pin_memory=True)return dataloader

 

 

import csvimport numpy as np
import torch
from torch.utils.data import Datasetclass CovidDataLoader(Dataset):def __init__(self, path: str, mode: str, indexes=None):self.mode = modewith open(path, 'r') as fp:data = list(csv.reader(fp))# drop first column and title rowdata = np.array(data[1:])[:, 1:].astype(float)features = data[:, indexes]self.target = target = data[:, -1]self.features = torch.FloatTensor(features)self.target = torch.FloatTensor(target)self.features[:, 40:] = (self.features[:, 40:] - self.features[:, 40:].mean(dim=0, keepdim=True)) / \self.features[:, 40:].std(dim=0, keepdim=True)self.dim = self.features.shape[1]print(f'Finished reading the {mode} set of COVID19 Dataset ({len(self.features)} samples found, each dim = {self.dim})')def __getitem__(self, index):# Returns one sample at a timeif self.mode in ['train', 'dev']:return self.features[index], self.target[index]else:return self.features[index]def __len__(self):return len(self.features)

 

from dataclasses import dataclass, fieldimport pandas as pd
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression@dataclass
class FeatureSelector:path: str = ""target_index: int = 0feature_start_index: int = 0feature_end_index: int = 0top_selected: int = 0data: pd.DataFrame = field(default_factory=pd.DataFrame)x: pd.DataFrame = field(default_factory=pd.DataFrame)y: pd.DataFrame = field(default_factory=pd.DataFrame)def init(self):self.data = pd.read_csv(self.path)self.x = self.data[self.data.columns[self.feature_start_index:self.feature_end_index]]self.y = self.data[self.data.columns[self.target_index]]def min_max_scaling(self):self.x = (self.x - self.x.min()) / (self.x.max() - self.x.min())def run(self):self.init()self.min_max_scaling()selector = SelectKBest(score_func=f_regression, k=self.top_selected)fit = selector.fit(self.x, self.y)scores = pd.DataFrame(fit.scores_)columns = pd.DataFrame(self.x.columns)feature_scores = pd.concat([columns, scores], axis=1)feature_scores.columns = ['Specs', 'Score']  # naming the dataframe columnstop_features = feature_scores.nlargest(self.top_selected, 'Score')print(top_features)  # print 15 best featuresselected_indexes = top_features.index.tolist()return selected_indexes

 

 

import torch
import torch.nn as nn
from typing import Listclass NeuralNet(nn.Module):def __init__(self, input_dim: int, hidden_layers: List[int]):super(NeuralNet, self).__init__()layers = []# 输入层到第一个隐藏层
        layers.extend([nn.Linear(input_dim, hidden_layers[0]),nn.BatchNorm1d(hidden_layers[0]),nn.Dropout(p=0.2),nn.LeakyReLU()])# 隐藏层之间的连接for i in range(len(hidden_layers) - 1):layers.extend([nn.Linear(hidden_layers[i], hidden_layers[i + 1]),nn.BatchNorm1d(hidden_layers[i + 1]),nn.Dropout(p=0.2),nn.LeakyReLU()])layers.append(nn.Linear(hidden_layers[-1], 1))self.net = nn.Sequential(*layers)self.criterion = nn.MSELoss(reduction='mean')def forward(self, x):return self.net(x).squeeze(1)def cal_loss(self, prediction, target):return self.criterion(prediction, target)def cal_loss_l2(self, prediction, target, alpha):main_loss = self.criterion(prediction, target)l2_reg = torch.tensor(0., device=prediction.device)for param in self.parameters():l2_reg += torch.sum(param ** 2)total_loss = main_loss + alpha * l2_regreturn total_loss

 

import torchfrom kaggle.covid.covid_taks_util import CovidTaskUtil
from kaggle.covid.feature_seletor import FeatureSelector
from kaggle.covid.models.covid_nn import NeuralNettrain_path = "/Users/wunan/Desktop/kaggledata/covid/train.csv"
test_path = "/Users/wunan/Desktop/kaggledata/covid/test.csv"feature_selector = FeatureSelector(path=train_path, target_index=94, feature_end_index=94, feature_start_index=1,top_selected=15)
selected_indexes = feature_selector.run()
print("Selected indexes from run():", selected_indexes)device = CovidTaskUtil.get_device()config = {'n_epochs': 10000,  # 因为有early_stop,所以大一点没有影响'batch_size': 200,  # 微调batchsize'optimizer': 'Adam',  # 使用Adam优化器'optim_hparas': {  # 完全使用默认参数# 'lr': 0.0001,# 'momentum': 0.9,# 'weight_decay': 5e-4,
    },'early_stop': 500,  # 由于最后训练使用了所有数据,大一点影响不大'save_path': '/Users/wunan/PycharmProjects/mlstudy/kaggle/covid/models/model.pth'
}train_set = CovidTaskUtil.prep_dataloader(train_path, 'train', config['batch_size'], indexes=selected_indexes)
validation_set = CovidTaskUtil.prep_dataloader(train_path, 'train', config['batch_size'], indexes=selected_indexes)
test_set = CovidTaskUtil.prep_dataloader(test_path, 'test', config['batch_size'], indexes=selected_indexes)model = NeuralNet(validation_set.dataset.dim, [518, 256, 128, 64]).to(device)model_loss, model_loss_record = CovidTaskUtil.train(train_set, validation_set, model, config, device)
CovidTaskUtil.plot_learning_curve(model_loss_record, title='deep model')del model
model = NeuralNet(train_set.dataset.dim, [518, 256, 128, 64]).to(device)
ckpt = torch.load(config['save_path'], map_location='cpu')  # Load your best model
model.load_state_dict(ckpt)
CovidTaskUtil.plot_prediction(train_set, model, device)

 

 

https://www.kaggle.com/code/lemontreeyc/hw1-public-strong-baseline/notebook

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

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

相关文章

大模型开发技巧记录(不定期更新)

让AI定期总结当前架构、解决的问题的详细逻辑方案到本地docs目录下,可以避免上下文满了以后,再次解决问题时,会存在理解漂移的情况。 利用system prompt或前置prompt:一些环境变量、命令等运行前提,比如进入虚拟环…

2025年字节跳动奖学金揭晓:20位获奖人才研究方向速览

20位顶尖天才,人均顶会5篇!2025年字节跳动奖学金重磅升级!继去年首次拓展海外高校后,今年再掀人才集聚浪潮! 20位顶尖博士从中国、新加坡66所高校的500余份申请中脱颖而出,奖学金直接翻倍至20万元 (含10万现金 +…

2025最新宠物抓伤应急护理液品牌推荐!宠物抓伤消毒液/宠物消杀品/宠物抓伤创面消毒液,专业宠物消杀品权威榜单发布,守护健康安全

随着养宠家庭数量持续增长,宠物抓伤处理成为养宠生活中的重要健康议题。本榜单基于杀菌效能、安全性、使用便捷性三大核心维度,结合《2025中国宠物医疗护理行业白皮书》调研数据,精选2025年五大宠物抓伤护理液品牌,…

CoaXPress 相机采集卡对比 - Hello

CoaXPress 相机采集卡对比背景CoaXPress(CXP)相机采集卡 是一种专用于连接 CoaXPress 接口工业相机 的 PCIe 接口图像采集设备,其核心作用是:将高速 CoaXPress 相机输出的图像数据,通过同轴电缆接收、解码,并传输…

Python+Selenium+PO设计模式实战指南

基于PO设计模式搭建的自动化测试框架1. PO设计模式概述 PO设计模式将网页的页面元素和操作封装到类中,每个页面对应一个类,每个类中的方法代表与页面交互的操作。这种方式有助于将页面元素的定位和操作与测试脚本的逻…

2025年PC砖批发厂家权威推荐榜单:地铺石/仿石材砖‌/石材‌源头厂家精选

在绿色建筑与城市生态建设政策推动下,PC砖(预制混凝土砖)凭借其环保属性、高强度、仿石质感及成本优势,市场需求持续增长。行业数据显示,2031年全球PC仿石砖市场销售额预计实现稳定增长,其中中国市场在全球占据重…

2025建材推荐榜:煌匠美缝剂_环氧地坪_彩砂自流平,装修选材必看!

2025 建材推荐榜:煌匠美缝剂 / 环氧地坪 / 彩砂自流平,装修选材必看装修选材时,美缝剂、环氧地坪、彩砂自流平的品质直接决定空间颜值与耐用性。在 2025 建材行业推荐榜中,河南煌匠建材有限公司凭借十三年深耕积淀…

数据泄露已成为现实威胁,你的Salesforce安全做好了吗?

近年来,很多知名企业因为数据泄露遭遇了巨大的损失。Facebook、Equifax大家都不陌生。问题来了,不仅客户数据丢失,信任也会丧失,赔偿和品牌形象损害更是“雪上加霜”。 作为Salesforce顾问,我们的工作不仅仅是配置…

【IEEE出版 | EI检索】第七届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2025)

第七届信息技术与计算机应用学术会议(ITCA 2025) 作为第七届国际科技创新学术交流大会的分会场开展,大会将于2025年12月19-21日在中国广州隆重举行。【本届会议已上线至IEEE官方列表】 第七届国际科技创新学术交流大会…

实用指南:LSTM模型做二分类(PyTorch实现)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年东莞樟木头搬家服务权威推荐榜单:东莞同城搬家公司/东莞厚街搬家服务/东莞大岭山搬家服务精选

在东莞樟木头地区,随着城市建设和居民生活需求的不断变化,专业、可靠的搬家服务已成为企业和家庭在搬迁过程中的核心需求。根据相关行业数据显示,2025年东莞地区搬家服务市场规模预计将持续增长,其中家庭搬家、企业…

2025年办公场地口碑推荐:前10名优质场地揭晓,办公场地/园区/企业独栋办公场地出售推荐排行榜单

前言 随着企业转型升级步伐加快,办公场地的选择已成为影响企业发展的重要因素。本文基于市场调研数据,从区位交通、产品设计、配套设施、服务体系等维度,对当前市场上表现优异的办公场地进行客观分析,为企业在选址…

河南煌匠建材:专注美缝剂、环氧地坪、彩砂自流平,15年匠心守护优质空间 (2)

河南煌匠建材:专注美缝剂、环氧地坪、彩砂自流平,15 年匠心守护优质空间2010 年,煌匠集团于香港正式启航,以 “匠心筑品质,创新赢市场” 为核心理念深耕建材领域。如今,集团旗下子公司河南煌匠建材有限公司(注册…

6款免费AI毕业论文工具推荐:一键生成+零成本降重,效率翻倍

作者分享校园论坛大四学生临近答辩论文仍无头绪的事,引出 6 款免费 AI 毕业论文工具。包括能 30 分钟生成论文初稿、支持在线改稿的 PaperNex;改稿功能出色的瑞达写作;专注教育领域文献的 ERIC;极速生成初稿且智能…

打开文件夹

nautilus /usr/bin/

MySQL执行过程

目录MySQL执行过程修正binlog开启状态一句话总结SQL执行:总结要点数据恢复崩溃恢复(自动)手动恢复(人为)一句话对比 MySQL执行过程 修正 MySQL - 一条 SQL 的执行过程详解 | Java 全栈知识体系 其中修正:数据库连…

2025年11月SEM扫描电镜厂家推荐榜:进口/国产/日立/国仪/钨灯丝/FIB/日立冷场/电子/场发射/高分子/超高分辨率/扫描电镜品牌综合参考指南,上海富泰微——微观视界的硬核担当

2025年,扫描电子显微镜(SEM)行业持续保持10%以上的年增长率,市场规模稳步攀升,成为材料科学、纳米技术等领域不可或缺的核心装备。在众多从业者的选型需求下,兼具技术实力与服务保障的企业更受青睐,以下这份推荐…

玩 Linux 随便记录点东西

声明:本文有大量内容由 AI 生成,但是这些内容经过验证。 QQ 9 更改存储位置 好像改不了,只能把原来的聊天记录复制过来。 具体来说,把原来以 QQ 号命名的文件夹里的 nt_qq 文件夹里的东西,复制到 ~/.config/QQ/nt…

占有率最高的工业总线:PROFINET、Modbus 与 EtherCAT

占有率最高的工业总线:PROFINET、Modbus 与 EtherCAT剑指工控 作者: 工控老王 剑指工控 06-10 08:03 投诉 阅读数:1443​​引言 在工业自动化领域,通信协议的选择是保障生产效率、设备协同及系统稳定运行的关键因…

2025年11月深圳网站建设公司TOP榜:知名网站建售/外贸网站建设公司后保障双维度解析

在数字化转型深入推进的当下,企业官网已从基础信息展示平台升级为品牌传播与业务拓展的核心载体,优质的网站建设服务成为企业实现数字化突破的关键支撑。对于企业而言,选择一家专业、可靠的网站建设服务商,直接关系…