日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hw1例题-李宏毅老师课后作业

發(fā)布時(shí)間:2024/1/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hw1例题-李宏毅老师课后作业 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寫(xiě)在前面

跟著李宏毅老師從頭開(kāi)始學(xué)習(xí)深度學(xué)習(xí),因此這里用CSDN記錄深度學(xué)習(xí)的課后例題,需要注意的是以下代碼來(lái)源于網(wǎng)上,應(yīng)該是李老師的代碼,版權(quán)不屬于我,寫(xiě)這篇博客主要為了鞏固自己關(guān)于機(jī)器(深度)學(xué)習(xí)的知識(shí)。

問(wèn)題描述

hw1是Kaggle原題(https://www.kaggle.com/competitions/ml2021spring-hw1/overview),簡(jiǎn)單來(lái)說(shuō)是預(yù)測(cè)Covid19的陽(yáng)性人數(shù)。提供的文件有covid.train.csv,covid.test.csv 和sampleSubmission.csv。顯然任務(wù)是根據(jù)訓(xùn)練集的數(shù)據(jù)訓(xùn)練一個(gè)模型,并實(shí)現(xiàn)測(cè)試集的預(yù)測(cè)。

代碼部分

導(dǎo)入庫(kù)

import pandas as pd from torch import nn import numpy as np from torch.utils.data import Dataset, DataLoader, random_split from torch.utils.tensorboard import SummaryWriter import math from tqdm import tqdm #tqdm庫(kù)用于生成訓(xùn)練時(shí)的進(jìn)度條展示 import os import csv

這里的庫(kù)只有tqdm庫(kù)不太了解,注釋說(shuō)是用于進(jìn)度條展示,所以應(yīng)該是類(lèi)似于用戶(hù)友好的圖形處理界面。

建立數(shù)據(jù)集函數(shù)

class COVID19Dataset(Dataset):def __init__(self,x,y=None):if y is None:self.y=yelse:self.y=torch.FloatTensor(y)self.x=torch.FloatTensor(x)def __getitem__(self,idx):if self.y is None:return self.x[idx]else:return self.x[idx],self.y[idx]def __len__(self):return len(self.x)

上述函數(shù)建立了covid19dataset的類(lèi),繼承于torch庫(kù)里的dataset類(lèi)并覆寫(xiě)了其中的內(nèi)嵌函數(shù)__getitem,添加了函數(shù)__len__。(在此之前我一般做法都是直接讀取csv文件獲取數(shù)據(jù)集,這里學(xué)習(xí)到了)

特征提取

def select_feature(train_data,valid_data,test_data,select_all=True):y_train,y_valid=train_data[:,-1],valid_data[:,-1]raw_x_train,raw_x_valid,raw_x_test=train_data[:,:-1],valid_data[:,:-1],test_dataif select_all:feature_idx=list(range(raw_x_train.shape[1]))else:feature_idx=[0,1,2,3,4]#print(raw_x_train)return raw_x_train[:,feature_idx],raw_x_valid[:,feature_idx],raw_x_test[:,feature_idx],y_train,y_valid

感覺(jué)這里寫(xiě)的簡(jiǎn)單了很多,對(duì)于特征提取應(yīng)該可以更精細(xì)一點(diǎn)。雖然這個(gè)代碼塊可以實(shí)現(xiàn)特征選擇,但是選擇哪些特征并沒(méi)有給出,應(yīng)該對(duì)這些特征做一個(gè)比較細(xì)致的分析例如相關(guān)系數(shù)分析。

設(shè)置隨機(jī)種子

def same_seed(seed):torch.backends.cudnn.deterministic=Truetorch.backends.cudnn.benchmark=Falsenp.random.seed(seed)torch.manual_seed(seed)if torch.cuda.is_avaliable():torch.cuda.manual_seed_all(seed)

隨機(jī)劃分訓(xùn)練集和驗(yàn)證集

def train_valid_split(dataset,ratio,seed):valid_set_size=int(ratio*len(dataset))train_set_size=len(dataset)-valid_set_sizetrain_set,valid_set=random_split(dataset,[train_set_size,valid_set_size],generator=torch.Generator().manual_seed(seed))return np.array(train_set.dataset.iloc[train_set.indices,:]), np.array(valid_set.dataset.iloc[valid_set.indices,:])

這里我寫(xiě)的與原始代碼不同,主要是最后的返回值,按常理來(lái)看這里應(yīng)該是返回訓(xùn)練集和驗(yàn)證集的矩陣形式,但按照原代碼的結(jié)果返回的卻是兩個(gè)torch.utils.data.dataset.Subset對(duì)象。

定義模型

class My_Model(nn.Module):def __init__(self,input_dim):super(My_Model,self).__init__()self.layers=nn.Sequential(nn.Linear(input_dim,16),nn.ReLU(),nn.Linear(16,8),nn.ReLU(),nn.Linear(8,1))def forward(self,x):x=self.layers(x)x=x.squeeze(1)return x

顯然這部分代碼是定義了一個(gè)神經(jīng)網(wǎng)絡(luò),有2個(gè)隱藏層,神經(jīng)元個(gè)數(shù)分別為16和8,ReLU為激活函數(shù)。

定義訓(xùn)練函數(shù)

def trainer(train_loader,valid_loader,model,config,device):criterion=nn.MSELoss(reduction='mean')optimizer=torch.optim.SGD(model.parameters(),lr=config['learning_rate'],momentum=0.9)writer=SummaryWriter()if not os.path.isdir('./models'):os.mkdir('./models')n_epochs,best_loss,step,early_stop_count=config['n_epochs'],math.inf,0,0for epoch in range(n_epochs):model.train()loss_record=[]train_pbar=tqdm(train_loader,position=0,leave=True)for x,y in train_pbar:optimizer.zero_grad()x,y=x.to(device),y.to(device)pred=model(x)loss=criterion(pred,y)loss.backward()optimizer.step()step+=1loss_record.append(loss.detach().item())train_pbar.set_description(f'Epoch [{epoch+1}/{n_epochs}]')train_pbar.set_postfix({'loss':loss.detach().item()})mean_train_loss=sum(loss_record)/len(loss_record)writer.add_scalar('Loss/train', mean_train_loss, step) #tensoboard畫(huà)出loss曲線model.eval()loss_record=[]for x,y in valid_loader:x,y=x.to(device),y.to(device)with torch.no_grad():pred=model(x)loss=criterion(pred,y)loss_record.append(loss.item())mean_valid_loss=sum(loss_record)/len(loss_record)print(f'Epoch [{epoch+1}/{n_epochs}]: Train loss: {mean_train_loss:.4f}, Valid loss: {mean_valid_loss:.4f}')writer.add_scalar('Loss/valid', mean_valid_loss, step)if mean_valid_loss<best_loss:best_loss=mean_valid_losstorch.save(model.state_dict(),config['save_path'])print(f'Saving model with loss {best_loss:.3f}...')early_stop_count=0else:early_stop_count+=1if early_stop_count>=config['early_stop_count']:print('\nModel is mot improving, so we halt the training session.')return

該部分十分重要,可以說(shuō)是核心代碼了,所以有必要進(jìn)行詳細(xì)的說(shuō)明。這部分代碼即是為了完成模型的訓(xùn)練。函數(shù)的參數(shù)有訓(xùn)練集、驗(yàn)證集、自定義配置和設(shè)備(cpu or gpu)。首先定義了損失函數(shù)和優(yōu)化器,算是常見(jiàn)的操作了,SummaryWriter是我第一次見(jiàn)到,與tensorboard相關(guān),后續(xù)會(huì)仔細(xì)再看看。之后定義了存儲(chǔ)位置和epoch,best_loss以及early_stop_count。early_stop_count在我用XGBoost時(shí)經(jīng)常遇到,主要是為了停止損失基本不下降模型的訓(xùn)練。下面正式進(jìn)入epoch,在每一個(gè)epoch中:首先model.train(),表明模型開(kāi)啟訓(xùn)練模式,打開(kāi)batch normalization和drop out,與之對(duì)應(yīng)的是model.eval(),即將對(duì)應(yīng)的設(shè)置關(guān)閉,在驗(yàn)證集上使用。train_pbar用到了tqdm類(lèi),可視化了遍歷訓(xùn)練集的進(jìn)度,position設(shè)置了打印進(jìn)度條的位置,leave是表示執(zhí)行完成后是否保留進(jìn)度條。隨后開(kāi)始遍歷訓(xùn)練集,將輸入與輸出分別轉(zhuǎn)移到相應(yīng)的device上,之后定義損失函數(shù),同時(shí)將得到的損失記錄下來(lái),遍歷完之后,計(jì)算平均損失。之后進(jìn)入模型驗(yàn)證,這里就要關(guān)閉模型的訓(xùn)練模式,因?yàn)槟P万?yàn)證是為了觀察模型在訓(xùn)練之后在驗(yàn)證集的表現(xiàn),所以這里torch.no_grad()表明無(wú)需對(duì)模型計(jì)算梯度,只需要計(jì)算損失即可。最后比較驗(yàn)證集上的平均損失與最低損失,如果小于則更新最低損失為當(dāng)前平均損失并將early_stop_count設(shè)為0,否則early_stop_count+=1。

