Pytorch softmax回歸的簡單實現(xiàn)與GPU運算

《動手學深度學習》(pytorch版本)Chapter 3.7 SOFTMAX回歸的簡潔實現(xiàn) 部分少了把模型和數(shù)據(jù)加載到GPU上的程序闯参,如果只按照書上的代碼運行咪奖,則會報錯霉涨。這里參考機器之心pro的文章刀崖,把代碼補全仅财,用jupyter notebook 可以運行,記錄一下属韧。

import torch
from torch import nn
from torch.nn import init # initializer 
import numpy as np
# import sys # 可以用來添加包安拟,把包的地址添加到系統(tǒng)的環(huán)境變量中,便于搜索
# sys. path.append('..')
import d2lzh_pytorch as d2l

##################################
# gpu運算優(yōu)先函數(shù)
def get_default_device():
    """Pick GPU if availbale, else CPU"""
    return torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
device = get_default_device() 
print(device)

##################################
# 移動數(shù)據(jù)到目標設(shè)備的函數(shù)
def to_device(data, device):
    """Move tensors to chonsen device"""
    if isinstance(data, (list, tuple)):
        return [to_device(x, device) for x in data]
    return data.to(device, non_blocking = True)

##################################
# 數(shù)據(jù)封裝與加載到設(shè)備類
class DeviceDataLoader():
    """Wrap a dataloader to move data to a device"""
    def __init__(self, dl, device):
        self.dl = dl
        self.device = device
    def __iter__(self):
        """Yield a batch of data after moving it to device"""
        for batch in self.dl:
            yield to_device(batch, self.device)
    def __len__(self):
        """Number of batches"""
        return len(self.dl)

##################################
#  獲取數(shù)據(jù)
batch_size = 256 
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

# 封裝數(shù)據(jù)加載器
train_iter = DeviceDataLoader(train_iter, device)
test_iter = DeviceDataLoader(test_iter, device)

# 讀取一個批次試試
for X, y in train_iter:
    print('X.device', X.device) # 不用看這個宵喂,這個數(shù)據(jù)太多
    print('y', y) #看標簽
    break

##################################
# 定義和初始化模型
num_inputs = 784
num_outputs = 10

class LinearNet(nn.Module):
    def __init__(self, num_inputs, num_outputs):
        super(LinnearNet, self).__init__()
        self.linear = nn.Linear(num_inputs, num_outputs) # 定義輸入輸出個數(shù)糠赦,全連接層自動確定參數(shù)
    def forwad(self, x): # x.shape: (batch, 1, 28, 28)
        y = self.linear(x.view(x.shape[0], -1)) # 轉(zhuǎn)換為batch_size, 784 才能放入全連接層
        return y

##################################
# 將 x形狀的改變定義為一個FlattenLayer
class FlattenLayer(nn.Module):
    def __init__(self):
        super(FlattenLayer, self).__init__()
    def forward(self, x): # x shape-> ( batch, *, *, ...)
        return x.view(x.shape[0], -1)

##################################
from collections import OrderedDict
net = nn.Sequential(
    # FlattenLayer(),
    # nn.Linear(num_inputs, num_outputs)
    OrderedDict([
        ('flatten', FlattenLayer()),
        ('linear', nn.Linear(num_inputs, num_outputs))
    ]
    )
)
net = net.to(device) # 模型也加載到gpu上

##################################
# 初始化
init.normal_(net.linear.weight, mean = 0, std = 0.01)
init.constant_(net.linear.bias, val = 0)

##################################
# softmax運算和交叉熵損失函數(shù)直接整合在一起
loss = nn.CrossEntropyLoss()

##################################
#優(yōu)化算法定義,隨機梯度下降法
optimizer = torch.optim.SGD(net.parameters(), lr = 0.1)

##################################
num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

訓練與預(yù)測輸出如下:

epoch 1, loss 0.0031, train acc 0.751, test acc 0.791
epoch 2, loss 0.0022, train acc 0.813, test acc 0.790
epoch 3, loss 0.0021, train acc 0.825, test acc 0.792
epoch 4, loss 0.0020, train acc 0.832, test acc 0.823
epoch 5, loss 0.0019, train acc 0.837, test acc 0.827
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锅棕,隨后出現(xiàn)的幾起案子拙泽,更是在濱河造成了極大的恐慌,老刑警劉巖裸燎,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顾瞻,死亡現(xiàn)場離奇詭異,居然都是意外死亡德绿,警方通過查閱死者的電腦和手機朋其,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脆炎,“玉大人,你說我怎么就攤上這事氓辣∶朐#” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵钞啸,是天一觀的道長几蜻。 經(jīng)常有香客問我,道長体斩,這世上最難降的妖魔是什么梭稚? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮絮吵,結(jié)果婚禮上弧烤,老公的妹妹穿的比我還像新娘。我一直安慰自己蹬敲,他們只是感情好暇昂,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布莺戒。 她就那樣靜靜地躺著,像睡著了一般急波。 火紅的嫁衣襯著肌膚如雪从铲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天澄暮,我揣著相機與錄音名段,去河邊找鬼。 笑死泣懊,一個胖子當著我的面吹牛伸辟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗅定,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼自娩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渠退?” 一聲冷哼從身側(cè)響起忙迁,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碎乃,沒想到半個月后姊扔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡梅誓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年恰梢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗掰。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嵌言,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出及穗,到底是詐尸還是另有隱情摧茴,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布埂陆,位于F島的核電站苛白,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焚虱。R本人自食惡果不足惜购裙,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹃栽。 院中可真熱鬧躏率,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恩掷,卻和暖如春倡鲸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黄娘。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工峭状, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逼争。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓优床,卻偏偏與公主長得像,于是被迫代替她去往敵國和親誓焦。 傳聞我的和親對象是個殘疾皇子胆敞,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355