<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      第四次作業(yè)-肖大智

      貓狗大戰(zhàn)代碼學(xué)習(xí)

      復(fù)制代碼
      import numpy as np
      import matplotlib.pyplot as plt
      import os
      import torch
      import torch.nn as nn
      import torchvision
      from torchvision import models, transforms, datasets
      import time
      import json
      
      device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
      print("Using gpu: %s" % torch.cuda.is_available())
      復(fù)制代碼

       

      數(shù)據(jù)預(yù)處理

      下載重新整理好的數(shù)據(jù)集

      ! wget http://fenggao-image.stor.sinaapp.com/dogscats.zip
      ! unzip dogscats.zip

       

      進(jìn)行數(shù)據(jù)預(yù)處理

      復(fù)制代碼
      normalize = transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) #對圖像進(jìn)行標(biāo)準(zhǔn)化
      vgg_format = transforms.Compose([transforms.CenterCrop(224), #把許多步驟組合在一起
                        transforms.ToTensor(),
                        normalize])
      data_dir = "./dogscats"
      dsets = {x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format) #數(shù)據(jù)加載器
           for x in ['train', 'valid']}
      
      dset_sizes = {x: len(dsets[x]) for x in ['train', 'valid']}
      dset_classes = dsets['train'].classes
      復(fù)制代碼

      Normalize(),對圖像進(jìn)行標(biāo)準(zhǔn)化,與ToTensor()搭配,將圖像灰度范圍從0~255變換到-1~1。

      Compose(),即把許多步驟組合在一起。

      ImageFolder是一個數(shù)據(jù)加載器,要求按照一定格式組織數(shù)據(jù)集。其返回的dset有三個屬性:self.classes,用一個list保存類別名稱。self.class_to_idx,類別對應(yīng)的索引。self.imgs,是保存(img-path, class)元組的list。

       

      我們可以打印出train的dsets進(jìn)行觀察。

       

       

      復(fù)制代碼
      loader_train = torch.utils.data.DataLoader(dsets['train'], batch_size=64, shuffle=True, num_workers=6)
      loader_valid = torch.utils.data.DataLoader(dsets['valid'], batch_size=5, shuffle=False, num_workers=6)
      
      
      '''
      valid 數(shù)據(jù)一共有2000張圖,每個batch是5張,因此,下面進(jìn)行遍歷一共會輸出到 400
      同時,把第一個 batch 保存到 inputs_try, labels_try,分別查看
      '''
      count = 1
      for data in loader_valid:
          print(count, end='\n')
          if count == 1:
              inputs_try,labels_try = data
          count +=1
      
      print(labels_try)
      print(inputs_try.shape)
      復(fù)制代碼

      DataLoader本質(zhì)上是一個可迭代對象,將數(shù)據(jù)集分成若干小的、隨機(jī)的batch。對于訓(xùn)練集,我們一般使用shuffle亂序,而驗證集和測試集不使用。

      創(chuàng)建VGG Model

      我們直接選擇預(yù)訓(xùn)練好的VGG模型,使用softmax對結(jié)果進(jìn)行處理

      !wget https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
      復(fù)制代碼
      model_vgg = models.vgg16(pretrained=True)
      
      with open('./imagenet_class_index.json') as f:
          class_dict = json.load(f)
      dic_imagenet = [class_dict[str(i)][1] for i in range(len(class_dict))]
      
      inputs_try , labels_try = inputs_try.to(device), labels_try.to(device)
      model_vgg = model_vgg.to(device)
      
      outputs_try = model_vgg(inputs_try)
      
      print(outputs_try)
      print(outputs_try.shape)
      
      '''
      可以看到結(jié)果為5行,1000列的數(shù)據(jù),每一列代表對每一種目標(biāo)識別的結(jié)果。
      但是我也可以觀察到,結(jié)果非常奇葩,有負(fù)數(shù),有正數(shù),
      為了將VGG網(wǎng)絡(luò)輸出的結(jié)果轉(zhuǎn)化為對每一類的預(yù)測概率,我們把結(jié)果輸入到 Softmax 函數(shù)
      '''
      m_softm = nn.Softmax(dim=1)
      probs = m_softm(outputs_try)
      vals_try,pred_try = torch.max(probs,dim=1)
      
      print( 'prob sum: ', torch.sum(probs,1))
      print( 'vals_try: ', vals_try)
      print( 'pred_try: ', pred_try)
      
      print([dic_imagenet[i] for i in pred_try.data])
      imshow(torchvision.utils.make_grid(inputs_try.data.cpu()), 
             title=[dset_classes[x] for x in labels_try.data.cpu()])
      復(fù)制代碼

       

       修改VGG層

       VGG模型有三種元素,卷積層CONV,全連接層FC,池化層Pool。

      觀察VGG的結(jié)構(gòu)后,我們需要將其最后的nn.Linear由1000類修改為2類,使其對應(yīng)本次的實驗。因為是預(yù)訓(xùn)練好的VGG,我們在訓(xùn)練中凍結(jié)前面層的參數(shù),僅更新最后一層。

      復(fù)制代碼
      print(model_vgg)
      
      model_vgg_new = model_vgg;
      
      for param in model_vgg_new.parameters():
          param.requires_grad = False
      model_vgg_new.classifier._modules['6'] = nn.Linear(4096, 2)
      model_vgg_new.classifier._modules['7'] = torch.nn.LogSoftmax(dim = 1)
      
      model_vgg_new = model_vgg_new.to(device)
      
      print(model_vgg_new.classifier)
      復(fù)制代碼

      修改后的VGG模型,注意到最后Linear的out_features=2。

       

       

       進(jìn)行訓(xùn)練并測試

      復(fù)制代碼
      '''
      第一步:創(chuàng)建損失函數(shù)和優(yōu)化器
      
      損失函數(shù) NLLLoss() 的 輸入 是一個對數(shù)概率向量和一個目標(biāo)標(biāo)簽. 
      它不會為我們計算對數(shù)概率,適合最后一層是log_softmax()的網(wǎng)絡(luò). 
      '''
      criterion = nn.NLLLoss()
      
      # 學(xué)習(xí)率
      lr = 0.001
      
      # 隨機(jī)梯度下降
      optimizer_vgg = torch.optim.SGD(model_vgg_new.classifier[6].parameters(),lr = lr)
      
      '''
      第二步:訓(xùn)練模型
      '''
      
      def train_model(model,dataloader,size,epochs=1,optimizer=None):
          model.train() #是保證BN層用每一批數(shù)據(jù)的均值和方差,隨機(jī)取一部分網(wǎng)絡(luò)連接來訓(xùn)練更新參數(shù)
      for epoch in range(epochs):
              running_loss = 0.0
              running_corrects = 0
              count = 0
              for inputs,classes in dataloader:
                  inputs = inputs.to(device)
                  classes = classes.to(device)
                  outputs = model(inputs)
                  loss = criterion(outputs,classes)           
                  optimizer = optimizer
                  optimizer.zero_grad()
                  loss.backward()
                  optimizer.step()
                  _,preds = torch.max(outputs.data,1)
                 
             # statistics running_loss += loss.data.item() running_corrects += torch.sum(preds == classes.data) count += len(inputs) print('Training: No. ', count, ' process ... total: ', size)
      epoch_loss = running_loss / size epoch_acc = running_corrects.data.item() / size print('Loss: {:.4f} Acc: {:.4f}'.format(epoch_loss, epoch_acc)) # 模型訓(xùn)練 train_model(model_vgg_new,loader_train,size=dset_sizes['train'], epochs=1, optimizer=optimizer_vgg)
      復(fù)制代碼

        訓(xùn)練效果的準(zhǔn)確率在94%左右。

       

      去驗證測試集,發(fā)現(xiàn)準(zhǔn)確率在97%左右

       

       我們最后可視化一下輸出,發(fā)現(xiàn)效果還是可以的。

       

       

      貓狗大戰(zhàn)上手練習(xí)

      數(shù)據(jù)預(yù)處理

      學(xué)習(xí)了上述代碼之后,我們開始自己練習(xí),下載并解壓研習(xí)社的數(shù)據(jù)集。

      !wget https://static.leiphone.com/cat_dog.rar
      !unrar x cat_dog.rar

      研習(xí)社給出的數(shù)據(jù)集的文件組織形式和ImageFolder要求的不一樣,需要自己更改。

      復(fù)制代碼
      import shutil
      
      def classify_pics(dir_name):
        path = "./cat_dog/" + dir_name + "/"
        cat = path + "cat"
        dog = path + "dog"
      
        if not os.path.exists(cat):
          os.makedirs(cat)
        if not os.path.exists(dog):
          os.makedirs(dog)
      
        files = os.listdir(path)
        for file in files:
          if not os.path.isdir(file):
            name = os.path.splitext(file)[0].split('_')[0]
            if name == 'cat':
              shutil.move(path+file, cat)
            elif name == 'dog':
              shutil.move(path+file, dog)
      
      classify_pics("train")
      classify_pics("valid")
      復(fù)制代碼
      復(fù)制代碼
      path = "./cat_dog/test/"
      raw = path + "raw"
      
      if not os.path.exists(raw):
        os.makedirs(raw)
      files = os.listdir(path)
      for file in files:
        if not os.path.isdir(file):
          shutil.move(path+file, raw)
      復(fù)制代碼

      最終實現(xiàn)如下形式的數(shù)據(jù)組織格式,劃分為訓(xùn)練集,驗證集,測試集。其中數(shù)據(jù)集20000張,驗證集和測試集各2000張。

       

       拿到數(shù)據(jù)集以后,剩下的步驟和上邊的代碼學(xué)習(xí)類似,只需要簡單依照數(shù)據(jù)集修改一下。

      使用VGG模型訓(xùn)練并測試

      訓(xùn)練集的訓(xùn)練效果如下:

       

      驗證集的驗證效果如下:

       

       最后是將測試結(jié)果寫到csv文件中,提交到研習(xí)社,查看最終的測試效果。

      復(fù)制代碼
      def test_model(model,dataloader,size):
        model.eval()
        #predictions = np.zeros(size)
        i = 0
        total_preds = {}
        
        for inputs, classes in dataloader:
          inputs = inputs.to(device)
          outputs = model(inputs)
          _,preds = torch.max(outputs.data,1)
      
          key = dsets['test'].imgs[i][0]
          print(key)
          total_preds[key] = preds[0]
          i+=1
          
        with open("./res.csv", "a+") as f:
          for i in range(size):
            f.write("{},{}\n".format(i, total_preds["./cat_dog/test/raw/" + str(i) + ".jpg"]))
      
      test_model(model_vgg_new, loader_test, size=dset_sizes['test'])  
      復(fù)制代碼

      最終結(jié)果是在97.6%

      進(jìn)行優(yōu)化

      首先可以想到利用transforms對數(shù)據(jù)進(jìn)行增強(qiáng)。

      選用了transforms.RandomRotate()對數(shù)據(jù)集進(jìn)行隨機(jī)旋轉(zhuǎn),transforms.ColorJitter()對數(shù)據(jù)集進(jìn)行亮度等屬性的變化。

      然后在訓(xùn)練中,將隨機(jī)梯度下降SGD更換成Adam優(yōu)化器。同時增大迭代次數(shù),將epoch由1改為4

      但是數(shù)據(jù)過強(qiáng)也會影響效果,搞得第二次成功率只有84%,因此要注意數(shù)據(jù)增強(qiáng)的參數(shù)。

      復(fù)制代碼
      vgg_format = transforms.Compose([
              transforms.CenterCrop(224),
              transforms.ColorJitter(brightness=0.2,contrast=0.2,saturation=0.2,hue=0), #調(diào)整亮度、對比度、飽和度、色相
              transforms.RandomRotation(5), #隨機(jī)旋轉(zhuǎn)
              transforms.ToTensor(),
              normalize,])
      復(fù)制代碼
      optimizer_vgg = torch.optim.Adam(model_vgg_new.classifier[6].parameters(),lr = lr) #使用Adam優(yōu)化器

      但是最終的效果也不理想,準(zhǔn)確率為97.5%,與最初相比低了0.1%。鑒于訓(xùn)練一次花費時間有點長,優(yōu)化行動就先鴿了,以后有機(jī)會再搞搞。

      --------------------------

      更新一下優(yōu)化方法,讓隨機(jī)旋轉(zhuǎn)的角度從5度降至3度,亮度參數(shù)由0.2降至0.1。然后讓loader_train的betch_size由64擴(kuò)大到128,訓(xùn)練迭代次數(shù)epoch從4降至2,此外還在VGG模型的nn.Linear(4096, 2)前增加了一個ReLU激活函數(shù)。一頓微調(diào)之后成功提高了一點成功率,達(dá)到了98.2%

       

       

       

      總結(jié)

      本次作業(yè)算是完整的學(xué)習(xí)了一個簡單的深度學(xué)習(xí)項目,對于深度學(xué)習(xí)模型VGG網(wǎng)絡(luò)有了更進(jìn)一步的了解。在學(xué)習(xí)代碼的時候,了解了一些函數(shù)的處理功能,對自己實際操作有一定的幫助。但是在嘗試優(yōu)化時,卻不太容易得到想要的效果,一方面可能是玄學(xué)問題?(誤),另一方面就是對一些偏向原理的東西不太了解,不能依此來進(jìn)行更有效的優(yōu)化,是以后需要學(xué)習(xí)提高的地方。

       

       

      posted on 2021-10-24 19:39  KWANGYA  閱讀(58)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 内射极品少妇xxxxxhd| 午夜精品极品粉嫩国产尤物| 亚洲av无码乱码在线观看野外| 国产免费午夜福利在线播放| 色欧美片视频在线观看| 国产一区二区不卡在线视频| 亚洲 欧美 影音先锋| 强插少妇视频一区二区三区| caoporn成人免费公开| 国产精品国产三级国快看| 亚洲av永久无码精品天堂久久| 亚洲永久精品一区二区三区| 激情四射激情五月综合网| 99热精品国产三级在线观看| 久久人人97超碰精品| 欧美一区二区三区久久综合| 精品一日韩美女性夜视频| 免费无码成人AV片在线 | 亚洲日韩乱码中文无码蜜桃臀| 九九热精品在线视频免费| 日本福利一区二区精品| 亚洲 日本 欧洲 欧美 视频| 国产麻豆精品手机在线观看| 99久久久无码国产精品动漫| julia无码中文字幕一区| 国产一区二区三区色噜噜| 亚洲人成人伊人成综合网无码| 亚洲中少妇久久中文字幕| 深夜福利视频在线播放| 亚洲精品人妻中文字幕| 国产毛片三区二区一区| 亚洲午夜性猛春交XXXX| 老司机亚洲精品一区二区| 国产av成人精品播放| 激情综合色综合久久综合| 石景山区| 亚洲精品日韩在线观看| 国产中文字幕在线一区| 啦啦啦高清在线观看视频www| 干老熟女干老穴干老女人| 精品国产一区二区三区香蕉|