數(shù)據(jù)增強(qiáng)

(一)數(shù)據(jù)增強(qiáng)(增廣)

(1)為什么要做數(shù)據(jù)增強(qiáng)概行?

一個(gè)原因是可能你的數(shù)據(jù)集比較小细层,所以需要對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的操作,讓數(shù)據(jù)集增加倦逐。第二是有這樣的一個(gè)真實(shí)實(shí)例轿曙。有一家做智能售貨機(jī)的公司在公司內(nèi)部調(diào)試好參數(shù)訓(xùn)練好模型以后,將售貨機(jī)拿去展廳進(jìn)行測(cè)試的時(shí)候僻孝,發(fā)現(xiàn)原本準(zhǔn)確率非常高的機(jī)器忽然識(shí)別不出來(lái)了。原因是展廳的光源不一樣守谓,導(dǎo)致整個(gè)的測(cè)試數(shù)據(jù)集就和訓(xùn)練集發(fā)生了很大的變化穿铆。所以在產(chǎn)品研發(fā)的時(shí)候適當(dāng)?shù)耐ㄟ^(guò)數(shù)據(jù)增強(qiáng)技術(shù)能夠給模型增加魯棒性。

(2)數(shù)據(jù)增強(qiáng)方法有什么斋荞?

可通過(guò)在圖片中加入各種不一樣的背景噪音荞雏,改變圖片的顏色和形狀。

  • 翻轉(zhuǎn):左右翻轉(zhuǎn)平酿、上下翻轉(zhuǎn)
  • 切割:在圖片中切割出一塊凤优,然后變形到固定的形狀
  • 顏色:改變色調(diào),飽和度蜈彼,明度等

(二)代碼實(shí)現(xiàn)

%matplotlib inline
import torch 
import torchvision
from torch import nn 
from d2l import torch as d2l
import matplotlib.image as img
import matplotlib.pyplot as plt

# 打開(kāi)圖片的方法
# image = img.imread('../img/cat1.jpg')
# plt.title("cat.jpg")
# plt.axis("off")
# plt.imshow(image)
# plt.show()

d2l.set_figsize()
img = d2l.Image.open('../img/cat1.jpg')
d2l.plt.imshow(img)
# 參數(shù)列表(圖片筑辨,增強(qiáng)的辦法,多少行幸逆,多少列棍辕,倍數(shù))
def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    y = [aug(img) for _ in range(num_rows*num_cols)]
    d2l.show_images(y, num_rows, num_cols, scale=scale)

# 左右翻轉(zhuǎn)圖片
apply(img,torchvision.transforms.RandomHorizontalFlip())

# 上下翻轉(zhuǎn)
apply(img,torchvision.transforms.RandomVerticalFlip())

# 隨即裁剪
shape_aug = torchvision.transforms.RandomResizedCrop(
    # (輸出大小,選擇的比例还绘,高寬比)
    size=(200,200),scale=(0.1,1),ratio=(0.5,2))
apply(img,shape_aug)
# 隨機(jī)更改圖片的亮度
apply(img,torchvision.transforms.ColorJitter(
    # (亮度區(qū)間楚昭,對(duì)比度,飽和度拍顷,色調(diào))
    brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5
))
# 結(jié)合多種數(shù)據(jù)增強(qiáng)方法
augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(),
    shape_aug,
    torchvision.transforms.ColorJitter(brightness=0.5,contrast=0.5,saturation=0.5,hue=0.5)
])

apply(img, augs)
# 如果下載報(bào)錯(cuò)的話抚太,自己去網(wǎng)頁(yè)上下載
# https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
all_images = torchvision.datasets.CIFAR10(
    train=True,
    root="../data",
    download=False
)

d2l.show_images([all_images[i][0] for i in range(32)],4,8,scale=0.8)
# d2l.show_images([all_images.data[i] for i in range(32)],4,8,scale=0.8)
train_augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor()
])
test_augs = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()
])
def load_cifar10(is_train,augs, batch_size):
    dataset = torchvision.datasets.CIFAR10(
        train=is_train,
        root="../data",
        download=False,
        transform=augs,
    )
    data_loader = torch.utils.data.DataLoader(
        dataset,
        batch_size=batch_size,
        shuffle=True,
        num_workers=0
    )
    return data_loader
