[問題] batch_size圖片大小不一

看板DataScience作者 (中立評論員)時間4年前 (2020/04/17 23:34), 4年前編輯推噓6(6014)
留言20則, 6人參與, 4年前最新討論串1/1
作業系統:win10 問題類別:batch size, gradient, triplet loss 使用工具:python, pytorch 問題描述: 當把圖片整批丟入模型時, 要求必須整批圖片的size必須相同, 這我能理解 它是[batch size, h, l, w]形式傳入 網上查到兩種解決方法: 1. resize()成統一尺寸,但小弟的圖片不巧圖片大小差異很大(有旋轉..等),長寬有的 甚至是轉置。擔心會不會resize後失真太多? 2. batch_size設為1,但這存在一個問題,我的模型設定的損失函數是計算triplet loss, 如果batch_size=1 沒辦法丟到loss function做計算,到下個batch模型重算時,上次計算 出來的gradient是不是就消失了?(我實驗是模型根本找不到梯度)所以想請教大家有沒有 保留梯度的方法? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 117.19.228.161 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/DataScience/M.1587137688.A.EC0.html ※ 編輯: wang19980531 (117.19.228.161 臺灣), 04/17/2020 23:38:38

04/18 00:02, 4年前 , 1F
pytorch是 b,c,h,w
04/18 00:02, 1F

04/18 00:02, 4年前 , 2F
1. 你可以考慮用crop
04/18 00:02, 2F

04/18 00:03, 4年前 , 3F
2.你沒計算loss沒有backward 不會有gradient
04/18 00:03, 3F
我的架構大概是 for each圖片: y=model(x) append(y_,y) loss=triplet_loss(y_,labels) opt.zero_grad() loss.backward() opt.step() 原本將圖片這批丟到model(就是append先,迴圈外才做model)是可行的 但只有一張圖片的y也沒有辦法算loss跟gradient; append在一起為何會算不出來(loss降不了)

04/18 14:03, 4年前 , 4F
做gradient accumulation ㄅ
04/18 14:03, 4F

04/18 14:49, 4年前 , 5F
1.resize可調整插值方法,試試看是否還有嚴重失真,或是
04/18 14:49, 5F

04/18 14:49, 4年前 , 6F
crop,或是直接在Convolution layer跟Fully connected l
04/18 14:49, 6F

04/18 14:49, 4年前 , 7F
ayer之間塞入一些特殊池化層,因為尺度固定是來自於FCL
04/18 14:49, 7F

04/18 14:49, 4年前 , 8F
層便於計算而採用的。
04/18 14:49, 8F
我沒有fully connected layer喔 但是一個batch丟入model算必須要[n,c,l,w] l*w的圖片 大小要一致 不然只能一張一張丟 可是如上 會發生找不出梯度的問題?

04/18 14:51, 4年前 , 9F
2. 你直接印出損失值看看是否是損失函數出來的值是否有
04/18 14:51, 9F

04/18 14:51, 4年前 , 10F
問題,或是你沒有更新參數自然沒有梯度。
04/18 14:51, 10F

04/18 19:57, 4年前 , 11F
gradient accumulation遇到BN會GG 我最近也在思考這
04/18 19:57, 11F

04/18 19:57, 4年前 , 12F
個問題
04/18 19:57, 12F

04/19 14:54, 4年前 , 13F
Padding, crop一起做 就當作data augmentation
04/19 14:54, 13F
padding似乎不失為一個好方法 謝謝提議 ※ 編輯: wang19980531 (117.19.228.161 臺灣), 04/20/2020 07:30:48 感謝大家的意見,抱歉這麼晚才做回應! ※ 編輯: wang19980531 (117.19.228.161 臺灣), 04/20/2020 07:34:46

04/20 11:53, 4年前 , 14F
你的triplet loss的用法對嗎? 應該是
04/20 11:53, 14F

04/20 11:54, 4年前 , 15F
(anchor, positive, negative)
04/20 11:54, 15F
我用的是別人寫好的hard都triplet loss 應該是online的就是只要給一串label和向量他會自己去算loss ※ 編輯: wang19980531 (61.221.242.34 臺灣), 04/20/2020 12:10:01

04/20 14:32, 4年前 , 16F
如果你是用online triplet記得要去檢查一下target是要
04/20 14:32, 16F

04/20 14:32, 4年前 , 17F
有重複類別,不然輸出矩陣計算後會變成nan。另外還有tri
04/20 14:32, 17F

04/20 14:32, 4年前 , 18F
plets loss計算是採用歐式距離,可能要注意壓縮出來的
04/20 14:32, 18F

04/20 14:32, 4年前 , 19F
結果
04/20 14:32, 19F

04/21 21:01, 4年前 , 20F
長邊resize到固定長度,短邊padding
04/21 21:01, 20F
文章代碼(AID): #1UcSoOx0 (DataScience)