在TysFooLoad中使用以下模型考虑以下模型:
Conv2D(
filter = 2^(5+i) # i = num of times called conv2D
kernel = (3, 3),
strides = (1, 1),
padding = 'valid')
MaxPooling2D(
pool_size = (2, 2))
Layer Output Shape Param
-----------------------------------------------
L0: Shape (50, 250, 1 ) 0
L1: Conv2D (48, 248, 32 ) 320
L2: MaxPooling2D (24, 124, 32 ) 0
L3: Conv2D_1 (22, 122, 64 ) 18496
L4: MaxPooling2D_1 (11, 61, 64 ) 0
L5: Conv2D_2 (9, 59, 128) 73856
L6: MaxPooling2D_2 (4, 29, 128) 0
L7: Conv2D_3 (2, 27, 256) 295168 !!
L8: MaxPooling2D_3 (1, 13, 256) 0
L9: Flatten (3328) 0
L10: Dense (512) 1704448 !!!
L11: ...
这里,使用比例为1:5的输入形状。在L8
之后,不能有更多的卷积层,因为一侧是1
。实际上,在input_side < kernel_size
的情况下,没有更多的卷积层;该层被迫展平为具有大量单元的向量,这是由于网络中的大形状[1][3]和大量过滤器[2]造成的。下面的Dense
层[4]将具有大量的参数,需要大量的计算时间
为了减少特定于上述问题(在[x]中突出显示)的参数数量,我考虑以下方法:
Conv2D
的早期层中添加(1,2)步幅。(请参阅this thread)Conv2D
层李>Dense
中的单位数量从512减少到128李>我的问题是,这些方法有效吗?它们会在多大程度上影响CNN的表现?有没有更好的办法解决这个问题?谢谢
首先,您可以尝试使用“相同”填充而不是有效填充。在某种程度上,它会使你从这些日益减少的数字中解脱出来
关于第1点:
只有当数据在某个方向(在本例中为水平方向)上有更多变化时,添加非均匀步幅才是好的
关于第2点:
过滤器的数量无助于或损害尺寸变化的方式。如果您的模型没有过度拟合,这将影响您的性能
关于第3点:
将输入调整为方形似乎是个好主意,但由于您添加的所有额外内容,会导致不必要的神经元死亡。我建议反对。这可能会影响性能并导致过度装配
关于第4点:
在这里,单位的数量同样不会改变尺寸。如果您的模型没有过度拟合,这将影响您的性能
最后,您的人际网络足够深入,可以获得良好的效果。而不是试图变得越来越小。尝试在MaxPools之间增加Conv2D层,这样会更好
相关问题 更多 >
编程相关推荐