我加载了一个自定义 PyTorch 模型,我想找出它的输入形状。是这样的:
model.input_shape
是否有可能获得这些信息?
更新: print()
和 summary()
不显示该模型的输入形状,所以它们不是我要找的。
原文由 Scott 发布,翻译遵循 CC BY-SA 4.0 许可协议
我加载了一个自定义 PyTorch 模型,我想找出它的输入形状。是这样的:
model.input_shape
是否有可能获得这些信息?
更新: print()
和 summary()
不显示该模型的输入形状,所以它们不是我要找的。
原文由 Scott 发布,翻译遵循 CC BY-SA 4.0 许可协议
print(model)
会给你一个模型的总结,在这里你可以看到每一层的形状。
您还可以使用 pytorch-summary 包。
如果你的网络有一个 FC 作为第一层,你可以很容易地计算出它的输入形状。你提到你在前面有一个卷积层。由于也存在全连接层,网络将仅针对一种特定的输入大小生成输出。我建议通过使用各种形状来解决这个问题,即喂养具有某种形状的玩具批次,然后检查 FC 层之前的 Conv 层的输出。
由于这取决于第一个 FC 层之前的网络架构(conv 层数、内核等),我无法为您提供正确输入的确切公式。如前所述,您必须通过尝试各种输入形状以及在第一个 FC 之前生成的网络输出来解决这个问题。有(几乎)总有一种方法可以用代码解决问题,但我现在想不出别的方法。
原文由 Alex Metsai 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答935 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
PyTorch 的灵活性
PyTorch 模型是非常灵活的对象,以至于它们不强制或通常不期望数据的固定输入形状。
如果您有某些层,则可能会有限制,例如:
但是正如您所看到的,这些都没有强制执行数据的 总体 形状。
调查
简单案例:第一层全连接
如果您的模型的第一层是全连接层,那么
print(model)
中的第一层将详细说明单个样本的预期维度。模棱两可的案例:CNN
然而,如果它是一个卷积层,因为它们是动态的并且将在输入允许的范围内跨度/跨度,所以没有简单的方法可以从模型本身检索此信息。 1这种灵活性意味着对于许多体系结构来说, 多个兼容的输入大小 2都将被网络接受。
这是 PyTorch 的 Dynamic computational graph 的一个特性。
人工检查
您需要做的是研究网络架构,一旦您找到一个可解释层(如果存在,例如完全连接),就可以“反向工作”其维度,确定前面的层(例如池化和卷积)如何压缩/修改它。
例子
例如,在 深度学习与 PyTorch (8.5.1) 的以下模型中:
我们看到模型接受输入 2.d。带有
3
通道的图像和:Conv2d
-> 将其发送到具有 32 个通道的相同大小的图像max_pool2d(,2)
-> 将每个维度的图像大小减半Conv2d
-> 将其发送到具有16个通道的相同大小的图像max_pool2d(,2)
-> 将每个维度的图像大小减半view
-> 重塑图像Linear
-> 获取大小为16 * 8 * 8
的张量并发送到大小32
所以向后工作,我们有:
16 * 8 * 8
假设: 产品中的 16 可能是指通道数,并且
view
看到的图像的形状是 (channels, 8,8),目前是 (channels, 16,16 ) 2 - un-max_pooled in 2d with factor 2, 所以高度和宽度再次减半(通道,32,32) - 从 32 个通道未卷积到 3 个因此,假设 kernel_size 和 padding 足以使卷积本身保持图像尺寸,则输入图像的形状很可能是 (3,32,32),即 RGB 32x32 像素正方形图像。
笔记:
即使是外部包
pytorch-summary
也需要您提供输入形状才能显示每一层输出的形状。然而,它可以是任何 2 个数字,其乘积等于 8*8,例如 (64,1)、(32,2)、(16,4) 等,但是由于代码写为 8*8,因此作者很可能使用了实际的方面。