開(kāi)始:

框架已經(jīng)搭好,后面就是正式開(kāi)始訓(xùn)練模型,這部分內(nèi)容比較簡(jiǎn)單易懂,就不多贅述。

讀取并劃分?jǐn)?shù)據(jù)

device = 'cuda' if torch.cuda.is_available() else 'cpu' config={'seed':0,'select_all':True,'valid_ratio':0.2,'n_epochs':3000,'batch_size':256,'learning_rate':1e-5,'early_stop_count':400,'save_path': './models/model.ckpt' }train_data=pd.read_csv(r'D:\Work Studio\Python 3.8.6\My secret base\hw\hw1\ml2021spring-hw1\covid.train.csv').iloc[:,1:] test_data=np.array(pd.read_csv(r'D:\Work Studio\Python 3.8.6\My secret base\hw\hw1\ml2021spring-hw1\covid.test.csv').iloc[:,1:])train_data, valid_data = train_valid_split(train_data, config['valid_ratio'], config['seed']) x_train, x_valid, x_test, y_train, y_valid = select_feature(train_data, valid_data, test_data, config['select_all']) train_dataset, valid_dataset, test_dataset = COVID19Dataset(x_train, y_train), \COVID19Dataset(x_valid, y_valid), \COVID19Dataset(x_test) train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True, pin_memory=True) #pin_memory默認(rèn)false,打開(kāi)后更快 valid_loader = DataLoader(valid_dataset, batch_size=config['batch_size'], shuffle=True, pin_memory=True) test_loader = DataLoader(test_dataset, batch_size=config['batch_size'], shuffle=False, pin_memory=True)

