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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

莫烦-pytorch

發(fā)布時(shí)間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 莫烦-pytorch 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

pytorch 莫煩

激勵(lì)函數(shù)

Y = AF(Wx)
這里的AF()就是激勵(lì)函數(shù),其實(shí)就是另外一個(gè)非線性函數(shù)。比如relu,sigmoid,tanh

  • 選擇激勵(lì)函數(shù)的竅門:當(dāng)神經(jīng)網(wǎng)絡(luò)層只有兩三層時(shí),可選擇任意的激勵(lì)函數(shù);當(dāng)神經(jīng)網(wǎng)絡(luò)特別多層時(shí),要慎重,小心梯度爆炸
  • CNN時(shí)推薦relu
  • RNN時(shí)推薦tanh或者relu

回歸

  • 建立神經(jīng)網(wǎng)絡(luò)
class Net(torch.nn.Module): # 繼承 torch 的 Moduledef __init__(self, n_feature, n_hidden, n_output):super(Net, self).__init__() # 繼承 __init__ 功能# 定義每層用什么樣的形式self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隱藏層線性輸出self.predict = torch.nn.Linear(n_hidden, n_output) # 輸出層線性輸出def forward(self, x): # 這同時(shí)也是 Module 中的 forward 功能# 正向傳播輸入值, 神經(jīng)網(wǎng)絡(luò)分析出輸出值x = F.relu(self.hidden(x)) # 激勵(lì)函數(shù)(隱藏層的線性值)x = self.predict(x) # 輸出值return x
  • 訓(xùn)練網(wǎng)絡(luò)
# optimizer 是訓(xùn)練的工具,有四個(gè)常用的optimizer optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 傳入 net 的所有參數(shù), 學(xué)習(xí)率 loss_func = torch.nn.MSELoss() # 預(yù)測(cè)值和真實(shí)值的誤差計(jì)算公式 (均方差)for t in range(100):prediction = net(x) # 喂給 net 訓(xùn)練數(shù)據(jù) x, 輸出預(yù)測(cè)值loss = loss_func(prediction, y) # 計(jì)算兩者的誤差optimizer.zero_grad() # 清空上一步的殘余更新參數(shù)值loss.backward() # 誤差反向傳播, 計(jì)算參數(shù)更新值optimizer.step() # 將參數(shù)更新值施加到 net 的 parameters 上

分類

  • 建立神經(jīng)網(wǎng)絡(luò)
def forward(self, x):# 正向傳播輸入值, 神經(jīng)網(wǎng)絡(luò)分析出輸出值x = F.relu(self.hidden(x)) # 激勵(lì)函數(shù)(隱藏層的線性值)x = self.out(x) # 輸出值, 但是這個(gè)不是預(yù)測(cè)值, 預(yù)測(cè)值還需要再另外計(jì)算return x
  • 訓(xùn)練網(wǎng)絡(luò)
loss_func = torch.nn.CrossEntropyLoss()

快速搭建

搭建神經(jīng)網(wǎng)絡(luò)不止class net()這種方法,有一個(gè)快速的方法torch.nn.Sequential()

net = torch.nn.Sequential(torch.nn.Linear(1, 10),torch.nn.ReLU(),torch.nn.Linear(10, 1) )

Sequential方法直接認(rèn)定的就是relu()這種激勵(lì)函數(shù),而對(duì)于自己手寫的net來說,可以在forward()方法中指定激勵(lì)函數(shù),就會(huì)更加靈活一些。

保存與提取

  • 保存
torch.save(net1, 'net.pkl') # 保存整個(gè)網(wǎng)絡(luò) torch.save(net1.state_dict(), 'net_params.pkl') # 只保存網(wǎng)絡(luò)中的參數(shù) (速度快, 占內(nèi)存少)
  • 提取
def restore_net():# restore entire net1 to net2net2 = torch.load('net.pkl')prediction = net2(x)
  • 提取網(wǎng)絡(luò)參數(shù)
    網(wǎng)絡(luò)參數(shù):能獨(dú)立地反映網(wǎng)絡(luò)特性的參數(shù)
    提取所有網(wǎng)路參數(shù)
net3.load_state_dict(torch.load('net_params.pkl')) prediction = net3(x)

批訓(xùn)練

DataLoader

# 先轉(zhuǎn)換成 torch 能識(shí)別的 Dataset torch_dataset = Data.TensorDataset(data_tensor=x, target_tensor=y)# 把 dataset 放入 DataLoader loader = Data.DataLoader(dataset=torch_dataset, # torch TensorDataset formatbatch_size=BATCH_SIZE, # mini batch size.,就是每次取多少數(shù)據(jù)shuffle=True, # 要不要打亂數(shù)據(jù) (打亂比較好)num_workers=2, # 多線程來讀數(shù)據(jù) )

