pyTorch学习

一、 MLP 模型的实现

  • 数据 sigmoid.csv, 前几列是特征值,最后一列是lable;
  • 通过建立自己的数据集跑出结果;
A B…H I
-0.882353 0
-0.882353 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import torch 
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader

### 自己实现Dataset类去加载本地的CSV数据 ###
### 需要三个函数: init get_item len
class MyDataset(Dataset):
def __init__(self, filepath):
xy = np.loadtxt(filepath, delimiter=",", dtype=np.float32)
self.len = xy.shape[0] # 行数
self.x_data = torch.from_numpy(xy[:, :-1]) #所有的行,不包括最后一列的其他列
self.y_data = torch.from_numpy(xy[:, [-1]]) #所有的行,最后一列

def __getitem__(self, index):
return self.x_data[index], self.y_data[index]

def __len__(self):
return self.len

dataset = MyDataset('./sigmoid.csv')
train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True)

class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6)
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
self.sigmoid = torch.nn.Sigmoid()

def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x

model = Model()
### 建立 损失函数 和 优化器
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(100):
for i, data in enumerate(train_loader):
inputs, labels = data
y_pred = model(inputs)
loss = criterion(y_pred, labels)
print(epoch, i, loss.item())
optimizer.zero_grad()
loss.bachward()

二、CNN模型

  • mnist数据集,只有20个,用来举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import os
import pandas as pd
import numpy as np
from PIL import Image
import torch
from torch.utils.data import Dataset
from torchvision import transforms
import torch.nn as nn


class MnistDataset(Dataset):
def __init__(self, image_path, image_label, transform=None):
super(MnistDataset, self).__init__()
self.image_path = image_path # 初始化图像路径列表
self.image_label = image_label # 初始化图像标签列表
self.transform = transform # 初始化数据增强方法

def __getitem__(self, index):
"""
获取对应index的图像,并视情况进行数据增强
"""
image = Image.open(self.image_path[index])
image = np.array(image)
label = int(self.image_label[index])

if self.transform is not None:
image = self.transform(image)

return image, torch.tensor(label)

def __len__(self):
return len(self.image_path)


def get_path_label(img_root, label_file_path):
"""
获取数字图像的路径和标签并返回对应列表
@para: img_root: 保存图像的根目录
@para:label_file_path: 保存图像标签数据的文件路径 .csv 或 .txt 分隔符为','
@return: 图像的路径列表和对应标签列表
"""
data = pd.read_csv(label_file_path, names=["img", "label"])
data["img"] = data["img"].apply(lambda x: img_root + x)
return data["img"].tolist(), data["label"].tolist()


# 获取训练集路径列表和标签列表
dir_path = os.path.dirname(__file__)
train_data_root = dir_path + "/mnist_data/train/"
train_label = dir_path + "/mnist_data/train.txt"
train_img_list, train_label_list = get_path_label(train_data_root, train_label)
# 训练集dataset
train_dataset = MnistDataset(
train_img_list,
train_label_list,
transform=transforms.Compose([transforms.ToTensor()]),
)

# 获取测试集路径列表和标签列表

test_data_root = dir_path + "/mnist_data/test/"
test_label = dir_path + "/mnist_data/test.txt"
test_img_list, test_label_list = get_path_label(test_data_root, test_label)
# 测试集sdataset
test_dataset = MnistDataset(
test_img_list,
test_label_list,
transform=transforms.Compose([transforms.ToTensor()]),
)

num_epochs = 5
num_classes = 10
batch_size = 10
learning_rate = 0.001


train_loader = torch.utils.data.DataLoader(
dataset=train_dataset, batch_size=batch_size, shuffle=True
)

test_loader = torch.utils.data.DataLoader(
dataset=test_dataset, batch_size=batch_size, shuffle=False
)


class ConvNet(nn.Module):
def __init__(self, num_classes=10):
super(ConvNet, self).__init__()
## 池化+batchnorm+relu激活+池化
self.layer1 = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.fc = nn.Linear(7 * 7 * 32, num_classes) ## 全链接

def forward(self, x):
out = self.layer1(x)
out = self.layer2(out)
out = out.reshape(out.size(0), -1)
out = self.fc(out)
return out


model = ConvNet(num_classes)

# Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# Train the model
total_step = len(train_loader)
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
images = images
labels = labels

# Forward pass
outputs = model(images)
loss = criterion(outputs, labels)

# Backward and optimize
optimizer.zero_grad()
loss.backward()
optimizer.step()
# if (i + 1) % 2 == 0:
print(
"Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}".format(
epoch + 1, num_epochs, i + 1, total_step, loss.item()
)
)

三、 RNN

作者

Gavin

发布于

2022-03-18

更新于

2022-03-18

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×