訓(xùn)練模型

model = My_Model(input_dim=x_train.shape[1]).to(device) # put your model and data on the same computation device. trainer(train_loader, valid_loader, model, config, device)

保存模型并預(yù)測(cè)數(shù)據(jù)

def save_pred(preds, file):''' Save predictions to specified file '''with open(file, 'w') as fp:writer = csv.writer(fp)writer.writerow(['id', 'tested_positive'])for i, p in enumerate(preds):writer.writerow([i, p])model = My_Model(input_dim=x_train.shape[1]).to(device) model.load_state_dict(torch.load(config['save_path'])) preds = predict(test_loader, model, device) save_pred(preds, 'pred.csv')

總結(jié)

以上即是hw1例題的基本內(nèi)容,經(jīng)過(guò)這一次的學(xué)習(xí)和探討,我對(duì)機(jī)器學(xué)習(xí)框架的建立有了更深刻的了解。后續(xù)如果有新的感悟和思考,會(huì)繼續(xù)更新補(bǔ)充,也歡迎大家批評(píng)指正。

總結(jié)

以上是生活随笔為你收集整理的hw1例题-李宏毅老师课后作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 夜夜草视频 | 美女擦边视频 | 欧美三区视频 | 亚洲爱爱av| 网址在线观看你懂的 | 欧美一级黄 | 色哟哟免费视频 | 偷拍青青草| 天天色天天爱 | 少妇裸体挤奶汁奶水视频 | 小视频在线免费观看 | 草草视频在线播放 | 成人午夜激情网 | 日韩视频免费在线 | 亚洲啊v在线 | 性开放网站 | 性欧美hd调教 | 亚洲精品在线观看网站 | 国产黄色大全 | 亚洲精品天堂在线观看 | 亚洲第一综合 | 国产亚洲精品码 | 少妇毛片一区二区三区粉嫩av | 蜜桃色av | www.激情五月.com| 操碰视频在线 | youjizz视频 | 欧美大片在线 | 日本在线视频中文字幕 | 一本色道久久加勒比精品 | 国产一区二区免费看 | 伊人激情 | 欧美亚洲伦理 | 国产av第一区| 午夜影院18 | 久久草精品 | 婷婷六月天在线 | 久久精品国产久精国产 | 麻豆一区二区在线观看 | 视频丨9l丨白浆 | 秋霞成人午夜鲁丝一区二区三区 | 草草影院网址 | 在线麻豆 | 国产三级一区二区三区 | 成 人 黄 色 片 在线播放 | 黄色一级一片 | 国产精品久久久久久久久免费相片 | 男男受被啪到高潮自述 | 男生和女生一起差差差视频 | 欧美性猛交ⅹ乱大交3 | 国产福利视频一区二区三区 | 免费人成视频在线播放 | 加勒比一区二区三区 | 在线中文字幕亚洲 | 欧美亚洲第一区 | 亚洲综合国产精品 | 日韩精品1 | 国产精品久久久久久久久久直播 | 99精品国自产在线 | 日本波多野结衣在线 | 很黄很黄的网站 | 欧美 亚洲 另类 激情 另类 | 亚洲激情视频在线观看 | 日韩精品在线免费视频 | 国产精品99久久久 | 精品少妇一区二区三区免费观看 | 西方av在线 | 韩漫动漫免费大全在线观看 | 免费av高清 | 天天干天天干 | 荒野求生21天去码版网站 | 欧美少妇喷水 | 精品久久久久久久久久久久 | 黄色在线免费视频 | 涩涩99| 一级毛片aa | 欧美性猛交ⅹxx乱大交 | 欧美一级免费大片 | 91精品国产成人www | 欧美精品一区在线 | 免费观看在线播放 | 一区二区国产欧美 | 人与动物2免费观看完整版电影高清 | 久久久久久久久久久久国产 | 精品人妻久久久久久888不卡 | 久久久久久久久久久久久久久久久久久 | xxxwww黄色| 红桃成人网| 色香蕉在线视频 | 极品销魂美女少妇尤物 | 91极品尤物 | 国产又大又硬又粗 | 日韩aa| 黄色长视频 | 六月丁香色婷婷 | 欧美一级黄色片视频 | 国产精品久久久久久久免费 | 欧美日韩国产一区二区在线观看 | 中文字幕在线播放av |