def train_batch_ch13(net, X, y, loss, trainer, devices):
    """用多GPU進(jìn)行小批量訓(xùn)練"""
    if isinstance(X, list):
        # 微調(diào)BERT中所需(稍后討論)
        X = [x.to(devices[0]) for x in X]
    else:
        X = X.to(devices[0])
    y = y.to(devices[0])
    net.train()
    trainer.zero_grad()
    pred = net(X)
    l = loss(pred, y)
    l.sum().backward()
    trainer.step()
    train_loss_sum = l.sum()
    train_acc_sum = d2l.accuracy(pred, y)
    return train_loss_sum, train_acc_sum
#@save
def train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,
               devices=d2l.try_all_gpus()):
    """用多GPU進(jìn)行模型訓(xùn)練"""
    timer, num_batches = d2l.Timer(), len(train_iter)
    animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0, 1],
                            legend=['train loss', 'train acc', 'test acc'])
    net = nn.DataParallel(net, device_ids=devices).to(devices[0])
    for epoch in range(num_epochs):
        # 4個(gè)維度:儲(chǔ)存訓(xùn)練損失,訓(xùn)練準(zhǔn)確度昔案,實(shí)例數(shù)尿贫,特點(diǎn)數(shù)
        metric = d2l.Accumulator(4)
        for i, (features, labels) in enumerate(train_iter):
            timer.start()
            l, acc = train_batch_ch13(
                net, features, labels, loss, trainer, devices)
            metric.add(l, acc, labels.shape[0], labels.numel())
            timer.stop()
            if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch + (i + 1) / num_batches,
                             (metric[0] / metric[2], metric[1] / metric[3],
                              None))
        test_acc = d2l.evaluate_accuracy_gpu(net, test_iter)
        animator.add(epoch + 1, (None, None, test_acc))
    print(f'loss {metric[0] / metric[2]:.3f}, train acc '
          f'{metric[1] / metric[3]:.3f}, test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec on '
          f'{str(devices)}')
batch_size, devices, net = 256, d2l.try_all_gpus(), d2l.resnet18(10, 3)

def init_weights(m):
    if type(m) in [nn.Linear, nn.Conv2d]:
        nn.init.xavier_uniform_(m.weight)

net.apply(init_weights)

def train_with_data_aug(train_augs, test_augs, net, lr=0.001):
    train_iter = load_cifar10(True, train_augs, batch_size)
    test_iter = load_cifar10(False, test_augs, batch_size)
    loss = nn.CrossEntropyLoss(reduction="none")
    trainer = torch.optim.Adam(net.parameters(), lr=lr)
    train_ch13(net, train_iter, test_iter, loss, trainer, 10, devices)
train_with_data_aug(train_augs, test_augs, net)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爱沟,隨后出現(xiàn)的幾起案子帅霜,更是在濱河造成了極大的恐慌,老刑警劉巖呼伸,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件身冀,死亡現(xiàn)場(chǎng)離奇詭異钝尸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搂根,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)珍促,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人剩愧,你說(shuō)我怎么就攤上這事猪叙。” “怎么了仁卷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵穴翩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锦积,道長(zhǎng)芒帕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任丰介,我火速辦了婚禮背蟆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哮幢。我一直安慰自己带膀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布橙垢。 她就那樣靜靜地躺著垛叨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柜某。 梳的紋絲不亂的頭發(fā)上点额,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音莺琳,去河邊找鬼还棱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惭等,可吹牛的內(nèi)容都是我干的珍手。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辞做,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琳要!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秤茅,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稚补,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后框喳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體课幕,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厦坛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乍惊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜秸。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖润绎,靈堂內(nèi)的尸體忽然破棺而出撬碟,到底是詐尸還是另有隱情,我是刑警寧澤莉撇,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布呢蛤,位于F島的核電站,受9級(jí)特大地震影響棍郎,放射性物質(zhì)發(fā)生泄漏顾稀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一坝撑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粮揉,春花似錦巡李、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辐宾,卻和暖如春狱从,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叠纹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工季研, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人誉察。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓与涡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親持偏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驼卖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容