使用通道优先和通道最后的实验来展平层,给出奇怪的结果
Posted
技术标签:
【中文标题】使用通道优先和通道最后的实验来展平层,给出奇怪的结果【英文标题】:Flatten Layer with channel first and channel last experiments giving odd results 【发布时间】:2021-06-23 18:35:15 【问题描述】:我正在编写代码以使用 cudnn 编写的库在 c++ 中运行 TensorFlow 模型。但它在展平层上给了我奇怪的结果。在我的模型中,我指定我首先在每一层上使用通道。因此,假设前一个 maxpool 层的输出形状为 batch、channels、hight 宽度,它将被输入到 flatten 层。我在这里指定我也在展平层中首先使用通道。但是展平层会给我带来相反方向的结果(最后是通道)。
例如请参阅以下输入
inputs = np.arange(75.0).reshape((1,3,5,5))
k = 0;
for n in range(1):
for h in range(3):
for w in range(5):
for c in range(5):
inputs[n][h][w][c]=k
k=k+1
print(inputs.shape)
print(inputs)
(1, 3, 5, 5)
[[[[ 0. 1. 2. 3. 4.]
[ 5. 6. 7. 8. 9.]
[10. 11. 12. 13. 14.]
[15. 16. 17. 18. 19.]
[20. 21. 22. 23. 24.]]
[[25. 26. 27. 28. 29.]
[30. 31. 32. 33. 34.]
[35. 36. 37. 38. 39.]
[40. 41. 42. 43. 44.]
[45. 46. 47. 48. 49.]]
[[50. 51. 52. 53. 54.]
[55. 56. 57. 58. 59.]
[60. 61. 62. 63. 64.]
[65. 66. 67. 68. 69.]
[70. 71. 72. 73. 74.]]]]
fl = layers.Flatten(data_format='channels_first')
outputs = fl(inputs)
print(outputs.shape)
print(outputs)
(1, 75)
tf.Tensor(
[[ 0. 25. 50. 1. 26. 51. 2. 27. 52. 3. 28. 53. 4. 29. 54. 5. 30. 55.
6. 31. 56. 7. 32. 57. 8. 33. 58. 9. 34. 59. 10. 35. 60. 11. 36. 61.
12. 37. 62. 13. 38. 63. 14. 39. 64. 15. 40. 65. 16. 41. 66. 17. 42. 67.
18. 43. 68. 19. 44. 69. 20. 45. 70. 21. 46. 71. 22. 47. 72. 23. 48. 73.
24. 49. 74.]], shape=(1, 75), dtype=float32)
我认为输出应该是 0,1,2,3... 而不是上面那个。我可以通过仅在展平层中使用 channels_last 来获得所需的输出,但这对我来说没有意义。
【问题讨论】:
【参考方案1】:为什么会有所不同?展平层的输出不必排序。它在失去 4D 形状后不再“有意义”,并且失去了可以用卷积层提取的空间意义。之后,在哪里都无所谓了。
【讨论】:
没有。如果您使用来自 tensorflow 模型的训练权重并在其他框架中运行该模型,这一点很重要。如果排序不匹配,则输出将不同。我正在用 tensorflow 训练模型,然后用 c++ 将它们导出到我的项目中,我需要按顺序进行所有操作。 如果顺序不同,那么矩阵乘法与下一层的权重会在我的项目中给出错误的输出。我希望我能让你更清楚。为什么我需要正确的排序,因为我正在导出经过训练的 tensorflow 模型。以上是关于使用通道优先和通道最后的实验来展平层,给出奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章
三层交换机链路聚合实验-Cisco Packet Tracer
20-Etherchannel 以太通道链路冗余技术(三层冗余) //IOU模拟