https://www.toutiao.com/article/7234857571612738059/?log_from=5751e0e133b62_1686057077081 1. 數(shù)據(jù)準(zhǔn)備 首先,,我們需要準(zhǔn)備手寫數(shù)字的數(shù)據(jù)集,。在這里,,我們將使用MNIST數(shù)據(jù)集,它包含了60000個訓(xùn)練樣本和10000個測試樣本,,每個樣本都是一個28x28像素的灰度圖像,,表示一個手寫數(shù)字。我們可以使用pytorch內(nèi)置的torchvision庫來下載和加載MNIST數(shù)據(jù)集,。 ```python import torch import torchvision import torchvision.transforms as transforms # 定義數(shù)據(jù)轉(zhuǎn)換 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) # 加載訓(xùn)練集 trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2) # 加載測試集 testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False, num_workers=2) ``` 在這段代碼中,,我們定義了一個數(shù)據(jù)轉(zhuǎn)換transform,它將圖像轉(zhuǎn)換為張量,,并對每個像素進(jìn)行歸一化,。然后,我們使用 2. 構(gòu)建模型接下來,我們需要構(gòu)建一個循環(huán)神經(jīng)網(wǎng)絡(luò)LSTM模型,。在這里,,我們將使用pytorch內(nèi)置的nn.LSTM模塊來實(shí)現(xiàn)。 專欄 深度學(xué)習(xí)PyTorch極簡入門 作者:人工智能技術(shù)分享AI 19.9幣 328人已購 查看 import torch.nn as nn class LSTM(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim): super(LSTM, self).__init__() # 輸入維度 self.input_dim = input_dim # 隱藏層維度 self.hidden_dim = hidden_dim # LSTM層數(shù) self.layer_dim = layer_dim # LSTM self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) # 輸出層 self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): # 初始化隱藏狀態(tài)和單元狀態(tài) h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() # 前向傳播 out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach())) # 取最后一個時(shí)間步的輸出 out = self.fc(out[:, -1, :]) return out 在這段代碼中,,我們定義了一個LSTM類,,它繼承自nn.Module類,重寫了__init__和forward方法,。在__init__方法中,,我們定義了LSTM的輸入維度、隱藏層維度,、LSTM層數(shù)和輸出維度,,并使用nn.LSTM模塊構(gòu)建了LSTM層和輸出層。在forward方法中,,我們首先初始化了隱藏狀態(tài)和單元狀態(tài),,然后將輸入x傳入LSTM層,得到輸出out和最后一個時(shí)間步的隱藏狀態(tài)和單元狀態(tài)hn和cn,,最后將out傳入輸出層得到預(yù)測結(jié)果,。 3. 訓(xùn)練模型接下來,我們需要訓(xùn)練我們的模型,。在這里,,我們將使用交叉熵?fù)p失函數(shù)和隨機(jī)梯度下降優(yōu)化器。 ```python # 定義模型,、損失函數(shù)和優(yōu)化器 input_dim = 28 hidden_dim = 100 layer_dim = 1 output_dim = 10 model = LSTM(input_dim, hidden_dim, layer_dim, output_dim) criterion = nn.CrossEntropyLoss() learning_rate = 0.1 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 訓(xùn)練模型 num_epochs = 5 for epoch in range(num_epochs): for i, (images, labels) in enumerate(trainloader): # 將數(shù)據(jù)加載到GPU上 images = images.view(-1, 28, 28).requires_grad_().cuda() labels = labels.cuda() # 前向傳播 outputs = model(images) # 計(jì)算損失 loss = criterion(outputs, labels) # 反向傳播和優(yōu)化 optimizer.zero_grad() loss.backward() optimizer.step() # 每100個batch輸出一次損失 if (i+1) % 100 == 0: print('Epoch [{}/{}], Batch [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, len(trainloader), loss.item())) ``` 在這段代碼中,,我們首先定義了模型、損失函數(shù)和優(yōu)化器,。然后,,我們使用for循環(huán)和enumerate函數(shù)遍歷訓(xùn)練集中的每個batch,將數(shù)據(jù)加載到GPU上,,進(jìn)行前向傳播,,計(jì)算損失,進(jìn)行反向傳播和優(yōu)化,。最后,我們每100個batch輸出一次損失,。 4. 測試模型 最后,,我們需要測試我們的模型。在這里,,我們將使用測試集來評估模型的性能,。 ```python # 測試模型 correct = 0 total = 0 with torch.no_grad(): for images, labels in testloader: # 將數(shù)據(jù)加載到GPU上 images = images.view(-1, 28, 28).cuda() labels = labels.cuda() # 前向傳播 outputs = model(images) # 取預(yù)測結(jié)果中最大值的索引作為預(yù)測標(biāo)簽 _, predicted = torch.max(outputs.data, 1) # 統(tǒng)計(jì)正確預(yù)測的數(shù)量和總數(shù)量 total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) ``` 在這段代碼中,,我們首先定義了correct和total變量,用于統(tǒng)計(jì)正確預(yù)測的數(shù)量和總數(shù)量,。然后,,我們使用with torch.no_grad()語句禁用梯度計(jì)算,遍歷測試集中的每個樣本,,進(jìn)行前向傳播,,取預(yù)測結(jié)果中最大值的索引作為預(yù)測標(biāo)簽,統(tǒng)計(jì)正確預(yù)測的數(shù)量和總數(shù)量,。最后,,我們輸出模型在測試集上的準(zhǔn)確率。 |
|