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

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

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

      使用VGG模型進行貓狗大戰(zhàn)

      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

      1、下載數據

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

      2、數據處理

      datasets 是 torchvision 中的一個包,可以用做加載圖像數據。它可以以多線程(multi-thread)的形式從硬盤中讀取數據,使用 mini-batch 的形式,在網絡訓練中向 GPU 輸送。在使用CNN處理圖像時,需要進行預處理。圖片將被整理成 224×224×3 的大小,同時還將進行歸一化處理。

      normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
      
      vgg_format = transforms.Compose([
                      transforms.CenterCrop(224),
                      transforms.ToTensor(),
                      normalize,
                  ])
      
      #這里進行了修改,包括訓練數據、驗證數據、以及測試數據,分別在三個目錄train/val/test
      import shutil
      data_dir = './cat_dog'
      os.mkdir("./cat_dog/train/cat")
      os.mkdir("./cat_dog/train/dog")
      os.mkdir("./cat_dog/val/cat")
      os.mkdir("./cat_dog/val/dog")
      for i in range(10000):
        cat_name = './cat_dog/train/cat_'+str(i)+'.jpg';
        dog_name = './cat_dog/train/dog_'+str(i)+'.jpg';
        shutil.move(cat_name,"./cat_dog/train/cat")
        shutil.move(dog_name,"./cat_dog/train/dog")
      
      for i in range(1000):
        cat_name = './cat_dog/val/cat_'+str(i)+'.jpg';
        dog_name = './cat_dog/val/dog_'+str(i)+'.jpg';
        shutil.move(cat_name,"./cat_dog/val/cat")
        shutil.move(dog_name,"./cat_dog/val/dog")
      #讀取測試問題的數據集
      
      test_path = "./cat_dog/test/dogs_cats"
      os.mkdir(test_path)
      #移動到test_path
      for i in range(2000):
        name = './cat_dog/test/'+str(i)+'.jpg' 
        shutil.move(name,"./cat_dog/test/dogs_cats")
      
      file_list=os.listdir("./cat_dog/test/dogs_cats")
      #將圖片名補全,防止讀取順序不對
      for file in file_list:
        #填充0后名字總共10位,包括擴展名
        filename = file.zfill(10)
        new_name =''.join(filename)
        os.rename(test_path+'/'+file,test_path+'/'+new_name)
      #將所有圖片數據放到dsets內
      dsets = {x: datasets.ImageFolder(os.path.join(data_dir, x), vgg_format)
               for x in ['train','val','test']}
      dset_sizes = {x: len(dsets[x]) for x in ['train','val','test']}
      dset_classes = dsets['train'].classes
      loader_train = torch.utils.data.DataLoader(dsets['train'], batch_size=64, shuffle=True, num_workers=6)
      loader_valid = torch.utils.data.DataLoader(dsets['val'], batch_size=5, shuffle=False, num_workers=6)
      #加入測試集
      loader_test = torch.utils.data.DataLoader(dsets['test'], batch_size=5,shuffle=False, num_workers=6)
      
      '''
      valid 數據一共有2000張圖,每個batch是5張,因此,下面進行遍歷一共會輸出到 400
      同時,把第一個 batch 保存到 inputs_try, labels_try,分別查看
      '''
      count = 1
      for data in loader_test:
          print(count, end=',')
          if count%50==0: 
            print()
          if count == 1:
              inputs_try,labels_try = data
          count +=1
      
      print(labels_try)
      print(inputs_try.shape)
      # 顯示圖片的小程序
      
      def imshow(inp, title=None):
      #   Imshow for Tensor.
          inp = inp.numpy().transpose((1, 2, 0))
          mean = np.array([0.485, 0.456, 0.406])
          std = np.array([0.229, 0.224, 0.225])
          inp = np.clip(std * inp + mean, 0,1)
          plt.imshow(inp)
          if title is not None:
              plt.title(title)
          plt.pause(0.001)  # pause a bit so that plots are updated
      # 顯示 labels_try 的5張圖片,即valid里第一個batch的5張圖片
      out = torchvision.utils.make_grid(inputs_try)
      imshow(out, title=[dset_classes[x] for x in labels_try])

      3. 創(chuàng)建 VGG Model

      !wget https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
      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)
      
      '''
      可以看到結果為5行,1000列的數據,每一列代表對每一種目標識別的結果。
      但是我也可以觀察到,結果非常奇葩,有負數,有正數,
      為了將VGG網絡輸出的結果轉化為對每一類的預測概率,我們把結果輸入到 Softmax 函數
      '''
      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()])

      4. 修改最后一層,凍結前面層的參數

      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)

      5. 訓練并測試全連接層

      包括三個步驟:第1步,創(chuàng)建損失函數和優(yōu)化器;第2步,訓練模型;第3步,測試模型。

      '''
      第一步:創(chuàng)建損失函數和優(yōu)化器
      
      損失函數 NLLLoss() 的 輸入 是一個對數概率向量和一個目標標簽. 
      它不會為我們計算對數概率,適合最后一層是log_softmax()的網絡. 
      '''
      criterion = nn.NLLLoss()
      
      # 學習率
      lr = 0.001
      
      # 隨機梯度下降
      optimizer_vgg = torch.optim.SGD(model_vgg_new.classifier[6].parameters(),lr = lr)
      
      '''
      第二步:訓練模型
      '''
      
      def train_model(model,dataloader,size,epochs=1,optimizer=None):
          model.train()
          
          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))
              
              
      # 模型訓練
      train_model(model_vgg_new,loader_train,size=dset_sizes['train'], epochs=1, 
                  optimizer=optimizer_vgg)
      #驗證模型正確率的代碼
      def test_model(model,dataloader,size):
          model.eval()
          predictions = np.zeros(size)
          all_classes = np.zeros(size)
          all_proba = np.zeros((size,2))
          i = 0
          running_loss = 0.0
          running_corrects = 0
          for inputs,classes in dataloader:
              inputs = inputs.to(device)
              classes = classes.to(device)
              outputs = model(inputs)
              loss = criterion(outputs,classes)           
              _,preds = torch.max(outputs.data,1)
              # statistics
              running_loss += loss.data.item()
              running_corrects += torch.sum(preds == classes.data)
              predictions[i:i+len(classes)] = preds.to('cpu').numpy()
              all_classes[i:i+len(classes)] = classes.to('cpu').numpy()
              all_proba[i:i+len(classes),:] = outputs.data.to('cpu').numpy()
              i += len(classes)
              print('validing: No. ', i, ' 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))
          return predictions, all_proba, all_classes
        
      #predictions, all_proba, all_classes = test_model(model_vgg_new,loader_valid,size=dset_sizes['val'])
      #如果使用的是已有的模型,應該跑下面這行代碼
      predictions, all_proba, all_classes = test_model(model_new,loader_valid,size=dset_sizes['val'])
      #這個是對測試集進行預測的代碼
      def result_model(model,dataloader,size):
          model.eval()
          predictions=np.zeros((size,2),dtype='int')
          i = 0
          for inputs,classes in dataloader:
              inputs = inputs.to(device)
              outputs = model(inputs)         
              #_表示的就是具體的value,preds表示下標,1表示在行上操作取最大值,返回類別
              _,preds = torch.max(outputs.data,1)
              predictions[i:i+len(classes),1] = preds.to('cpu').numpy();
              predictions[i:i+len(classes),0] = np.linspace(i,i+len(classes)-1,len(classes))
              #可在過程中看到部分結果
              print(predictions[i:i+len(classes),:])
              i += len(classes)
              print('creating: No. ', i, ' process ... total: ', size)        
          return predictions
      
      result = result_model(model_vgg_new,loader_test,size=dset_sizes['test'])
      #如果使用的是已有的模型,應該跑下面這行代碼
      result = result_model(model_new,loader_test,size=dset_sizes['test'])
      
      #這里是生成結果的文件,上傳到AI研習社可以看到正確率
      np.savetxt("./cat_dog/result.csv",result,fmt="%d",delimiter=",")

      6. 可視化模型預測結果(主觀分析)

      主觀分析就是把預測的結果和相對應的測試圖像輸出出來看看,一般有四種方式:

      隨機查看一些預測正確的圖片
      隨機查看一些預測錯誤的圖片
      預測正確,同時具有較大的probability的圖片
      預測錯誤,同時具有較大的probability的圖片
      最不確定的圖片,比如說預測概率接近0.5的圖片

      # 單次可視化顯示的圖片個數
      n_view = 8
      correct = np.where(predictions==all_classes)[0]
      from numpy.random import random, permutation
      idx = permutation(correct)[:n_view]
      print('random correct idx: ', idx)
      loader_correct = torch.utils.data.DataLoader([dsets['valid'][x] for x in idx],
                        batch_size = n_view,shuffle=True)
      for data in loader_correct:
          inputs_cor,labels_cor = data
      # Make a grid from batch
      out = torchvision.utils.make_grid(inputs_cor)
      imshow(out, title=[l.item() for l in labels_cor])
      
      print(all_classes)
      # 類似的思路,可以顯示錯誤分類的圖片,這里不再重復代碼

       

      posted on 2021-10-23 19:11  東皇御前  閱讀(44)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产高跟黑色丝袜在线| 日韩精品卡1卡2日韩在线| 久久精品国产亚洲av熟女| 在线播放亚洲人成电影| 在线播放亚洲成人av| 国产成人综合久久亚洲av| 亚洲AV成人片不卡无码| 日韩大片高清播放器| 亚洲人成电影网站 久久影视| 亚洲深深色噜噜狠狠网站| 亚洲天堂在线观看完整版| 女高中生自慰污污网站| 日本内射精品一区二区视频| 国产高在线精品亚洲三区| 国产乱码精品一区二三区| 久久人人97超碰人人澡爱香蕉| 国产乱码精品一区二区上| 国产高颜值极品嫩模视频| 116美女极品a级毛片| 中文字幕乱码人妻综合二区三区| 少女韩国在线观看完整版免费| 草草浮力影院| 国产精品午夜av福利| 不卡乱辈伦在线看中文字幕| 特级毛片在线大全免费播放 | 中国大陆高清aⅴ毛片| 久久美女夜夜骚骚免费视频| 无码免费大香伊蕉在人线国产 | 亚在线观看免费视频入口| 在线亚洲午夜理论av大片| 桃花岛亚洲成在人线AV| 激情综合网激情五月激情| 九色精品国产亚洲av麻豆一| 欧美日韩国产图片区一区| 国产又爽又黄的精品视频| 国产精品亚洲А∨天堂免下载| 7878成人国产在线观看| 九色综合久99久久精品| 国产精品成人免费视频网站京东| 偷窥少妇久久久久久久久| 国产精品十八禁一区二区|