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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch框架学习七——自定义transforms方法

發布時間:2024/7/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch框架学习七——自定义transforms方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PyTorch框架學習七——自定義transforms方法

  • 一、自定義transforms注意要素
  • 二、自定義transforms步驟
  • 三、自定義transforms實例:椒鹽噪聲

雖然前面的筆記介紹了很多PyTorch給出的transforms方法,也非常有用,但是也有可能在具體的問題中需要開發者自定義transforms方法,這次筆記就介紹如何自定義transforms方法。

ps:本次筆記中使用的原始圖像出自上次筆記:https://blog.csdn.net/qq_40467656/article/details/107958492

一、自定義transforms注意要素

從數據讀取機制DataLoader我們知道了transforms的內部工作原理,是在Compose類的__call__函數定義并實現的:

class Compose(object):"""Composes several transforms together.Args:transforms (list of ``Transform`` objects): list of transforms to compose.Example:>>> transforms.Compose([>>> transforms.CenterCrop(10),>>> transforms.ToTensor(),>>> ])"""def __init__(self, transforms):self.transforms = transformsdef __call__(self, img):for t in self.transforms:img = t(img)return img

由此出發,可以看出自定義transforms需要注意兩個要素:

  • 僅接收一個參數img,并返回一個參數img;
  • transforms之間要注意上下游的輸入與輸出的格式匹配。
  • 二、自定義transforms步驟

    首先,自定義的transforms的輸入參數可能不只img一個,如概率p等等,但是原來的代碼只允許接收一個參數返回一個參數,所以可以在原來的基礎上改進:

    class YourTransforms(object):def __init__(self, ...): # ...是要傳入的多個參數# 對多參數進行傳入# 如 self.p = p 傳入概率# ...def __call__(self, img): # __call__函數還是只有一個參數傳入# 該自定義transforms方法的具體實現過程# ...return img

    步驟如下:

  • 自定義一個類YourTransforms,結構類似Compose類
  • __init__函數作為多參數傳入的地方
  • __call__函數具體實現自定義的transforms方法
  • 三、自定義transforms實例:椒鹽噪聲

    椒鹽噪聲:又稱為脈沖噪聲,是一種隨機出現的白點或黑點,白點被稱為鹽噪聲,黑點被稱為椒噪聲,其與信噪比(SNR)息息相關。

    此外,我們還想加入概率p這個參數,實現隨機添加椒鹽噪聲。

    仿照實現步驟,先寫出其實現的大致框架:

    class AddPepperNoise(object):def __init__(self, snr, p): # snr, p 是要傳入的多個參數self.snr = snrself.p = p def __call__(self, img): # __call__函數還是只有一個參數傳入'''添加椒鹽噪聲的具體實現過程'''return img

    完整實現代碼:

    class AddPepperNoise(object):"""增加椒鹽噪聲Args:snr (float): Signal Noise Ratep (float): 概率值,依概率執行該操作"""def __init__(self, snr, p=0.9):assert isinstance(snr, float) and (isinstance(p, float))self.snr = snrself.p = pdef __call__(self, img):"""Args:img (PIL Image): PIL ImageReturns:PIL Image: PIL image."""if random.uniform(0, 1) < self.p:img_ = np.array(img).copy()h, w, c = img_.shapesignal_pct = self.snrnoise_pct = (1 - self.snr)mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])mask = np.repeat(mask, c, axis=2)img_[mask == 1] = 255 # 鹽噪聲img_[mask == 2] = 0 # 椒噪聲return Image.fromarray(img_.astype('uint8')).convert('RGB')else:return img

    添加椒鹽噪聲之后:

    總結

    以上是生活随笔為你收集整理的PyTorch框架学习七——自定义transforms方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。