PyTorch构建DNN算例
时间: 2023-12-02 15:05:25 浏览: 79
好的,下面我将为您提供一个基于PyTorch构建DNN的算例。
首先,我们需要导入必要的库:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
```
接下来,我们可以定义一个简单的DNN模型:
```python
class SimpleDNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleDNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
```
在这个模型中,我们定义了一个包含两个全连接层的简单DNN。输入层的大小为input_size,输出层的大小为output_size,中间层的大小为hidden_size。在forward函数中,我们首先使用ReLU激活函数对第一个全连接层的结果进行处理,然后将结果传递给第二个全连接层。
接下来,我们可以定义训练模型所需的超参数:
```python
input_size = 784
hidden_size = 128
output_size = 10
learning_rate = 0.001
num_epochs = 10
```
在这个例子中,我们使用MNIST数据集进行训练,输入层大小为784(即28x28的图像),输出层大小为10(对应着10个数字)。我们使用128个隐藏节点,并且设置学习率为0.001,训练轮数为10。
接下来,我们可以加载MNIST数据集:
```python
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)
```
在这里,我们使用了torchvision库中的MNIST数据集,并将数据集转换为张量形式。我们使用DataLoader来加载数据集,并且设置batch_size为100,shuffle为True(在训练过程中打乱数据集)。
接下来,我们可以定义优化器和损失函数:
```python
model = SimpleDNN(input_size, hidden_size, output_size)
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
criterion = nn.CrossEntropyLoss()
```
在这里,我们使用Adam优化器,并且使用交叉熵损失函数。
最后,我们可以开始训练模型:
```python
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
images = images.reshape(-1, 28*28)
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_loader), loss.item()))
```
在每个epoch的循环中,我们使用train_loader中的数据进行训练。首先,我们将图像转换为大小为784的向量,并将其传递给模型进行前向计算。然后,我们计算模型的损失,并使用反向传播算法计算梯度。最后,我们使用优化器来更新模型的参数。
在训练过程中,我们使用了if语句来每100个batch输出一次训练状态。
最后,我们可以使用测试集来测试模型的准确率:
```python
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
images = images.reshape(-1, 28*28)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
```
在这里,我们使用了torch.no_grad()来关闭梯度计算,然后使用测试集来测试模型的准确率。我们首先将图像转换为大小为784的向量,并将其传递给模型进行前向计算。然后,我们使用torch.max()函数来找到输出的最大值,并将其与标签进行比较,以计算正确分类的数量。最后,我们输出测试集上的准确率。
这就是一个简单的基于PyTorch构建DNN的算例。
阅读全文