CNN架构
CNN architecture
起初,这个问题不是关于编程本身,而是关于 CNN 架构背后的一些逻辑。
我确实了解每一层的工作原理,但我唯一的问题是:将 ReLU 和卷积层分开是否有意义?我的意思是,ConvLayer 是否可以存在并通过使用反向传播来工作和更新其权重,而不需要 ReLU 支持?
我是这么认为的。这就是我创建以下独立层的原因:
- 卷积层
- ReLU
- 完全连接
- 池化
- 转换(将 3D 输出转换为一维)ConvLayer -> Fully Connected。
我正在考虑将第 1 层和第 2 层合并为一个。我应该去做什么?
简短的回答是:ReLU(或其他激活机制)应该添加到你们每个卷积层或全连接层。
CNN 和神经网络通常使用 ReLU 等激活函数在模型中引入非线性。
激活函数通常不是层本身,它们是对层的每个节点的附加计算。您可以将它们视为在查找与不查找特定模式之间做出决定的机制的实现。
See this post.
能存在吗?
是的。它可以。没有什么可以阻止神经网络在模型中没有非线性模块的情况下工作。问题是,跳过两个相邻层之间的非线性模块等同于仅对第 1 层的输入进行线性组合以获得第 2 层的输出
M1 : 输入 =====> L1 ====> ReLU ====> L2 =====> 输出
M2 : 输入=====> L1 ====> ....... . ====> L2 =====> 输出
M3:输入=====> L1 =====>输出
M2 & M3 是等价的,因为参数会在训练期间自行调整以生成相同的输出。如果中间有任何池化,这可能不是真的,但只要层是连续的,网络结构就是一个大的线性组合(Think PCA)
没有什么可以阻止整个网络中的梯度更新和反向传播。
你该怎么办?
在不同层之间保持某种形式的非线性。您可以创建包含超过 1 个卷积层的卷积块,但您应该在这些块的末尾包含一个非线性函数,并且绝对在密集层之后。对于密集层不使用激活函数完全等同于使用单层。
从 TensorFlow 的角度来看,您的所有计算都是图中的节点(通常称为会话)。因此,如果您想分离层,这意味着将节点添加到您的计算图中,请继续,但我没有看到它背后的任何实际原因。你当然可以反向传播它,因为你只是在计算每个带有推导的函数的梯度。
起初,这个问题不是关于编程本身,而是关于 CNN 架构背后的一些逻辑。 我确实了解每一层的工作原理,但我唯一的问题是:将 ReLU 和卷积层分开是否有意义?我的意思是,ConvLayer 是否可以存在并通过使用反向传播来工作和更新其权重,而不需要 ReLU 支持?
我是这么认为的。这就是我创建以下独立层的原因:
- 卷积层
- ReLU
- 完全连接
- 池化
- 转换(将 3D 输出转换为一维)ConvLayer -> Fully Connected。
我正在考虑将第 1 层和第 2 层合并为一个。我应该去做什么?
简短的回答是:ReLU(或其他激活机制)应该添加到你们每个卷积层或全连接层。
CNN 和神经网络通常使用 ReLU 等激活函数在模型中引入非线性。 激活函数通常不是层本身,它们是对层的每个节点的附加计算。您可以将它们视为在查找与不查找特定模式之间做出决定的机制的实现。 See this post.
能存在吗?
是的。它可以。没有什么可以阻止神经网络在模型中没有非线性模块的情况下工作。问题是,跳过两个相邻层之间的非线性模块等同于仅对第 1 层的输入进行线性组合以获得第 2 层的输出
M1 : 输入 =====> L1 ====> ReLU ====> L2 =====> 输出
M2 : 输入=====> L1 ====> ....... . ====> L2 =====> 输出
M3:输入=====> L1 =====>输出
M2 & M3 是等价的,因为参数会在训练期间自行调整以生成相同的输出。如果中间有任何池化,这可能不是真的,但只要层是连续的,网络结构就是一个大的线性组合(Think PCA)
没有什么可以阻止整个网络中的梯度更新和反向传播。
你该怎么办?
在不同层之间保持某种形式的非线性。您可以创建包含超过 1 个卷积层的卷积块,但您应该在这些块的末尾包含一个非线性函数,并且绝对在密集层之后。对于密集层不使用激活函数完全等同于使用单层。
从 TensorFlow 的角度来看,您的所有计算都是图中的节点(通常称为会话)。因此,如果您想分离层,这意味着将节点添加到您的计算图中,请继续,但我没有看到它背后的任何实际原因。你当然可以反向传播它,因为你只是在计算每个带有推导的函数的梯度。