WDK 学習メモ_Pytorch フレームワークの使用

Pytorch フレームワークの使用

まとめ

エンジニアリング面では、Pytorch フレームワークの使い方を学び、データ処理面では、Dataset を使用してファイルからデータを読み込んで番号を付け、Dataloader を使用してデータをバッチにパッケージ化し、使いやすくしました。トレーニング中にモデルを最適化するためのスモールバッチ勾配降下法; 可視化の面では、Tensorboard を使用してモデル構築の可視化とトレーニング データの可視化を実現; モデル上では、手書き数字を分類するために CNN-DNN モデルが構築されましたパラメータ調整やモデル改良を行わずに認識率約80%を達成しました。
学問の面で: 今週、私はオイラーの観点とラグランジアンの観点から流体運動の記述を詳細に読み、いくつかの導出を行い、SVM が低緯度のデータを高緯度のデータにマッピングする方法の数学的導出を部分的に学びました。分類用の緯度データ。


1. データ処理

Pytorch では、データの読み取りには主に Dataset と Dataloader の 2 つのクラスが関係します。

  1. データセットは、ファイル内のデータを読み取り、各データとそれに対応するラベル (ラベル) を読み取るためによく使用されます。
  2. Dataloader は、Dataset によって読み取られたデータをパックし、バッチでニューラル ネットワークに送信します。

1.1 データセットのオーバーロード

Dataset 公式ドキュメント
Mydataset クラスを作成し、親クラス Dataset を継承し、初期化関数、__getitem__ 関数、__len__ 関数を書き換えます。次のコードの効果は、上位ディレクトリ ファイル dataset/val/ 内のアリとミツバチの画像データを読み取ることです。関数の役割:

  1. os.path.join: ファイル アドレスを入力し、アドレスを接続して出力します。例: os.path.join(“dataset”, “val”) = dataset/val
  2. os.listdir: ファイルアドレスを入力し、そのアドレス内のファイル名のリストを出力します。
  3. Image.open: 画像のアドレスを入力して画像を出力します。
import os.path

from PIL import Image
from torch.utils.data import Dataset

class Mydataset(Dataset):
    def __init__(self, root_dir, label_dir):
        self.label_dir = label_dir
        self.root_label_dir = os.path.join(root_dir, label_dir)
        self.imgs_dir_list = os.listdir(self.root_label_dir)

    def __getitem__(self, idex):#输入图片索引,返回图片及其label
        img_path = self.imgs_dir_list[idex]
        img = Image.open(os.path.join(self.root_label_dir, img_path))
        img_label = self.label_dir
        return img, img_label

    def __len__(self):#返回图片的长度
        return len(self.imgs_dir_list)

root_dir = "../dataset/val"
ants_dir = "ants"
bees_dir = "bees"
ants_dataset = Mydataset(root_dir, ants_dir)
bees_dataset = Mydataset(root_dir, bees_dir)
img, label = ants_dataset.__getitem__(2)
img.show()
print(label)

1.2 データローダー

DataLoader公式ドキュメント
機能:データを一括パックする

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

trans_tensor = torchvision.transforms.ToTensor() #实例化图片转tensor的类
train_data = torchvision.datasets.MNIST("./data_minst", train=True, transform=trans_tensor, download=True)
test_data = torchvision.datasets.MNIST("./data_minst", train=False, transform=trans_tensor, download=True)
writer =SummaryWriter("./logs")

batch = 50
train_data_batch = DataLoader(train_data, batch_size=batch)
test_data_batch = DataLoader(test_data, batch_size=batch)

i = 0
for data in train_data_batch:
    img, label = data
    print(img.shape)
    img = torch.reshape(img, (batch, 1, 28, 28))
    writer.add_images("手写数字", img, i)
    i += 1

writer.close()

ここに画像の説明を挿入

2. 視覚化

Tensorboard 公式ドキュメント

2.1 テンソルボードの使用

2.1.1 Tensorboard がデータに従って描画する

from torch.utils.tensorboard import SummaryWriter#从tensorboard中导入类SummaryWriter
writer = SummaryWriter("./logs")#类的实例化
for i in range(100):
    writer.add_scalar("y=x^2", i**2, i)#添加数据
writer.close()

ここに画像の説明を挿入

2.1.2 Tensorboard に画像を表示する

  1. Writer.add_images: 入力テンソル形式は (n, m, h, w) です。ここで、n はイメージの数を表し、m はチャネルの数を表し、h と w はイメージのピクセルを表します。
import torch
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("./logs")
img = Image.open("./image/0013035.jpg")
tensor_trans = transforms.ToTensor()
img = tensor_trans(img)
print(img.shape)
img = torch.reshape(img,(1,3,512,768))
writer.add_images("image", img)
writer.close()

ここに画像の説明を挿入

2.1.3 Tensorboard 表示モデルのネットワーク構造

  1. Writer.add_graph(): 入力モデルクラスとモデル入力。
import torch
from torch import nn
from torch.utils.tensorboard import SummaryWriter


