網絡的設計
Discriminator
Discriminator(
(main): Sequential(
(0): Conv2d(3, 64, kernel_size=(5, 5), stride=(3, 3), padding=(1, 1), bias=False)
(1): LeakyReLU(negative_slope=0.2, inplace=True)
(2): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(4): LeakyReLU(negative_slope=0.2, inplace=True)
(5): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(6): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(7): LeakyReLU(negative_slope=0.2, inplace=True)
(8): Conv2d(256, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
(9): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(10): LeakyReLU(negative_slope=0.2, inplace=True)
(11): Conv2d(512, 1, kernel_size=(4, 4), stride=(1, 1))
(12): Sigmoid()
)
)
Generator 剛好於 Discriminator 相反
Vector --> Generator — > image
image — Discriminator —> Vector
損失函數 爲啥會選取 BCELOSS
BCELoss 是一個二分類 分類器
使用nn.BCELoss需要在該層前面加上Sigmoid函數
使用nn.CrossEntropyLoss會自動加上Sofrmax層。
參考博客 點擊跳轉
BatchNorm2d
我們將輸入的 feature map shape 記爲[N, C, H, W],其中N表示batch size,即N個樣本;C表示通道數;H、W分別表示特徵圖的高度、寬度。這幾個方法主要的區別就是在:
- BN是在batch上,對N、H、W做歸一化,而保留通道 C 的維度。BN對較小的batch size效果不好。BN適用於固定深度的前向神經網絡,如CNN,不適用於RNN;
- LN在通道方向上,對C、H、W歸一化,主要對RNN效果明顯
- IN在圖像像素上,對H、W做歸一化,用在風格化遷移;
- GN將channel分組,然後再做歸一化。
t.load
**torch.load(f, map_location=None, pickle_module=<module ‘pickle’ from ‘/opt/conda/lib/python3.6/pickle.py’>, pickle_load_args)
torch.load('tensor.pt)
#load all tensors to cpu
torch.load("tensor.pt",map_location= torch.device("cpu"))
#load all tensor to cpu using a function
torch.load("tensor.pt",map_location = lambda storage, loc :storage)
#load all tensor onto gpu1
torch.load("tensor.pt",map_location = lambda storage,loc:storage.cuda(1)
t.save()
t.save(model.save_dict(),“path”)
torch.nn.drop()
drop是用來解決神經網絡中過擬合的問題,因爲數量集不多時,網絡參數較大時,訓練樣本帶來誤差影響大,因此在每一層神經網絡中引入dropout,具體的實現過程是在每次更新參數的過程中,隨機的剔除掉部分(按照比例參數p)神經元,不對其參數進行更新
dropout爲什麼能夠有效解決overfitting的問題?
取平均的作用: 先回到正常的模型(沒有dropout),我們用相同的訓練數據去訓練5個不同的神經網絡,一般會得到5個不同的結果,此時我們可以採用 “5個結果取均值”或者“多數取勝的投票策略”去決定最終結果。(例如 3個網絡判斷結果爲數字9,那麼很有可能真正的結果就是數字9,其它兩個網絡給出了錯誤結果)。這種“綜合起來取平均”的策略通常可以有效防止過擬合問題。因爲不同的網絡可能產生不同的過擬合,取平均則有可能讓一些“相反的”擬合互相抵消。dropout掉不同的隱藏神經元就類似在訓練不同的網絡(隨機刪掉一半隱藏神經元導致網絡結構已經不同),整個dropout過程就相當於 對很多個不同的神經網絡取平均。而不同的網絡產生不同的過擬合,一些互爲“反向”的擬合相互抵消就可以達到整體上減少過擬合
減少神經元之間複雜的共適應關係: 因爲dropout程序導致兩個神經元不一定每次都在一個dropout網絡中出現。(這樣權值的更新不再依賴於有固定關係的隱含節點的共同作用,阻止了某些特徵僅僅在其它特定特徵下才有效果的情況)。 迫使網絡去學習更加魯棒的特徵 (這些特徵在其它的神經元的隨機子集中也存在)。換句話說假如我們的神經網絡是在做出某種預測,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從衆多其它線索中學習一些共同的模式(魯棒性)。(這個角度看 dropout就有點像L1,L2正則,減少權重使得網絡對丟失特定神經元連接的魯棒性提高)
參考鏈接 https://www.jianshu.com/p/ef2a7a78aa83
net().train 和 net().eval() 兩種模式是一樣的只有當 網絡層中出現 normal,dropout() 兩者纔有區別,訓練時爲了使網絡擁有更大的精度,所以使用noraml,dropout 而在測試的時候這需要關掉,因爲我們的目的是爲了測試訓練好的網絡而不是訓練網絡