莫烦-pytorch
pytorch 莫煩
激勵(lì)函數(shù)
Y = AF(Wx)
這里的AF()就是激勵(lì)函數(shù),其實(shí)就是另外一個(gè)非線性函數(shù)。比如relu,sigmoid,tanh
- 選擇激勵(lì)函數(shù)的竅門(mén):當(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ò)
- 訓(xùn)練網(wǎng)絡(luò)
分類
- 建立神經(jīng)網(wǎng)絡(luò)
- 訓(xùn)練網(wǎng)絡(luò)
快速搭建
搭建神經(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ì)于自己手寫(xiě)的net來(lái)說(shuō),可以在forward()方法中指定激勵(lì)函數(shù),就會(huì)更加靈活一些。
保存與提取
- 保存
- 提取
- 提取網(wǎng)絡(luò)參數(shù)
網(wǎng)絡(luò)參數(shù):能獨(dú)立地反映網(wǎng)絡(luò)特性的參數(shù)
提取所有網(wǎng)路參數(shù)
批訓(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, # 多線程來(lái)讀數(shù)據(jù) )優(yōu)化器
要讓神經(jīng)網(wǎng)絡(luò)聰明起來(lái)!!!!
- SGD
- Momentum
- AdaGrad
- RMSProp
- Adam
所以我們把這個(gè)人從平地上放到了一個(gè)斜坡上, 只要他往下坡的方向走一點(diǎn)點(diǎn), 由于向下的慣性, 他不自覺(jué)地就一直往下走, 走的彎路也變少了. 這就是 Momentum 參數(shù)更新.
而是給他一雙不好走路的鞋子, 使得他一搖晃著走路就腳疼, 鞋子成為了走彎路的阻力, 逼著他往前直著走
是momentum和adagrad的集合體,同時(shí)具備兩者的優(yōu)勢(shì)。但是RMSProp并沒(méi)有包含momentum的一部分,所以在Adam中又進(jìn)一步改進(jìn)
對(duì)于Adam來(lái)說(shuō),能快好的達(dá)到目標(biāo),快速收斂到最好的地方
Optimizer
- SGD
- Momentum
- RMSProp
- Adam
在實(shí)驗(yàn)中,對(duì)各個(gè)優(yōu)化器還是都應(yīng)該試一試,看看哪個(gè)更好
CNN
- 從下到上的順序, 首先是輸入的圖片(image), 經(jīng)過(guò)一層卷積層 (convolution), 然后在用池化(pooling)方式處理卷積的信息, 這里使用的是 max pooling 的方式.
- 然后在經(jīng)過(guò)一次同樣的處理, 把得到的第二次處理的信息傳入兩層全連接的神經(jīng)層 (fully connected),這也是一般的兩層神經(jīng)網(wǎng)絡(luò)層,最后在接上一個(gè)分類器(classifier)進(jìn)行分類預(yù)測(cè). 這僅僅是對(duì)卷積神經(jīng)網(wǎng)絡(luò)在圖片處理上一次簡(jiǎn)單的介紹.
- 卷積層(Convolutional Layer) - 主要作用是提取特征
- 池化層(Max Pooling Layer) - 主要作用是下采樣(downsampling),卻不會(huì)損壞識(shí)別結(jié)果
- 全連接層(Fully Connected Layer) - 主要作用是分類預(yù)測(cè)
這個(gè) CNN 整體流程是 卷積(Conv2d) -> 激勵(lì)函數(shù)(ReLU) -> 池化, 向下采樣 (MaxPooling) -> 再來(lái)一遍 -> 展平多維的卷積成的特征圖 -> 接入全連接層 (Linear) -> 輸出
RNN
RNN是在有順序的數(shù)據(jù)上進(jìn)行學(xué)習(xí)的,在反向傳遞得到誤差的時(shí)候,每一步都會(huì)乘以自己的一個(gè)參數(shù)W,若W是小于1,則誤差傳遞到初始時(shí)間的時(shí)候會(huì)接近0,即梯度消失;反之,則是梯度爆炸!hong!然后LSTM是為了解決這個(gè)問(wèn)題而提出來(lái)的
LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)
-
主線:就是主線劇情
-
分線,即是原本的RNN體系。
1. 輸入:重要程度 寫(xiě)入主線劇情 進(jìn)行分析.
2.忘記: 如果此時(shí)的分線劇情更改了我們對(duì)之前劇情的想法, 那么忘記控制就會(huì)將之前的某些主線劇情忘記, 按比例替換成現(xiàn)在的新劇情
3.輸出:基于目前的主線劇情和分線劇情判斷要輸出的到底是什么
RNN分類問(wèn)題
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 outRNN整體的流程是:
RNN回歸問(wèn)題
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
- 顯示網(wǎng)絡(luò)和估計(jì)網(wǎng)絡(luò)建立的基本體系
- DQN
GAN
大白話解釋GAN:新手畫(huà)家隨機(jī)靈感畫(huà)畫(huà),新手鑒賞家接受畫(huà)作(不知道是新手畫(huà)還是著名畫(huà)),說(shuō)出判斷,一邊還告訴新手怎么畫(huà),然后新手就畫(huà)的越來(lái)越像著名畫(huà)家的畫(huà)。
Dropout緩解過(guò)擬合
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)化
總結(jié)
以上是生活随笔為你收集整理的莫烦-pytorch的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SAS MACRO
- 下一篇: void init(void) 分析 !