class CnnModel(nn.Module):
    def __init__(self):
        super(CnnModel, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=1, padding=0)
        self.pool1 = nn.MaxPool2d(2)
        self.conv2 = nn.Conv2d(3, 3, 3, 1, 0)
        self.pool2 = nn.MaxPool2d(2)
        self.flaten = nn.Flatten()
        self.linear = nn.Linear(75, 10)
        self.sofmax = nn.Softmax(1)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.flaten(x)
        x = self.linear(x)
        x = self.sofmax(x)
        return x

if __name__ == '__main__':      #测试model是否正确
    x = torch.ones(1, 1, 28, 28)
    model = CnnModel()
    output = model.forward(x)
    writer = SummaryWriter("./logs_model")
    writer.add_graph(model, x)
    writer.close()

ここに画像の説明を挿入

3. モデルの実践

torch.nn 公式ドキュメント

3.1 手書き数字の認識

torchvision から手書きデータ セットを読み取り、torchvision.transforms.ToTensor を使用して画像をテンソルに変換し、DataLoader を使用してデータ セットをバッチにパックし、nn.Module からモデル クラスを継承し、nn.Conv2d を使用して畳み込みアルゴリズムを構築します。 nn.MaxPool2dl はプーリング層を構築し、nn.Linear は線形層を構築し、nn.Flatten() はデータを平坦化し、nn.Sofemax() はアクティベーション関数として機能します。構築されたモデルは、以下に示すように tensorboard で視覚化されます。
ここに画像の説明を挿入

3.1.1 モデルプログラム

import torch
from torch import nn

class CnnModel(nn.Module):
    def __init__(self):
        super(CnnModel, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=1, padding=0)
        self.pool1 = nn.MaxPool2d(2)
        self.conv2 = nn.Conv2d(3, 3, 3, 1, 0)
        self.pool2 = nn.MaxPool2d(2)
        self.flaten = nn.Flatten()
        self.linear = nn.Linear(75, 10)
        self.sofmax = nn.Softmax(1)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.flaten(x)
        x = self.linear(x)
        x = self.sofmax(x)
        return x

if __name__ == '__main__':      #测试model是否正确
    x = torch.ones(1, 1, 28, 28)
    model = CnnModel()
    output = model.forward(x)
    print(output.shape)
    print(output)

3.1.2 メイン関数プログラム

データセットを読み取り、画像データをテンソルに変換します。50 枚ごとの画像がバッチとみなされ、トレーニングのためにモデルに投入されます。クロスエントロピーは、モデルの各バッチの損失値を記録する損失関数として使用され、各エポック データ セットトレーニング後のすべての損失値は、torch.save を使用してトレーニングされたモデルのすべてのパラメーターを保持します。

import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from Model import *		#导入Model

#读取图片并转换为tensor型数据
trans_tensor = torchvision.transforms.ToTensor() #实例化图片转tensor的类
train_data = torchvision.datasets.MNIST("./data_minst", train=True, transform=trans_tensor, download=True)
test_data = torchvision.datasets.MNIST("./data_minst", train=False, transform=trans_tensor, download=True)

writer =SummaryWriter("./logs")

#将数据分批量打包
batch = 50
train_data_batch = DataLoader(train_data, batch_size=batch)
test_data_batch = DataLoader(test_data, batch_size=batch)

#模型实例化
MinModel = CnnModel()

#优化器实例化
learingrate = 1e-2
optimizer = torch.optim.SGD(MinModel.parameters(), lr=learingrate)

#损失函数
loss_f = nn.CrossEntropyLoss()

epoach = 20
train_size = 1


for i in range(epoach):
    total_loss = 0
    print("——————————第{}轮训练开始——————————————".format(i+1))
    for data in train_data_batch:
        img, label = data   #取出img和label
        y = MinModel(img)   #得到model输出
        loss = loss_f(y, label)    #计算损失值
        writer.add_scalar("Loss值随训练次数的变化", loss, train_size)
        total_loss += loss  #每一轮的累计损失值
        optimizer.zero_grad()   #每一次训练将梯度清0
        loss.backward()     #自动求导
        optimizer.step()    #用优化器自动更新参数

        acc_train = ((y.argmax(1)==label).sum())/batch
        writer.add_scalar("准确率随训练次数的变化", acc_train, train_size)

        if(train_size%100==0): #每训练100次输出此batch的损失值
            print("第{}次训练的loss值为{}".format(train_size, loss))
        train_size += 1

    print("********第{}轮训练全部的loss值是:{}***********".format(i+1, total_loss))

torch.save(MinModel, "./Model_save/model.pth") #保持model

writer.close()

ここに画像の説明を挿入

要約する

pytorchフレームワークを使って0からネットワークを構築することを実現し、手書きの数字のデータセットを使って練習し、tensorboardによるモデルと訓練データの可視化をマスターしました。論文に関しては、流体運動に関するオイラーとラグランジュの見解をより体系的に理解します。

おすすめ

転載: blog.csdn.net/sunningzhzh/article/details/121578175