Pytorch的使用和resnet模型
时间: 2023-12-02 17:05:47 浏览: 144
Pyorch是一个开源的机器学习框架,具有易于使用的高级API和构建深度神经网络的灵活低级API。要使用PyTorch,您需要安装PyTorch库并使用Python编写代码。以下是一个简单的PyTorch示例,它构建了一个具有三个全连接层的神经网络,并使用MSE损失函数和Adam优化器进行训练:
```python
import torch
import torch.nn as nn
import torch.optim as optim
# 定义神经网络类
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 20)
self.fc2 = nn.Linear(20, 30)
self.fc3 = nn.Linear(30, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# 训练网络
net = Net()
loss_fn = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
for i in range(1000):
x = torch.randn(10, 10)
y = torch.randn(10, 1)
optimizer.zero_grad()
output = net(x)
loss = loss_fn(output, y)
loss.backward()
optimizer.step()
```
ResNet是一种深度卷积神经网络,由微软研究院的Kaiming He等人在2015年提出。ResNet的主要亮点是它使用了残差块来解决深度神经网络中的梯度消失问题。残差块允许信息直接跳过一些层,从而使网络更容易优化。以下是一个简单的ResNet示例,它使用PyTorch实现了一个包含两个残差块的小型ResNet模型:
```python
import torch
import torch.nn as nn
# 定义残差块类
class ResBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super(ResBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.shortcut = nn.Sequential()
if stride != 1 or in_channels != out_channels:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(out_channels)
)
def forward(self, x):
out = torch.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x)
out = torch.relu(out)
return out
# 定义ResNet类
class ResNet(nn.Module):
def __init__(self):
super(ResNet, self).__init__()
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(64)
self.layer1 = nn.Sequential(
ResBlock(64, 64),
ResBlock(64, 64)
)
self.layer2 = nn.Sequential(
ResBlock(64, 128, stride=2),
ResBlock(128, 128)
)
self.layer3 = nn.Sequential(
ResBlock(128, 256, stride=2),
ResBlock(256, 256)
)
self.layer4 = nn.Sequential(
ResBlock(256, 512, stride=2),
ResBlock(512, 512)
)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512, 10)
def forward(self, x):
out = torch.relu(self.bn1(self.conv1(x)))
out = self.layer1(out)
out = self.layer2(out)
out = self.layer3(out)
out = self.layer4(out)
out = self.avgpool(out)
out = out.view(out.size(0), -1)
out = self.fc(out)
return out
# 训练ResNet
net = ResNet()
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)
for i in range(100):
x = torch.randn(32, 3, 32, 32)
y = torch.randint(0, 10, (32,))
optimizer.zero_grad()
output = net(x)
loss = loss_fn(output, y)
loss.backward()
optimizer.step()
```
阅读全文