記事ディレクトリ
Pytorch フレームワークの使用
まとめ
エンジニアリング面では、Pytorch フレームワークの使い方を学び、データ処理面では、Dataset を使用してファイルからデータを読み込んで番号を付け、Dataloader を使用してデータをバッチにパッケージ化し、使いやすくしました。トレーニング中にモデルを最適化するためのスモールバッチ勾配降下法; 可視化の面では、Tensorboard を使用してモデル構築の可視化とトレーニング データの可視化を実現; モデル上では、手書き数字を分類するために CNN-DNN モデルが構築されましたパラメータ調整やモデル改良を行わずに認識率約80%を達成しました。
学問の面で: 今週、私はオイラーの観点とラグランジアンの観点から流体運動の記述を詳細に読み、いくつかの導出を行い、SVM が低緯度のデータを高緯度のデータにマッピングする方法の数学的導出を部分的に学びました。分類用の緯度データ。
1. データ処理
Pytorch では、データの読み取りには主に Dataset と Dataloader の 2 つのクラスが関係します。
- データセットは、ファイル内のデータを読み取り、各データとそれに対応するラベル (ラベル) を読み取るためによく使用されます。
- Dataloader は、Dataset によって読み取られたデータをパックし、バッチでニューラル ネットワークに送信します。
1.1 データセットのオーバーロード
Dataset 公式ドキュメント
Mydataset クラスを作成し、親クラス Dataset を継承し、初期化関数、__getitem__ 関数、__len__ 関数を書き換えます。次のコードの効果は、上位ディレクトリ ファイル dataset/val/ 内のアリとミツバチの画像データを読み取ることです。関数の役割:
- os.path.join: ファイル アドレスを入力し、アドレスを接続して出力します。例: os.path.join(“dataset”, “val”) = dataset/val
- os.listdir: ファイルアドレスを入力し、そのアドレス内のファイル名のリストを出力します。
- 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. 視覚化
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 に画像を表示する
- 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 表示モデルのネットワーク構造
- 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. モデルの実践
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によるモデルと訓練データの可視化をマスターしました。論文に関しては、流体運動に関するオイラーとラグランジュの見解をより体系的に理解します。