import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor,Lambda,Compose import matplotlib.pyplot as plt training_data = datasets.FashionMNIST( root = "data", train = True, download = True, transform = ToTensor(), #è¿é并没æä½¿ç¨transforms.Compose说ææä»¬è¿éå¹¶ä¸éè¦è¿è¡å¤ä¸ªå¾çæä½ã ) test_data = datasets.FashionMNIST( root = "data", train = False, download = True, transform = ToTensor(), ) batch_size = 64 #å°Datasetä¼ å ¥DataLoaderä¸ã train_dataloader = DataLoader(training_data, batch_size=batch_size) test_dataloader = DataLoader(test_data, batch_size=batch_size) #z注æå¦ææ¯èªå·±çæ°æ®éè¦å°è£ ï¼é£ä¹è¦å åä¸ä¸ªç±»ï¼è¯¥ç±»ç»§æ¿Datasetï¼ç¶åå¨è¯¥ç±»ä¸è¦ #éå__len__,__getitem__项ãå¹¶ä¸å¨è¯¥ç±»ç__init__æ¹æ³ä¸ï¼é¤äºselfï¼è¿ææä»¶çè·¯å¾ã #ç±torchvisionä¸è·å¾çæ°æ®å·²ç»æ¯Datasetæ ¼å¼ï¼ä¸éè¦ç»è¿Dataset,ç´æ¥ä¼ å ¥DataLoaderä¸ã for X, y in test_dataloader: print("shape of X [N, C, H, W]:", X.shape) print("Shape of y:", y.shape, y.dtype) break #è¿é循ç¯ä¸å äºbreak,æä»¥åªéè¦æå°ä¸æ¹çæ°æ®çä¿¡æ¯ã #Creating Models device = "cuda" if torch.cuda.is_available() else "cpu" print('using {} device'.format(device)) #define model class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork,self).__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28,512), nn.ReLU(), nn.Linear(512,512), nn.ReLU(), nn.Linear(512,10), nn.ReLU() ) def forward(self,x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits model = NeuralNetwork().to(device) print(model) #æ¥ä¸æ¥æ¯ä¼å模ååæ° #å®ä¹æå¤±å½æ° loss_fn = nn.CrossEntropyLoss()#ä½ å¯ä»¥è¿æ ·çè§£ï¼nn.xxï¼æ¯ä¸ä¸ªç±»ï¼torch.nn.functional.xxæ¯å½æ°ã optimizer = torch.optim.SGD(model.parameters(),lr=1e-3) #w为äºè®ç»æä»¬ç模åï¼æä»¬éè¦æå¤±å½æ°åä¼åå¨ def train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) for batch, (X,y) in enumerate(dataloader): X, y = X.to(device), y.to(device) pred = model(X) loss = loss_fn(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() if batch % 100 == 0: loss, current = loss.item(), batch*len(X) print(f"loss:{loss:>7f} [{current:>5d}/{size:>5d}]") def test(dataloader, model, loss_fn): model.eval() size = len(dataloader.dataset) num_batches = len(dataloader) test_loss, correct = 0, 0 with torch.no_grad(): for X, y in dataloader: X, y = X.to(device), y.to(device) pred = model(X) test_loss += loss_fn(pred, y).item() correct += (pred.argmax(1) == y).type(torch.float).sum().item() #pred.argmax(1)卿å®ç»´åº¦ä¸æ±æå¤§å¼ã #æå®ç±»åæ¹åã test_loss /= num_batches correct /= size print(f"Test Error: /n Accuracy:{(100*correct):>0.1f}%,Avg loss:{test_loss:>8f}\n") #è®ç»è¿ç¨æ¯å¨å¥½å 次è¿ä»£æ åµä¸å®æ½çã if __name__ == "__main__": epochs = 5 for t in range(epochs): print(f"Epoch {t+1}\n-------------") train(train_dataloader,model,loss_fn,optimizer) test(test_dataloader,model,loss_fn) print("Done!!")