Pytorch实现简单的CNN网络

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np

class SimpleCNN(torch.nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__() # b, 3, 32, 32
        layer1 = torch.nn.Sequential() 
        layer1.add_module('conv1', torch.nn.Conv2d(3, 32, 3, 1, padding=1))//输入3维,输出32维,输出大小32*32

        #b, 32, 32, 32
        layer1.add_module('relu1', torch.nn.ReLU(True)) 
        layer1.add_module('pool1', torch.nn.MaxPool2d(2, 2)) # b, 32, 16, 16 //池化为16*16
        self.layer1 = layer1

        layer2 = torch.nn.Sequential()
        layer2.add_module('conv2', torch.nn.Conv2d(32, 64, 3, 1, padding=1))
        # b, 64, 16, 16 //处理成64维, 16*16
        layer2.add_module('relu2', torch.nn.ReLU(True))
        layer2.add_module('pool2', torch.nn.MaxPool2d(2, 2)) # b, 64, 8, 8
        self.layer2 = layer2

        layer3 = torch.nn.Sequential()
        layer3.add_module('conv3', torch.nn.Conv2d(64, 128, 3, 1, padding=1))
        #b, 128, 8, 8 //处理成128维,4*4
        layer3.add_module('rellu3', torch.nn.ReLU(True))
        layer3.add_module('pool3', torch.nn.MaxPool2d(2, 2)) #b 128, 4, 4
        self.layer3 = layer3
        //全连接输出
        layer4 = torch.nn.Sequential()
        layer4.add_module('fc1', torch.nn.Linear(2048, 512))
        layer4.add_module('fc_relu1', torch.nn.ReLU(True))
        layer4.add_module('fc2', torch.nn.Linear(512, 64))
        layer4.add_module('fc_relu2', torch.nn.ReLU(True))
        layer4.add_module('fc3', torch.nn.Linear(64, 10))
        self.layer4 = layer4

    def forward(self, x):
        conv1 = self.layer1(x)
        conv2 = self.layer2(conv1)
        conv3 = self.layer3(conv2)
        fc_input = conv3.view(conv3.size(0), -1)
        fc_out = self.layer4(fc_input)
        return fc_out

model = SimpleCNN()

print(model)

运行结果如下

SimpleCNN(
  (layer1): Sequential(
    (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (relu1): ReLU(inplace)
    (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (layer2): Sequential(
    (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (relu2): ReLU(inplace)
    (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (layer3): Sequential(
    (conv3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (rellu3): ReLU(inplace)
    (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (layer4): Sequential(
    (fc1): Linear(in_features=2048, out_features=512, bias=True)
    (fc_relu1): ReLU(inplace)
    (fc2): Linear(in_features=512, out_features=64, bias=True)
    (fc_relu2): ReLU(inplace)
    (fc3): Linear(in_features=64, out_features=10, bias=True)
  )
)

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch一维CNN网络是一种基于PyTorch框架的卷积神经网络模型,用于处理一维的数据,例如时间序列数据或语音信号数据等。一维CNN网络可以有效地学习输入数据的特征,从而实现分类、回归等任务。 一维CNN网络的基本结构包括卷积层、池化层、激活函数和全连接层。其中,卷积层用于提取输入数据的特征,池化层用于减少特征图的维度,激活函数用于增强网络的非线性能力,全连接层用于将特征图转化为输出结果。 在PyTorch中,可以使用nn.Conv1d、nn.MaxPool1d、nn.ReLU和nn.Linear等模块来构建一维CNN网络。以下是一个简单的例子: ```python import torch import torch.nn as nn class OneDCNN(nn.Module): def __init__(self): super(OneDCNN, self).__init__() self.conv1 = nn.Conv1d(in_channels=1, out_channels=16, kernel_size=5, stride=1) self.pool1 = nn.MaxPool1d(kernel_size=2, stride=2) self.conv2 = nn.Conv1d(in_channels=16, out_channels=32, kernel_size=5, stride=1) self.pool2 = nn.MaxPool1d(kernel_size=2, stride=2) self.fc1 = nn.Linear(in_features=32*23, out_features=128) self.fc2 = nn.Linear(in_features=128, out_features=10) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.pool1(x) x = self.conv2(x) x = nn.functional.relu(x) x = self.pool2(x) x = x.view(-1, 32*23) x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) return x ``` 上述代码定义了一个包含两个卷积层和两个全连接层的一维CNN网络。其中,第一个卷积层的输入通道数为1,输出通道数为16,卷积核大小为5,步长为1。第一个池化层的池化核大小为2,步长为2。第二个卷积层的输入通道数为16,输出通道数为32,卷积核大小为5,步长为1。第二个池化层的池化核大小为2,步长为2。第一个全连接层的输入特征数为32*23,输出特征数为128。第二个全连接层的输入特征数为128,输出特征数为10。在forward函数中,输入数据经过卷积、激活、池化、全连接等操作,最终输出分类结果。 需要注意的是,一维CNN网络的输入数据需要是三维张量,即(batch_size, channels, sequence_length),其中batch_size表示批次大小,channels表示通道数,sequence_length表示序列长度。在上述例子中,输入数据的通道数为1,序列长度可以根据实际数据进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值