Tensorflow vs PyTorch —— 卷积神经网络
卷积神经网络在之前的文章中介绍过,这里不再赘述,主要对比一下如何使用 Tensorflow 和 PyTorch 搭建卷积神经网络(CNN)。
1. CNN回顾
以人脸识别问题为例,对于全连接的神经网络,每一个像素与每一个神经元相连,每一个连接都对应一个权重参数 w。我们训练这个神经网络,就相当于我们在寻找每个像素点之间的关系,随着神经网络层数的增加,参数量会爆炸式增长。
对于图片的识别最关键的是寻找局部特征,而不是寻找每个像素之间的关联,需要找到眼睛,鼻子,眼睛和鼻子的关系等等。这个时候卷积神经网络(CNN)就派上用场了,简单而言,CNN通过使用滤波器(Filter)将局部像素的"轮廓"过滤出来。同时,由于使用同一个 Filter 扫描整张图片,并且一个 Filter 的 w 又是固定的,所以相当于共享了这些权重。
局部相关性和权重共享这两个特性使得 CNN 在处理图片的时候非常高效。
一个 filter 有四个维度[input_channel, output_channel, (kernel__h, kernel_w)]
- input_channel: 输入图片的通道数,对于一张彩色图片,通常有 3 个 channel。
- output_channel: 输出图片的通道数。
- kernel_ size: filter 的二维尺寸
除此之外,CNN 计算过程中还涉及到 填充(Padding) , 步长(Stride) 和 池化(Pooling) 等概念,在这里就不展开讨论了。
2. 搭建CNN
与搭建全链接的神经网络类似,可以直接调用 Tensorflow 中的keras.layers.Conv2D()
对象 ,或 PyTorch 中的nn.Conv2d()
对象。注意 Tensorflow 和 PyTorch 存储图片的维度顺序有所不同, Tensorflow 是[b, h, w, c] , PyTorch 为 [b, c, h, w], 其中 b, c, h, w 分别代表 batch_size, channel , height 和 width
我们重点关注二者的区别。
keras.layers.Conv2D()
无需设置 input_channel 大小,然而nn.Conv2d()
input 和 output channel需要手动设置, input_channel 需等于上一层的 output_channelkeras.layers.Conv2D()
中的 filters 参数相当于nn.Conv2d()
的 output_channel 参数。keras.layers.Conv2D()
中 kernel_size 和 strides 参数接收的是元祖,nn.Conv2d()
中的 kernel_size 和 stride 参数接收的是 int。keras.layers.Conv2D()
的 padding 参数只能选择 ‘valid’ 或 ‘same’ , 即没有padding, 或保证输出的图片尺寸不变(stride = 1的情况下)。nn.Conv2d()
则需要手动设置 padding 的多少。
部分代码如下
# ------------------------Tensorflow -----------------------------
class CNN_model(keras.Model):
def __init__(self):
super().__init__()
self.model = keras.Sequential(
[layers.Conv2D(filters=3, kernel_size=(3,3), strides=(1,1),padding="same"),
layers.MaxPool2D(pool_size=(2,2)),
layers.ReLU(),
layers.Conv2D(6,(3,3),(2,2),"same"),
layers.ReLU(),
layers.Flatten(),
layers.Dense(10)]
)
def call(self,x):
x = self.model(x)
return x
# ------------------------PyTorch ---------------------------------
class CNN_NN(nn.Module):
def __init__(self):
super().__init__()
self.model = nn.Sequential(
nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=1,padding=1),
nn.MaxPool2d(kernel_size=2),
nn.ReLU(inplace=True),
nn.Conv2d(3,6,kernel_size=3,stride=2,padding=1),
nn.ReLU(inplace=True),
nn.Flatten(),
nn.Linear(6*7*7,10)
)
def forward(self, x):
x = self.model(x)
return x
文章转载自公众号:Tensorflow机器学习
- 分享
- 举报
-
浏览量:5227次2021-05-21 17:03:03
-
浏览量:646次2024-02-01 14:28:23
-
浏览量:3942次2018-02-14 10:30:11
-
浏览量:673次2024-02-06 11:56:53
-
浏览量:496次2023-07-18 13:41:23
-
浏览量:768次2023-07-05 10:11:45
-
浏览量:504次2023-07-05 10:11:51
-
浏览量:5031次2021-04-15 15:51:43
-
浏览量:4950次2021-07-26 11:28:05
-
浏览量:761次2023-07-05 10:11:54
-
浏览量:462次2023-09-06 10:09:13
-
浏览量:1217次2024-02-20 17:08:32
-
浏览量:1294次2024-02-20 17:35:09
-
浏览量:448次2024-02-01 14:20:47
-
浏览量:6552次2021-05-31 17:02:05
-
浏览量:5257次2021-08-13 15:39:02
-
浏览量:788次2023-03-21 10:37:02
-
浏览量:4251次2021-04-19 14:54:23
-
2023-01-12 11:47:40
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
Ocean
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明