• 一个简单的卷积神经网络


    一、图像成像原理

    区域经过透镜,形成了一个锥型区域,该光线被光敏电阻所感知。多个光敏电阻并列即可呈现图像。一个光敏电阻一个像素,如下就可形成2像素的图片。

    对彩色图像而言,需对传感器器件进行改进,如绿色、红色、蓝色的传感器合成一组,最终像素值来自于三种不同的光敏器件。

    二、卷积

     单通道进行卷积

     

    多通道进行卷积,以3通道为例

     

     

     

    卷积核的输入通道数、输出通道数、宽度和高度,确定了一个卷积核。

    其中:输出通道数:等于卷积核的个数;输入通过数:等于上一层的通道数。

     

    代码示例:

    import torch
    in_chanels,outchuaels=
    5,10
    width,height=100,100
    kernel_size=3
    batch_size=1
    #batch1 小批量第几个,输入通道为5,宽和高为100*100的图片
    input=torch.randn(batch_size,in_chanels,width,height)
    conv_layer=torch.nn.Conv2d(in_chanels,outchuaels,
    kernel_size=kernel_size)
    output=conv_layer(input)

    print(input.shape)
    print(output.shape)
    print(conv_layer.weight.shape)

    输出:torch.Size([1, 5, 100, 100])

    torch.Size([1, 10, 98, 98])

    torch.Size([10, 5, 3, 3])

    1为样本数量,卷积核:输出通道为10,输入通道为5,大小为3*3

    三、padding

    外围按0进行填充

     

    代码实现:

    input=[3,4,6,5,7,
    
           2,4,6,8,2,
    
           1,6,7,8,4,
    
           9,7,4,6,2,
    
           3,7,5,4,1]
    
    #转化成(B,C,W,H),批量维度,通道,宽,高
    
    input=torch.Tensor(input).view(1,1,5,5)
    
    conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,padding=1,bias=False)
    
    kennel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
    
    conv_layer.weight.data=kennel.data
    
    
    
    output=conv_layer(input)
    
    print(output)
    

    四、最大池化层

     

    • 一个简单的卷积神经网络

     

    样本数量、通道数、宽度、高度确立了一个卷积层。
    (batch,20,4,4)展开为1为一行,进行变换得到10*1的结果。
     利用卷积神经网络做手写数字的识别:

     

    import torch
    
    from torchvision import transforms
    
    from torchvision import datasets
    
    from torch.utils.data import  DataLoader
    
    import torch.nn.functional as F
    
    import torch.optim as optim
    
    
    
    batch_size=64
    
    #利用transforms 转换为tensor 类型的图片,
    
    transform =transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))
    
                                   ])
    
    train_dataset=datasets.MNIST(root='../data/mnist',train=True,download=True,transform=transform)
    
    train_loader= DataLoader(train_dataset,shuffle=True,batch_size=batch_size)
    
    
    
    
    
    test_dataset=datasets.MNIST(root='../data/mnist',train=False,download=True,transform=transform)
    
    test_loader=DataLoader(train_dataset,shuffle=False,batch_size=batch_size)
    
    
    
    
    
    class Net(torch.nn.Module):
    
        def __init__(self):
    
            super(Net,self).__init__()
    
            self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)
    
            self.conv2=torch.nn.Conv2d(10,20,kernel_size=5)
    
            self.pooling=torch.nn.MaxPool2d(20)
    
            self.fc=torch.nn.Linear(320,10)
    
        def forward(self,x):
    
            batch_size=x.size(0)
    
            x=F.relu(self.pooling(self.conv1(x)))
    
            x=F.relu(self.pooling(self.conv2(x)))
    
            x=x.view(batch_size,-1#变成全连接网络需要的输入
    
            x=self.fc(x)
    
            return  x
    
    
    
    model=Net()
    
    crierion=torch.nn.CrossEntropyLoss()
    
    optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
    
    
    
    def train(epoch):
    
        running_loss=0.0
    
        for batch_idx,data in enumerate(train_loader,0):
    
            inputs,target=data
    
            optimizer.zero_grad()
    
            #forward +backward+update
    
            outputs=model(inputs)
    
            loss=crierion(outputs,target)
    
            loss.backward()
    
            optimizer.step()
    
            running_loss+=loss.item()
    
            if batch_idx%300==299:
    
                print('[%d,%5d] loss:%.3f' %(epoch+1,batch_idx+1,running_loss/300))
    
                running_loss==0.0
    
    
    
    def test():
    
        correct=0
    
        total=0
    
        with torch.no_grad():
    
            for data in test_loader:
    
                images,labels=data
    
                outputs=model(images)
    
                _,predicted=torch.max(outputs.data,dim=1)
    
                total+=labels.size(0)
    
                correct+=(predicted==labels).sum().item()
    
        print('Accuacy on test set%d %%'%(100*correct/total))
    
    
    
    
    
    if __name__=='__main__':
    
        for epoch in range(10):
    
            train(epoch)
    
            test()
    
                    
  • 相关阅读:
    Vue v-model收集表单数据
    linux 开通指定端口号解决telnet不通的问题
    一文读懂 Spring Bean 的生命周期
    pprof - 在现网场景怎么用
    【Pyqt5】windows和linux安装Pyqt5+designer
    BUUCTF msic 专题(128)[ACTF新生赛2020]剑龙
    20221130 RabbitMQ
    【序列化与反序列化】关于序列化与反序列化MessagePack的实践
    为什么说PMP+软考“1+1>2”?
    嵌入式属于人工智能吗?
  • 原文地址:https://blog.csdn.net/axiaoquan/article/details/127659732