卷积神经网络 10.30

该博客介绍了如何使用PyTorch构建一个简单的卷积神经网络(CNN),包括定义网络结构、前向传播、计算损失以及反向传播的过程。示例代码展示了从输入张量到输出张量的计算,并通过MSELoss计算损失值。最后,博客还演示了如何使用SGD优化器进行参数更新。
摘要由CSDN通过智能技术生成
from numpy.core.fromnumeric import size
import torch
import torch.nn as nn
import torch.nn.functional as F

#定义网络类
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        #定义第一层卷积层,输入维度=1,输出维度=6,卷积核大小3*3
        self.conv1=nn.Conv2d(1,6,3)
        #定义第二层卷积层,输入维度=6,输出维度=16,卷积核大小3*3
        self.conv2=nn.Conv2d(6,16,3)
        #定义三层全连接神经网络
        self.fc1= nn.Linear(16*6*6,120)
        self.fc2= nn.Linear(120,84)
        self.fc3= nn.Linear(84,10)

    def forward(self,x):
        #注意:任意卷积层后面要加激活层,池化层
        x= F.max_pool2d(F.relu(self.conv1(x)),(2,2))
        x= F.max_pool2d(F.relu(self.conv2(x),2))
        #经过卷积层的处理后,张量要进入全连接层,进入前调整张量的形状
        x= x.view(-1,self.num_flat_features(x))
        x= F.relu(self.fc1(x))
        x= F.relu(self.fc2(x))
        x= self.fc3(x)
        return x
    
    def num_flat_features(self,x):
        size=x.size()[1:]
        num_features =1
        for s in size:
            num_features *=s
        return num_features

net=Net()
print(net)

模型中所有可以训练的参数,可以通过net.parameters()获得

params = list(net.parameters()) 封装到列表
print(len(params)) 列表长度
print(params[0].size()) 第一个

加入张量

input= torch.randn(1,1,32,32)
out= net(input)
print(out)
print(out.size())

输出

10
torch.Size([6, 1, 3, 3])
tensor([[-0.0725,  0.0692, -0.1377, -0.0815,  0.0373, -0.0200, -0.0445,  0.0495,
         -0.0096, -0.0895]], grad_fn=<AddmmBackward>)
torch.Size([1, 10])

应用nn.MSELoss计算损失值

target=torch.randn(10)
target=target.view(1,-1)
criterion=nn.MSELoss()

loss= criterion(out,target)
print(loss)

当调用loss.backward(),整张图将对loss自动求导

print(loss.grad_fn)
print(loss.grad_fn.next_functions[0][0])
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])
#pytorch中首先要执行梯度清零的操作
net.zero_grad()

print('conv1.bias.grad before backward.')
print(net.conv1.bias.grad)

#在pytorch中实现一次反向传播
loss.backward()

print('conv1.bias.grad after backward.')
print(net.conv1.bias.grad)
# 第一步导入优化器包
import torch.optim as optim

# 构建优化器
optimizer=optim.SGD(net.parameters(),lr=0.01)

# 第二步将优化器梯度清零
optimizer.zero_grad()

#第三步执行网络计算并计算损失值
output=net(input)
loss=criterion(output,target)

#第四步执行反向传播
loss.backward()

#第五步更新参数
optimizer.step()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值