GAN 對抗神經網絡中遇到的問題

網絡的設計

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分別表示特徵圖的高度、寬度。這幾個方法主要的區別就是在:

  1. BN是在batch上,對N、H、W做歸一化,而保留通道 C 的維度。BN對較小的batch size效果不好。BN適用於固定深度的前向神經網絡,如CNN,不適用於RNN;
  2. LN在通道方向上,對C、H、W歸一化,主要對RNN效果明顯
  3. IN在圖像像素上,對H、W做歸一化,用在風格化遷移;
  4. 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 而在測試的時候這需要關掉,因爲我們的目的是爲了測試訓練好的網絡而不是訓練網絡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章