優(yōu)化器

要讓神經(jīng)網(wǎng)絡(luò)聰明起來!!!!

  • SGD
  • Momentum
  • AdaGrad
  • RMSProp
  • Adam
  • SGD
  • Momentum
    所以我們把這個(gè)人從平地上放到了一個(gè)斜坡上, 只要他往下坡的方向走一點(diǎn)點(diǎn), 由于向下的慣性, 他不自覺地就一直往下走, 走的彎路也變少了. 這就是 Momentum 參數(shù)更新.
  • AdaGrad
    而是給他一雙不好走路的鞋子, 使得他一搖晃著走路就腳疼, 鞋子成為了走彎路的阻力, 逼著他往前直著走
  • RMSProp
    是momentum和adagrad的集合體,同時(shí)具備兩者的優(yōu)勢(shì)。但是RMSProp并沒有包含momentum的一部分,所以在Adam中又進(jìn)一步改進(jìn)
  • Adam
    對(duì)于Adam來說,能快好的達(dá)到目標(biāo),快速收斂到最好的地方
  • Optimizer

    • SGD
    • Momentum
    • RMSProp
    • Adam
    net_SGD = Net() net_Momentum = Net() net_RMSprop = Net() net_Adam = Net() # different optimizers opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR) opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8) opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9) opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))

    在實(shí)驗(yàn)中,對(duì)各個(gè)優(yōu)化器還是都應(yīng)該試一試,看看哪個(gè)更好

    CNN

    • 從下到上的順序, 首先是輸入的圖片(image), 經(jīng)過一層卷積層 (convolution), 然后在用池化(pooling)方式處理卷積的信息, 這里使用的是 max pooling 的方式.
    • 然后在經(jīng)過一次同樣的處理, 把得到的第二次處理的信息傳入兩層全連接的神經(jīng)層 (fully connected),這也是一般的兩層神經(jīng)網(wǎng)絡(luò)層,最后在接上一個(gè)分類器(classifier)進(jìn)行分類預(yù)測(cè). 這僅僅是對(duì)卷積神經(jīng)網(wǎng)絡(luò)在圖片處理上一次簡單的介紹.
    • 卷積層(Convolutional Layer) - 主要作用是提取特征
    • 池化層(Max Pooling Layer) - 主要作用是下采樣(downsampling),卻不會(huì)損壞識(shí)別結(jié)果
    • 全連接層(Fully Connected Layer) - 主要作用是分類預(yù)測(cè)
    class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Sequential( # input shape (1, 28, 28)nn.Conv2d(in_channels=1, # input heightout_channels=16, # n_filterskernel_size=5, # filter sizestride=1, # filter movement/steppadding=2, # 如果想要 con2d 出來的圖片長寬沒有變化, padding=(kernel_size-1)/2 當(dāng) stride=1), # output shape (16, 28, 28)nn.ReLU(), # activationnn.MaxPool2d(kernel_size=2), # 在 2x2 空間里向下采樣, output shape (16, 14, 14))self.conv2 = nn.Sequential( # input shape (16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2), # output shape (32, 14, 14)nn.ReLU(), # activationnn.MaxPool2d(2), # output shape (32, 7, 7))self.out = nn.Linear(32 * 7 * 7, 10) # fully connected layer, output 10 classesdef forward(self, x):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size(0), -1) # 展平多維的卷積圖成 (batch_size, 32 * 7 * 7)output = self.out(x)return output

    這個(gè) CNN 整體流程是 卷積(Conv2d) -> 激勵(lì)函數(shù)(ReLU) -> 池化, 向下采樣 (MaxPooling) -> 再來一遍 -> 展平多維的卷積成的特征圖 -> 接入全連接層 (Linear) -> 輸出

    RNN


    RNN是在有順序的數(shù)據(jù)上進(jìn)行學(xué)習(xí)的,在反向傳遞得到誤差的時(shí)候,每一步都會(huì)乘以自己的一個(gè)參數(shù)W,若W是小于1,則誤差傳遞到初始時(shí)間的時(shí)候會(huì)接近0,即梯度消失;反之,則是梯度爆炸!hong!然后LSTM是為了解決這個(gè)問題而提出來的

    LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)

    • 主線:就是主線劇情

    • 分線,即是原本的RNN體系。
      1. 輸入:重要程度 寫入主線劇情 進(jìn)行分析.
      2.忘記: 如果此時(shí)的分線劇情更改了我們對(duì)之前劇情的想法, 那么忘記控制就會(huì)將之前的某些主線劇情忘記, 按比例替換成現(xiàn)在的新劇情
      3.輸出:基于目前的主線劇情和分線劇情判斷要輸出的到底是什么

    RNN分類問題

    class RNN(nn.Module):def __init__(self):super(RNN, self).__init__()self.rnn = nn.LSTM( # LSTM 效果要比 nn.RNN() 好多了input_size=28, # 圖片每行的數(shù)據(jù)像素點(diǎn)hidden_size=64, # rnn hidden unitnum_layers=1, # 有幾層 RNN layersbatch_first=True, # input & output 會(huì)是以 batch size 為第一維度的特征集 e.g. (batch, time_step, input_size))self.out = nn.Linear(64, 10) # 輸出層def forward(self, x):# x shape (batch, time_step, input_size)# r_out shape (batch, time_step, output_size)# h_n shape (n_layers, batch, hidden_size) LSTM 有兩個(gè) hidden states, h_n 是分線, h_c 是主線# h_c shape (n_layers, batch, hidden_size)r_out, (h_n, h_c) = self.rnn(x, None) # None 表示 hidden state 會(huì)用全0的 state# 選取最后一個(gè)時(shí)間點(diǎn)的 r_out 輸出# 這里 r_out[:, -1, :] 的值也是 h_n 的值out = self.out(r_out[:, -1, :])return out

    RNN整體的流程是:

    RNN回歸問題

    class RNN(nn.Module):def __init__(self):super(RNN, self).__init__()self.rnn = nn.RNN( # 這回一個(gè)普通的 RNN 就能勝任input_size=1,hidden_size=32, # rnn hidden unitnum_layers=1, # 有幾層 RNN layersbatch_first=True, # input & output 會(huì)是以 batch size 為第一維度的特征集 e.g. (batch, time_step, input_size))self.out = nn.Linear(32, 1)def forward(self, x, h_state): # 因?yàn)?hidden state 是連續(xù)的, 所以我們要一直傳遞這一個(gè) state# x (batch, time_step, input_size)# h_state (n_layers, batch, hidden_size)# r_out (batch, time_step, output_size)r_out, h_state = self.rnn(x, h_state) # h_state 也要作為 RNN 的一個(gè)輸入outs = [] # 保存所有時(shí)間點(diǎn)的預(yù)測(cè)值for time_step in range(r_out.size(1)): # 對(duì)每一個(gè)時(shí)間點(diǎn)計(jì)算 outputouts.append(self.out(r_out[:, time_step, :]))return torch.stack(outs, dim=1), h_state

    自編碼(Autoencoder)

    • 是一種非監(jiān)督式學(xué)習(xí),接受大量的輸入信息,然后總結(jié)原數(shù)據(jù)的精髓。
    • 編碼器Encoder
      特征屬性降維
    • 解碼器Decoder
      將精髓信息解壓成原始信息

    AutoEncoder

    class AutoEncoder(nn.Module):def __init__(self):super(AutoEncoder, self).__init__()# 壓縮self.encoder = nn.Sequential(nn.Linear(28*28, 128), 28*28->128nn.Tanh(),nn.Linear(128, 64), 128->64nn.Tanh(),nn.Linear(64, 12), 64->12nn.Tanh(),nn.Linear(12, 3), # 壓縮成3個(gè)特征, 進(jìn)行 3D 圖像可視化)# 解壓self.decoder = nn.Sequential(nn.Linear(3, 12),nn.Tanh(),nn.Linear(12, 64),nn.Tanh(),nn.Linear(64, 128),nn.Tanh(),nn.Linear(128, 28*28),nn.Sigmoid(), # 激勵(lì)函數(shù)讓輸出值在 (0, 1))def forward(self, x):encoded = self.encoder(x)decoded = self.decoder(encoded)return encoded, decodedautoencoder = AutoEncoder()

    DQN

    強(qiáng)化學(xué)習(xí)融合了神經(jīng)網(wǎng)絡(luò)+Q-learing

  • 通過NN預(yù)測(cè)出Q(s2, a1) 和 Q(s2,a2) 的值,即Q估計(jì)
  • 選取Q估計(jì)中最大值的動(dòng)作來換取還清中的獎(jiǎng)勵(lì)reward
  • Q現(xiàn)實(shí)是之前在Q-learing中的值
  • 更新神經(jīng)網(wǎng)絡(luò)中的參數(shù)
    • 顯示網(wǎng)絡(luò)和估計(jì)網(wǎng)絡(luò)建立的基本體系
    class Net(nn.Module):def __init__(self, ):super(Net, self).__init__()self.fc1 = nn.Linear(N_STATES, 10)self.fc1.weight.data.normal_(0, 0.1) # initializationself.out = nn.Linear(10, N_ACTIONS)self.out.weight.data.normal_(0, 0.1) # initializationdef forward(self, x):x = self.fc1(x)x = F.relu(x)actions_value = self.out(x)return actions_value
    • DQN
    class DQN(object):def __init__(self):# 建立 target net 和 eval net 還有 memorydef choose_action(self, x):# 根據(jù)環(huán)境觀測(cè)值選擇動(dòng)作的機(jī)制return actiondef store_transition(self, s, a, r, s_):# 存儲(chǔ)記憶#如果記憶滿了,就覆蓋老數(shù)據(jù)def learn(self):# target 網(wǎng)絡(luò)更新# 學(xué)習(xí)記憶庫中的記憶

    GAN

    大白話解釋GAN:新手畫家隨機(jī)靈感畫畫,新手鑒賞家接受畫作(不知道是新手畫還是著名畫),說出判斷,一邊還告訴新手怎么畫,然后新手就畫的越來越像著名畫家的畫。

    G = nn.Sequential( # Generatornn.Linear(N_IDEAS, 128), # random ideas (could from normal distribution)nn.ReLU(),nn.Linear(128, ART_COMPONENTS), # making a painting from these random ideas )D = nn.Sequential( # Discriminatornn.Linear(ART_COMPONENTS, 128), # receive art work either from the famous artist or a newbie like Gnn.ReLU(),nn.Linear(128, 1),nn.Sigmoid(), # tell the probability that the art work is made by artist )

    Dropout緩解過擬合

    torch.nn.Dropout(0.5) 這里的 0.5 指的是隨機(jī)有 50% 的神經(jīng)元會(huì)被關(guān)閉/丟棄.

    net_dropped = torch.nn.Sequential(torch.nn.Linear(1, N_HIDDEN),torch.nn.Dropout(0.5), # drop 50% of the neurontorch.nn.ReLU(),torch.nn.Linear(N_HIDDEN, N_HIDDEN),torch.nn.Dropout(0.5), # drop 50% of the neurontorch.nn.ReLU(),torch.nn.Linear(N_HIDDEN, 1), )

    批標(biāo)準(zhǔn)化(Batch Normalization)BN

    • 將分散的數(shù)據(jù)統(tǒng)一的一種做法,使數(shù)據(jù)具有統(tǒng)一規(guī)格。
    • BN被添加在每一個(gè)全連接和激勵(lì)函數(shù)之間,對(duì)每一層神經(jīng)網(wǎng)絡(luò)進(jìn)行標(biāo)準(zhǔn)化
    class Net(nn.Module):def __init__(self, batch_normalization=False):super(Net, self).__init__()self.do_bn = batch_normalizationself.fcs = [] # 太多層了, 我們用 for loop 建立self.bns = []self.bn_input = nn.BatchNorm1d(1, momentum=0.5) # 給 input 的 BNfor i in range(N_HIDDEN): # 建層input_size = 1 if i == 0 else 10fc = nn.Linear(input_size, 10)setattr(self, 'fc%i' % i, fc) # 注意! pytorch 一定要你將層信息變成 class 的屬性! 我在這里花了2天時(shí)間發(fā)現(xiàn)了這個(gè) bugself._set_init(fc) # 參數(shù)初始化self.fcs.append(fc)if self.do_bn:bn = nn.BatchNorm1d(10, momentum=0.5)setattr(self, 'bn%i' % i, bn) # 注意! pytorch 一定要你將層信息變成 class 的屬性! 我在這里花了2天時(shí)間發(fā)現(xiàn)了這個(gè) bugself.bns.append(bn)self.predict = nn.Linear(10, 1) # output layerself._set_init(self.predict) # 參數(shù)初始化def _set_init(self, layer): # 參數(shù)初始化init.normal_(layer.weight, mean=0., std=.1)init.constant_(layer.bias, B_INIT)def forward(self, x):pre_activation = [x]if self.do_bn: x = self.bn_input(x) # 判斷是否要加 BNlayer_input = [x]for i in range(N_HIDDEN):x = self.fcs[i](x)pre_activation.append(x) # 為之后出圖if self.do_bn: x = self.bns[i](x) # 判斷是否要加 BNx = ACTIVATION(x)layer_input.append(x) # 為之后出圖out = self.predict(x)return out, layer_input, pre_activation# 建立兩個(gè) net, 一個(gè)有 BN, 一個(gè)沒有 nets = [Net(batch_normalization=False), Net(batch_normalization=True)]

    總結(jié)

    以上是生活随笔為你收集整理的莫烦-pytorch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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