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

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

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

      C# TorchSharp 圖像分類實戰:VGG大規模圖像識別的超深度卷積網絡


      教程名稱:使用 C# 入門深度學習

      作者:癡者工良

      教程地址:

      https://torch.whuanle.cn

      電子書倉庫:https://github.com/whuanle/cs_pytorch

      Maomi.Torch 項目倉庫:https://github.com/whuanle/Maomi.Torch

      VGG大規模圖像識別的超深度卷積網絡

      本文主要講解用于大規模圖像識別的超深度卷積網絡 VGG,通過 VGG 實現自有數據集進行圖像分類訓練模型和識別,VGG 有 vgg11、vgg11_bn、vgg13、vgg13_bn、vgg16、vgg16_bn、vgg19、vgg19_bn 等變種,VGG 架構的實現可參考論文:https://arxiv.org/abs/1409.1556

      論文中文版地址:

      https://noahsnail.com/2017/08/17/2017-08-17-VGG論文翻譯——中文版/

      數據集

      本文主要使用經典圖像分類數據集 CIFAR-10 進行訓練,CIFAR-10 數據集中有 10 個分類,每個類別均有 60000 張圖像,50000 張訓練圖像和 10000 張測試圖像,每個圖像都經過了預處理,生成 32x32 彩色圖像。

      CIFAR-10 的 10 個分類分別是:

      airplane
      automobile
      bird
      cat
      deer
      dog
      frog
      horse
      ship
      truck
      

      下面給出幾種數據集的本地化導入方式。

      直接下載

      由于 CIFAR-10 是經典數據集,因此 TorchSharp 默認支持下載該數據集,但是由于網絡問題,國內下載數據庫需要開飛機,數據集自動下載和導入:

      // 加載訓練和驗證數據
      
      var train_dataset = datasets.CIFAR10(root: "E:/datasets/CIFAR-10", train: true, download: true, target_transform: transform);
      var val_dataset = datasets.CIFAR10(root: "E:/datasets/CIFAR-10", train: false, download: true, target_transform: transform);
      

      opendatalab 數據集社區

      opendatalab 是一個開源數據集社區倉庫,里面有大量免費下載的數據集,借此機會給讀者講解一下如何從 opendatalab 下載數據集,這對讀者學習非常有幫助。

      CIFAR-10 數據集倉庫地址:

      https://opendatalab.com/OpenDataLab/CIFAR-10/cli/main

      打開 https://opendatalab.com 注冊賬號,然后在個人信息中心添加密鑰。

      1739449592381

      然后下載 openxlab 提供的 cli 工具:

      pip install openxlab #安裝
      

      安裝 openxlab 后,會要求添加路徑到環境變量,環境變量地址是 Scripts 地址,示例:

      C:\Users\%USER%\AppData\Roaming\Python\Python312\Scripts
      

      接著進行登錄,輸入命令后按照提示輸入 key 和 secret:

      openxlab login # 進行登錄,輸入對應的AK/SK,可在個人中心查看AK/SK
      

      然后打開空目錄下載數據集,數據集倉庫會被下載到 OpenDataLab___CIFAR-10 目錄中:

      openxlab dataset info --dataset-repo OpenDataLab/CIFAR-10 # 數據集信息及文件列表查看
      
      openxlab dataset get --dataset-repo OpenDataLab/CIFAR-10 #數據集下載
      

      image-20250213203259114

      數據集信息及文件列表查看

      openxlab dataset info --dataset-repo OpenDataLab/CIFAR-10
      

      image-20250213202802853

      下載的文件比較多,但是我們只需要用到 cifar-10-binary.tar.gz,直接解壓 cifar-10-binary.tar.gz 到目錄中(也可以不解壓)。

      image-20250213210939996

      然后導入數據:

      // 加載訓練和驗證數據
      
      var train_dataset = datasets.CIFAR10(root: "E:/datasets/OpenDataLab___CIFAR-10", train: true, download: false, target_transform: transform);
      var val_dataset = datasets.CIFAR10(root: "E:/datasets/OpenDataLab___CIFAR-10", train: false, download: false, target_transform: transform);
      

      自定義數據集

      Maomi.Torch 提供了自定義數據集導入方式,降低了開發者制作數據集的難度。自定義數據集也要區分訓練數據集和測試數據集,訓練數據集用于特征識別和訓練,而測試數據集用于驗證模型訓練的準確率和損失值。

      測試數據集和訓練數據集可以放到不同的目錄中,具體名稱沒有要求,然后每個分類單獨一個目錄,目錄名稱就是分類名稱,按照目錄名稱的排序從 0 生成標簽值。

      ├─test
      │  ├─airplane
      │  ├─automobile
      │  ├─bird
      │  ├─cat
      │  ├─deer
      │  ├─dog
      │  ├─frog
      │  ├─horse
      │  ├─ship
      │  └─truck
      └─train
      │  ├─airplane
      │  ├─automobile
      │  ├─bird
      │  ├─cat
      │  ├─deer
      │  ├─dog
      │  ├─frog
      │  ├─horse
      │  ├─ship
      │  └─truck
      

      image-20250215205033982

      讀者可以參考 exportdataset項目,將 CIFAR-10 數據集生成導出到目錄中。

      通過自定義目錄導入數據集的代碼為:

      var train_dataset = MM.Datasets.ImageFolder(root: "E:/datasets/t1/train", target_transform: transform);
      var val_dataset = MM.Datasets.ImageFolder(root: "E:/datasets/t1/test", target_transform: transform);
      

      模型訓練

      定義圖像預處理轉換代碼,代碼如下所示:

      Device defaultDevice = MM.GetOpTimalDevice();
      torch.set_default_device(defaultDevice);
      
      Console.WriteLine("當前正在使用 {defaultDevice}");
      
      // 數據預處理
      var transform = transforms.Compose([
          transforms.Resize(32, 32),
          transforms.ConvertImageDtype( ScalarType.Float32),
         MM.transforms.ReshapeTransform(new long[]{ 1,3,32,32}),
          transforms.Normalize(means: new double[] { 0.485, 0.456, 0.406 }, stdevs: new double[] { 0.229, 0.224, 0.225 }),
          MM.transforms.ReshapeTransform(new long[]{ 3,32,32})
      ]);
      

      因為 TorchSharp 對圖像維度處理的兼容性不好,沒有 Pytorch 的自動處理,因此導入的圖片維度和批處理維度、transforms 處理的維度兼容性不好,容易報錯,因此這里需要使用 Maomi.Torch 的轉換函數,以便在導入圖片和進行圖像批處理的時候,保障 shape 符合要求。

      分批加載數據集:

      // 加載訓練和驗證數據
      
      var train_dataset = datasets.CIFAR10(root: "E:/datasets/CIFAR-10", train: true, download: true, target_transform: transform);
      var val_dataset = datasets.CIFAR10(root: "E:/datasets/CIFAR-10", train: false, download: true, target_transform: transform);
      
      var train_loader = new DataLoader(train_dataset, batchSize: 1024, shuffle: true, device: defaultDevice, num_worker: 10);
      var val_loader = new DataLoader(val_dataset, batchSize: 1024, shuffle: false, device: defaultDevice, num_worker: 10);
      

      初始化 vgg16 網絡:

      var model = torchvision.models.vgg16(num_classes: 10);
      model.to(device: defaultDevice);
      

      設置損失函數和優化器:

      var criterion = nn.CrossEntropyLoss();
      var optimizer = optim.SGD(model.parameters(), learningRate: 0.001, momentum: 0.9);
      

      訓練模型并保存:

      int num_epochs = 150;
      
      for (int epoch = 0; epoch < num_epochs; epoch++)
      {
          model.train();
          double running_loss = 0.0;
          int i = 0;
          foreach (var item in train_loader)
          {
              var (inputs, labels) = (item["data"], item["label"]);
              var inputs_device = inputs.to(defaultDevice);
              var labels_device = labels.to(defaultDevice);
      
              optimizer.zero_grad();
              var outputs = model.call(inputs_device);
              var loss = criterion.call(outputs, labels_device);
              loss.backward();
              optimizer.step();
      
              running_loss += loss.item<float>() * inputs.size(0);
              Console.WriteLine($"[{epoch}/{num_epochs}][{i % train_loader.Count}/{train_loader.Count}]");
              i++;
          }
          double epoch_loss = running_loss / train_dataset.Count;
          Console.WriteLine($"Train Loss: {epoch_loss:F4}");
      
          model.eval();
          long correct = 0;
          int total = 0;
          using (torch.no_grad())
          {
              foreach (var item in val_loader)
              {
                  var (inputs, labels) = (item["data"], item["label"]);
      
                  var inputs_device = inputs.to(defaultDevice);
                  var labels_device = labels.to(defaultDevice);
                  var outputs = model.call(inputs_device);
                  var predicted = outputs.argmax(1);
                  total += (int)labels.size(0);
                  correct += (predicted == labels_device).sum().item<long>();
              }
          }
      
          double val_accuracy = 100.0 * correct / total;
          Console.WriteLine($"Validation Accuracy: {val_accuracy:F2}%");
      }
      
      model.save("model.dat");
      

      啟動項目后可以直接執行訓練,訓練一百多輪后,準確率在 70% 左右,損失值在 0.0010 左右,繼續訓練已經提高不了準確率了。

      導出的模型還是比較大的:

      513M model.dat
      

      下面來編寫圖像識別測試,在示例項目 vggdemo 中自帶了三張圖片,讀者可以直接導入使用。

      
      model.load("model.dat");
      model.to(device: defaultDevice);
      model.eval();
      
      
      var classes = new string[] {
      "airplane",
      "automobile",
      "bird",
      "cat",
      "deer",
      "dog",
      "frog",
      "horse",
      "ship",
      "truck"
      };
      
      List<Tensor> imgs = new();
      imgs.Add(transform.call(MM.LoadImage("airplane.jpg").to(defaultDevice)).view(1, 3, 32, 32));
      imgs.Add(transform.call(MM.LoadImage("cat.jpg").to(defaultDevice)).view(1, 3, 32, 32));
      imgs.Add(transform.call(MM.LoadImage("dog.jpg").to(defaultDevice)).view(1, 3, 32, 32));
      
      using (torch.no_grad())
      {
      
          foreach (var data in imgs)
          {
              var outputs = model.call(data);
      
              var index = outputs[0].argmax(0).ToInt32();
      
              // 轉換為歸一化的概率
              // outputs.shape = [1,10],所以取 [dim:1]
              var array = torch.nn.functional.softmax(outputs, dim: 1);
              var max = array[0].ToFloat32Array();
              var predicted1 = classes[index];
              Console.WriteLine($"識別結果 {predicted1},準確率:{max[index] * 100}%");
          }
      }
      

      識別結果:

      當前正在使用 cuda:0
      識別結果 airplane,準確率:99.99983%
      識別結果 cat,準確率:99.83113%
      識別結果 dog,準確率:100%
      

      用到的三張圖片均從網絡上搜索而來:

      airplane

      cat

      dog

      posted @ 2025-02-17 08:27  癡者工良  閱讀(793)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品播放一区二区三区| 99精品国产综合久久久久五月天| 欧美野外伦姧在线观看| 亚洲精品一区二区三区蜜| 日本午夜精品一区二区三区电影| 重口SM一区二区三区视频| 国产精品白浆无码流出| bt天堂新版中文在线| 精品av一区二区三区不卡| 伊人久久精品无码二区麻豆| 韩国午夜福利片在线观看| 极品尤物被啪到呻吟喷水| 日韩中文字幕人妻精品| 巨熟乳波霸若妻在线播放| 97国产精品人人爽人人做| 中文字幕国产精品一区二| 亚洲日韩国产成网在线观看| 日本久久一区二区三区高清| 少妇xxxxx性开放| 一区二区三区精品不卡| 亚洲精品成人综合色在线| 2022亚洲男人天堂| 国产乱码精品一区二三区| 成人午夜国产内射主播| 日本中文一二区有码在线| 久久青青草原精品国产app| 亚洲欧美日韩成人一区| 国产成人午夜精品永久免费| 日韩一区二区三区女优丝袜| 亚洲中文字幕人妻系列| 迭部县| 成人精品国产一区二区网| 成人免费A级毛片无码片2022| 国产成人亚洲综合| 国产精品一区二区在线欢| 少妇爆乳无码专区| 最新的精品亚洲一区二区| 香蕉EEWW99国产精选免费| 18禁裸乳无遮挡啪啪无码免费| 国产超碰人人爽人人做人人添| 美女裸体十八禁免费网站|