CNN的输入输出运算过程及其Pytorch实现

0. 卷积神经网络的结构

在这里插入图片描述如上图所示,一个卷积神经网络由若干卷积层、池化层、全连接层组成。我们可以通过对其中要素的重组来构成不同的卷积神经网络。构成不同卷积神经网络的公式为:
I N P U T − > [ [ C O N V ] ∗ N − > P O O L ? ] ∗ M − > [ F C ] ∗ K INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K INPUT>[[CONV]N>POOL?]M>[FC]K
以上图为例,其结构为:
I N P U T − > [ [ C O N V ] ∗ 1 − > P O O L ] ∗ 2 − > [ F C ] ∗ 1 INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*1 INPUT>[[CONV]1>POOL]2>[FC]1

1. 卷积神经网络的工作原理

卷积神经网络用于图像处理比较多,但在处理图像的时候也是将其放在数字张量中进行处理,所以CNN也可直接用于处理数据。关于图像的处理过程可以参考零基础入门深度学习(4) - 卷积神经网络,更加直观的可以参考李宏毅深度学习笔记(十一)CNN(卷积神经网络)

我们着重说一下对数据的处理,拿使用CNN实现C-MAPSS数据集里面的剩余寿命预测(Pytorch)这篇博文中的数据集来举例,它有25个特征,我们取它的第一条训练轨迹(长度为192)构成的一个张量(192,25),然后用一个大小为50的滑动窗口进行取值操作,最后这个张量变成了(142,50,25),可以看作142张大小为(50,25)的单通道图片。如果设计一个卷积神经网络结构为:
I N P U T − > C O N V − > P O O L − > F C INPUT -> CONV->POOL->FC INPUT>CONV>POOL>FC
且其中:

				in_channels=1,  # 输入卷积层的图片通道数
                out_channels=20,  # 输出的通道数
                kernelSize=3,  # 卷积核的大小,长宽相等,3*3
                stride=1,  # 滑动步长为1
                padding=2  # 在输入张量周围补的边
                poolKernelSize=2 # 池化层的filters的大小2*2

在给CNN输入的时候要将(142,50,25)一个一个输入,即每次输入(1,50,25),输入142次,如果在Pytorch里面选用Conv2d就得先将(142,50,25)变为(142,1,50,25),这里的1代表它是单通道,然后在一个一个输入(1,1,50,25),经过如上所设计的CNN之后就会变成(1,1,26,13)。计算方法如下:
W 0 W_0 W0 H 0 H_0 H0代表输入的宽度和高度, W 1 W_1 W1 H 1 H_1 H1代表输出的宽度和高度,则
W 1 = ( ( W 0 − k e r n e l S i z e + 2 ∗ p a d d i n g ) / s t r i d e + 1 ) / p o o l K e r n e l S i z e W_1=((W_0-kernelSize+2*padding)/stride+1)/poolKernelSize W1=((W0kernelSize+2padding)/stride+1)/poolKernelSize
= ( ( 50 − 3 + 2 ∗ 2 ) / 1 + 1 ) / 2 = 26 =((50-3+2*2)/1+1)/2=26 =((503+22)/1+1)/2=26

H 1 = ( ( H 0 − k e r n e l S i z e + 2 ∗ p a d d i n g ) / s t r i d e + 1 ) / p o o l K e r n e l S i z e H_1=((H_0-kernelSize+2*padding)/stride+1)/poolKernelSize H1=((H0kernelSize+2padding)/stride+1)/poolKernelSize
= ( ( 25 − 3 + 2 ∗ 2 ) / 1 + 1 ) / 2 = 13 =((25-3+2*2)/1+1)/2=13 =((253+22)/1+1)/2=13
即输入(1,1,50,25),输出(1,20,26,13),其中1—>20是通道数的变化。

但是不管是要进行分类任务还是回归任务,我们需要的输出都不会是这种四维的形式(1,20,26,13),所以要加一个全连接层,使得输出为我们想要的形式,在全连接层之前还要进行flatten操作,将(1,20,26,13)转化成(202613,1),这样全连接层的输入为(202613,1),输出为(1,1),当然也可以设为其他形式。

2.Pytorch实现

还是拿使用CNN实现C-MAPSS数据集里面的剩余寿命预测(Pytorch)来说:

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            torch.nn.Conv2d(  # 输入conv1的形状(50, 1, 50, 25)-->输出conv1的形状(50, 20, 26, 13)
                in_channels=1,  # 输入卷积层的图片通道数
                out_channels=20,  # 输出的通道数
                kernel_size=3,  # 卷积核的大小,长宽相等
                stride=1,  # 滑动步长为1
                padding=2  # 给输入矩阵周围添两圈0,这样的话在卷积核为3*3时能将输入矩阵的所有元素考虑进去
            ),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)
        )
        self.fc = nn.Linear(20*26*13, 1)  # 将conv1的输出flatten后为(50, 20*26*13)-->经过全连接变为(50, 1)

    def forward(self, x):
        x = self.conv1(x)
        x = x.view(x.size(0), -1)  # 将conv1的输出flatten
        # x, _ = self.lstm2(x)
        x = self.fc(x)
        return x

在将数据进行预处理之后变成(142,1,50,25),再一个一个投入上面的CNN中,输出就会变成一维的。

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,我可以帮您实现这个要求。但是需要提醒您的是,由于这个问题比较具体,需要使用到一些深度学习框架(如TensorFlow、PyTorch等),实现起来可能比较复杂,需要一定的编程基础。以下是一份大致思路的代码示例,仅供参考: ```python import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 生成正弦函数的函数 x = np.linspace(-np.pi, np.pi, 100) y = np.sin(x) # 构建CNN模型 model = tf.keras.Sequential([ tf.keras.layers.Reshape((100, 1), input_shape=(100,)), tf.keras.layers.Conv1D(32, 3, activation='relu'), tf.keras.layers.MaxPooling1D(2), tf.keras.layers.Conv1D(64, 3, activation='relu'), tf.keras.layers.MaxPooling1D(2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(1, activation='linear') ]) # 编译模型 model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(x, y, epochs=100, verbose=0) # 使用模型进行预测 y_pred = model.predict(x) # 绘制图像 plt.subplot(2, 1, 1) plt.plot(x, y, 'g-', label='Target') plt.plot(x, y_pred, 'r--', label='Prediction') plt.legend() plt.subplot(2, 1, 2) plt.plot(model.history.history['loss'], 'b-') plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() ``` 在这个代码中,我们首先生成了一个正弦函数的函数,并且使用了TensorFlow框架构建了一个简单的CNN模型。然后,我们使用这个模型对生成的正弦函数进行了训练,并绘制了训练过程中的损失曲线和预测结果。由于这个问题比较复杂,代码可能存在不足之处,仅供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

comli_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值