import torch
from torchvision import transforms #针对图像进行处理
from torchvision import datasets
from torch.utils.data import DataLoader #loader picture
import torch.nn.functional as F #using function rule
import torch.optim as optim
import matplotlib.pyplot as plt
# 糖尿病预测研判..................................................................................................#
#loader dataset and transform dataset as Tensore
batch_size = 64
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307, ),(0.3081, ))])
#mnist库的训练集当中有60000张图片
train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size )
#mnist库的训练集当中有10000张图片
test_dataset = datasets.MNIST(root='../dataset/mnist/',train=False,download=True,transform=transform)
test_loader = DataLoader(test_dataset,shuffle=False,batch_size=batch_size )
#Design model and use class.................. inherit from nn.Moduel........................................................#
class Model(torch.nn.Module):
def __init__(self):
super( Model, self).__init__()
self.l1 = torch.nn.Linear(784,512)
self.l2 = torch.nn.Linear(512,256)
self.l3 = torch.nn.Linear(256,128)
self.l4 = torch.nn.Linear(128,64)
self.l5 = torch.nn.Linear(64,10)
def forward(self,x):
x = x.view(-1,784) # 图像的类型为 tensor 张量 (1,28,28)进行把图像平展化,变成一维张量
x = F.relu(self.l1(x)) #input:784 output:512
x = F.relu(self.l2(x)) #input:512 output:256
x = F.relu(self.l3(x)) #input:256 output:128
x = F.relu(self.l4(x)) #input:128 output:64
x = self.l5(x) #input:64 output:10
return x
model = Model()#实例化
#Construct loss functions and optimizer.................Use Torch API...................................................#
criterion = torch.nn.CrossEntropyLoss() #老师使用的是torch.nn.BCELoss(size_average=False)但是我使用这个损失太大了
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5) #lr为学习率,因为0.01太小了,我改成了0.1
#plot
cycle = 10
x_axis = []
for i in range(cycle*3):
x_axis.append((i+1))
y_axis = []
#defining one training..........................................................................................................#
def train(epoch):
running_loss =0.0
for batch_idx ,data in enumerate(train_loader,0): #enumerate函数将train_loader中的元组(mini_batch(四维张量)+target(一维张量))列表化,index从0开始
inputs ,target =data
optimizer.zero_grad()
#forward+backward+update
outputs = model(inputs)
loss = criterion(outputs,target)
loss.backward()
optimizer.step()
running_loss +=loss.item() #不用item,pytorch会构建计算图
if batch_idx % 300 ==299:
print('[%d,%5d] loss:%.3f' %(epoch+1,batch_idx+1,running_loss/300))
y_axis.append(running_loss/300)
running_loss = 0.0
#defining one testing..........................................................................................................#
def test():
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images,labels = data
outputs = model(images)
max,predicted = torch.max(outputs.data,dim=1)
total = total+labels.size(0)
correct =correct+(predicted == labels).sum().item()
print('Accuracy on test set:%d %%' %(100*correct/total))
if __name__ == '__main__':
for epoch in range(cycle):
train(epoch)
test()
#drawing.....................................................................................................#
plt.figure(figsize=(7, 7), dpi=80) # 创建画布
plt.plot(x_axis,y_axis, color='r', linestyle='-', label='loss value&No.i mini_batch', ) # 绘制折线图,点划线
plt.xlabel('mini_batch') #设置图x轴标签
plt.ylabel('loss') #设置图y轴标签
plt.show() #显示图
D:\Anaconda\envs\study\python.exe "D:\python pycharm learning\刘二大人课程\P\P9.py"
[1, 300] loss:2.141
[1, 600] loss:0.737
[1, 900] loss:0.415
Accuracy on test set:89 %
[2, 300] loss:0.310
[2, 600] loss:0.272
[2, 900] loss:0.232
Accuracy on test set:94 %
[3, 300] loss:0.195
[3, 600] loss:0.167
[3, 900] loss:0.148
Accuracy on test set:95 %
[4, 300] loss:0.128
[4, 600] loss:0.125
[4, 900] loss:0.115
Accuracy on test set:96 %
[5, 300] loss:0.094
[5, 600] loss:0.096
[5, 900] loss:0.096
Accuracy on test set:97 %
[6, 300] loss:0.074
[6, 600] loss:0.078
[6, 900] loss:0.074
Accuracy on test set:97 %
[7, 300] loss:0.059
[7, 600] loss:0.061
[7, 900] loss:0.062
Accuracy on test set:96 %
[8, 300] loss:0.049
[8, 600] loss:0.048
[8, 900] loss:0.053
Accuracy on test set:97 %
[9, 300] loss:0.040
[9, 600] loss:0.042
[9, 900] loss:0.040
Accuracy on test set:97 %
[10, 300] loss:0.030
[10, 600] loss:0.034
[10, 900] loss:0.036
Accuracy on test set:97 %
补充问题:我想在CUDA上面跑,所以在代码中修改:
data = data.to(device) inputs, target = data #inputs = inputs.to(device) #target = target.to(device) 发现报错,根据ChatGTP提供的原因: