import torch from torch.autograd import Variable from sklearn import datasets from torch import nn digits = datasets.load_digits() X = digits.images y = digits.target X_train = X[:1700, :, :] Y_train = y[:1700] X_test = X[1700:, :, :] y_test = y[1700:] X_train = torch.Tensor(X_train).unsqueeze(0).unsqueeze(0).view(-1, 1, 8, 8) Y_train = torch.Tensor(Y_train).long() X_test = torch.Tensor(X_test).unsqueeze(0).unsqueeze(0).view(-1, 1, 8, 8) y_test = torch.Tensor(y_test).long() def conv3x3(in_channels, out_channels, stride=1): return nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) # Residual block class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1, downsample=None): super(ResidualBlock, self).__init__() self.conv1 = conv3x3(in_channels, out_channels, stride) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = conv3x3(out_channels, out_channels) self.bn2 = nn.BatchNorm2d(out_channels) self.downsample = downsample def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) if self.downsample: residual = self.downsample(x) out += residual out = self.relu(out) return out # ResNet class ResNet(nn.Module): def __init__(self, block, layers, num_classes=10): super(ResNet, self).__init__() self.in_channels = 16 self.conv = conv3x3(1, 16) self.bn = nn.BatchNorm2d(16) self.relu = nn.ReLU(inplace=True) self.layer1 = self.make_layer(block, 16, layers[0]) self.layer2 = self.make_layer(block, 32, layers[1], 2) self.layer3 = self.make_layer(block, 64, layers[2], 2) self.avg_pool = nn.AvgPool2d(8) self.fc = nn.Linear(64, num_classes) def make_layer(self, block, out_channels, blocks, stride=1): downsample = None if (stride != 1) or (self.in_channels != out_channels): downsample = nn.Sequential( conv3x3(self.in_channels, out_channels, stride=stride), nn.BatchNorm2d(out_channels)) layers = [] layers.append(block(self.in_channels, out_channels, stride, downsample)) self.in_channels = out_channels for i in range(1, blocks): layers.append(block(out_channels, out_channels)) return nn.Sequential(*layers) def forward(self, x): out = self.conv(x) out = self.bn(out) out = self.relu(out) out = self.layer1(out) out = self.layer2(out) out = self.layer3(out) out = self.avg_pool(out) out = out.view(out.size(0), -1) out = self.fc(out) return out model = ResNet(ResidualBlock, [2, 2, 2]) loss_func = torch.nn.CrossEntropyLoss() opt = torch.optim.Adam(model.parameters(), lr=0.001) loss_count = [] for epoch in range(1): for i in range(500): batch_x = Variable(X_train, requires_grad=True) # torch.Size([128, 1, 28, 28]) batch_y = Variable(Y_train).view(-1) # torch.Size([128]) out = model(batch_x) # torch.Size([128,10]) # 获取损失 loss = loss_func(out, batch_y) # 使用优化器优化损失 opt.zero_grad() # 清空上一步残余更新参数值 loss.backward() # 误差反向传播,计算参数更新值 opt.step() # 将参数更新值施加到net的parmeters上 loss_count.append(loss) print('{}:\t'.format(i), loss.item()) torch.save(model, r'C:\Users\Administrator\PycharmProjects\data\cnn')
残差神经网络训练sklearn手写体数据集(pytorch)
最新推荐文章于 2025-06-24 17:22:17 发布