使用torch实现神经网络的一些结构


有时间会长期更新,主要是练一练自己的代码


前言

在学习深度学习 用于目标检测领域当中很多时候需要自己去修改代码而不是仅仅Git别人的repository,经过这么长时间来自己几乎都是对着书本或者网上的一些资源来敲代码,因此迫切的想独立的写一些经典的结构,因此这篇文章来了。

一、空间池化(自定义)

class spatial_pool(nn.Module):
    def __init__(self,kernel_size,stride):
        super(spatial_pool, self).__init__()
        self.maxpool_1 = nn.MaxPool2d(kernel_size[0],stride[0],padding=kernel_size[0]//2)
        self.maxpool_2 = nn.MaxPool2d(kernel_size[1],stride[1],padding=kernel_size[1]//2)
        self.avgpool_1 = nn.AvgPool2d(kernel_size[2],stride[2],padding=kernel_size[2]//2)

    def forward(self,x):
        y_1 = self.maxpool_1(x)
        y_2 = self.maxpool_2(x)
        y_3 = self.avgpool_1(x)
        print(torch.add(torch.add(y_1,y_2),y_3).shape)
        y_2 = torch.cat([y_1,y_2],dim=1)
        print(y_2.shape)
        return torch.cat([y_2,y_3],dim=1)

# img = torch.FloatTensor(1,32,64,64)
# pool = spatial_pool((3,5,3),(1,1,1))
# print(pool(img).shape)

二、残差学习block

class residual_learning(nn.Module):
    def __init__(self,input_dim,hidden_dim,output_dim,kernel_size,strdie):
        super(residual_learning, self).__init__()
        self.conv1 = nn.Conv2d(input_dim,hidden_dim,kernel_size[0],strdie[0],padding=kernel_size[0]//2)
        self.bn1 = nn.BatchNorm2d(hidden_dim)
        self.conv2 = nn.Conv2d(hidden_dim,output_dim,kernel_size[1],strdie[1],padding=kernel_size[1]//2)
        self.bn2 = nn.BatchNorm2d(output_dim)
        self.relu = nn.ReLU()

    def forward(self,x):
        y = self.conv1(x)
        y = self.bn1(y)
        y = self.conv2(y)
        y = self.bn2(y)
        return torch.add(x,y)

# img = torch.FloatTensor(1,32,64,64)
# residual = residual_learning(32,64,32,[3,3],[1,1])
# print(residual(img).shape)

三、FPN

class fpn(nn.Module):
    def __init__(self,input_dim,hidden_1,hidden_2,output_dim):
        super(fpn, self).__init__()
        self.conv1 = nn.Conv2d(input_dim,hidden_1,kernel_size=3,stride=2,padding=1)
        self.conv2 = nn.Conv2d(hidden_1,hidden_2,kernel_size=3,stride=2,padding=1)
        self.conv3 = nn.Conv2d(hidden_2,output_dim,kernel_size=3,stride=2,padding=1)
        self.upsampel = nn.Upsample(scale_factor=2,mode='nearest')
        self.relu = nn.ReLU()
        self.bn1 = nn.BatchNorm2d(hidden_1)
        self.bn2 = nn.BatchNorm2d(hidden_2)
        self.bn3 = nn.BatchNorm2d(output_dim)
        self.conv1x1_1 = nn.Conv2d(hidden_2,output_dim,kernel_size=1,stride=1)
        self.conv1x1_2 = nn.Conv2d(hidden_1,output_dim,kernel_size=1,stride=1)


    def forward(self,x):
        y_1 = [None for i in range(3)]
        y_1[0] = self.relu(self.bn1(self.conv1(x)))
        y_1[1] = self.relu(self.bn2(self.conv2(y_1[0])))
        y_1[2] = self.relu(self.bn3(self.conv3(y_1[1])))
        y_2 = [None for i in range(3)]
        y_2[0] = y_1[2]
        y_2[1] = torch.add(self.conv1x1_1(y_1[1]),self.upsampel(y_2[0]))
        y_2[2] = torch.add(self.conv1x1_2(y_1[0]),self.upsampel(y_2[1]))
        return y_2

img = torch.FloatTensor(1,32,64,64)
f = fpn(32,32,64,64)
result = f(img)
print(result[0].shape,result[1].shape,result[2].shape)

总结

学无止境,希望通过博客将自己的一步步脚印记录下来,加油学习人!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 PyTorch 实现神经网络的一般步骤如下: 1. 定义模型结构使用 `torch.nn` 模块的类定义神经网络结构,例如 `nn.Linear` 定义全连接层,`nn.Conv2d` 定义卷积层,`nn.ReLU` 定义激活函数等等。 2. 定义损失函数:使用 `torch.nn` 模块的类定义损失函数,例如 `nn.MSELoss` 定义均方误差损失函数,`nn.CrossEntropyLoss` 定义交叉熵损失函数等等。 3. 定义优化器:使用 `torch.optim` 模块定义优化器,例如 `optim.SGD` 定义随机梯度下降优化器,`optim.Adam` 定义 Adam 优化器等等。 4. 训练模型:将输入数据传入模型,计算损失并反向传播,更新模型参数。 5. 测试模型:将测试数据传入模型,计算输出结果并评估模型性能。 下面是一个简单的例子,演示如何使用 PyTorch 实现一个全连接神经网络: ```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(784, 512) self.fc2 = nn.Linear(512, 256) self.fc3 = nn.Linear(256, 10) def forward(self, x): x = x.view(-1, 784) x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9) for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(trainloader))) correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy: %.2f %%' % (100 * correct / total)) ``` 在这个例子,我们定义了一个包含三个全连接层的神经网络,并使用交叉熵损失函数和随机梯度下降优化器进行训练。在每个 epoch 结束时,我们输出当前的损失值,最后评估模型的性能并输出准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值