python卷积层的实现方式1

                                                低效率实现卷积操作1

 

卷积核尺寸最好为奇数 3*3 、5*5 ,实际应用中大部分情况下卷积核的尺寸也一般都是奇数

#定义2D卷积函数
#此处需要非常注意的是 input_2Ddata是padding后的数据,而in_size是没有padding之前的图像的大小
def  conv2D(input_2Ddata,kern,in_size,out_size,stride_h=1,stride_w=1):

    kernel_size_h,kernel_size_w = kern.shape[0:2]
    (h1,w1)=in_size
    (h2,w2)=out_size
    out_2Ddata=np.zeros(shape=out_size)

    for i2,i1 in zip(range(h2),range(0,h1,stride_h)):
        for j2, j1 in zip(range(w2), range(0, w1, stride_w)):
            window=input_2Ddata[i1:i1+kernel_size_h,j1:j1+kernel_size_w]
            out_2Ddata[i2,j2]=np.sum(kern*window)
    return  out_2Ddata
h1=32 #输入高度
w1=48 #输入宽度
d1=12 #输入深度

input_3Ddata=np.random.randn(h1,w1,d1)

#超参数
S=2 #步长 S 最常用1 偶尔用2
F=3 #卷积核尺寸
d2=24 #输出数据深度

P=(F-1)//2
h2=(h1-F+2*P)//S+1   #计算输出尺寸的两个公式
w2=(w1-F+2*P)//S+1

padding=np.zeros(shape=(h1+2*P,w1+2*P,d1))
padding[P:-P,P:-P]=input_3Ddata

output_3Ddata=np.zeros(shape=(h2,w2,d2))

kerns=np.random.randn(d2,F,F,d1) #    卷积核的尺寸需要额外注意 4D卷积核
bias =np.random.randn(d2) #1D 偏执 每个卷积核生成的特征维增加同一个偏执--即一个数


#对d2个卷积核计算卷积  d2个卷积核代表卷积出的数据最后的维度是d2也就是d2个特征,就像RGB图像有三个特征维一样
for m in range(d2):
    for k in range(d1): #数据数据的每一个维度
        input_2Ddata=padding[:,:,k]
        kern=kerns[m,:,:,k]
        output_3Ddata[:,:,m] += conv2D(input_2Ddata,kern,in_size(h1,w1),out_size=(h2,w2),stride_h=S,stride_w=S)
    output_3Ddata[:,:,m]+=bias[m]

 

### 卷积层Python深度学习框架中的实现 #### TensorFlow 中的卷积层 在 TensorFlow 中,可以通过 `tf.keras.layers.Conv2D` 来创建二维卷积层。该函数允许指定滤波器数量、核大小、步幅和其他超参数。以下是其主要参数说明: - **filters**: 表示输出空间的维度,即卷积核的数量。 - **kernel_size**: 定义卷积窗口的高度和宽度。 - **strides**: 指定卷积沿高度和宽度方向移动的步长。 - **padding**: 可选 `"valid"` 或 `"same"`,分别表示无填充或保持输入尺寸不变。 下面是一个简单的例子展示如何在 TensorFlow 中定义并使用卷积层[^1]: ```python import tensorflow as tf # 创建一个顺序模型 model = tf.keras.Sequential() # 添加一个卷积层 model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu', input_shape=(28, 28, 1))) ``` 上述代码片段展示了如何向模型中添加一个具有 ReLU 激活函数的卷积层。 --- #### PyTorch 中的卷积层 在 PyTorch 中,可以使用 `torch.nn.Conv2d` 类来定义二维卷积层。它的核心参数如下: - **in_channels**: 输入通道数。 - **out_channels**: 输出通道数(等于卷积核数量)。 - **kernel_size**: 卷积核的大小。 - **stride**: 步幅,默认为 `(1, 1)`。 - **padding**: 填充方式,默认为 `0`。 以下是一段演示如何在 PyTorch 中定义卷积层的代码[^2]: ```python import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() # 定义一个卷积层 self.conv_layer = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1) def forward(self, x): x = self.conv_layer(x) x = torch.relu(x) # 使用ReLU激活函数 return x # 实例化模型 model = SimpleCNN() input_tensor = torch.randn(1, 1, 28, 28) # 构造随机输入张量 output = model(input_tensor) print(output.shape) # 打印输出形状 ``` 此代码实现了带有单个卷积层的小型 CNN,并通过前向传播验证了其行为。 --- #### 关键区别对比 尽管两者都能高效地实现卷积操作,但在设计哲学上有一定差异。TensorFlow 更加注重模块化的高层抽象接口,而 PyTorch 则强调灵活性和动态图机制。因此,在实际项目中可以根据具体需求选择合适的工具[^5]。 --- #### 总结 无论是 TensorFlow 还是 PyTorch,都提供了强大的 API 支持开发者快速搭建包含卷积层在内的复杂神经网络架构。熟悉这些基础组件及其配置选项有助于更深入地探索深度学习技术的应用潜力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值