我有一个模型,其输入(带有形状(高度、宽度、时间)的图像批次)具有动态大小的维度(时间),仅在运行时确定。然而,
Dense
层需要完全定义的空间维度。代码片段示例:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Input
# Define an input with an undefined dimension (None)
input_tensor = Input(shape=(None, 256, 256, None, 13))
# Apply a Dense layer (which expects a fully defined shape)
x = Flatten()(input_tensor)
x = Dense(10)(x)
# Build the model
model = tf.keras.models.Model(inputs=input_tensor, outputs=x)
model.summary()
这会引发错误:
ValueError: The last dimension of the inputs to a Dense layer should be defined. Found None.
如何使用
Flatten
而不是 GlobalAveragePooling3D
等替代方案使其工作?本质上,我正在寻找一种使用原始像素值创建一维数组的方法,但与 Dense
层兼容。
这是不可能的,因为密集层具有固定数量的权重。当你在展平后调用密集层时,它实际上是在做
activation(w0 * x0 + w1 * x1 + w2 * x2 + .... + wn * xn)
,其中 w
是权重,x
是展平的输入特征值。
因此,如果由于维度未知,无法提前知道
n
,那么网络就不可能配置适当数量的权重。
即使您知道“最大时间”并想要预先分配网络中的权重数量来支持它,它也可能会遇到两个问题
因此,捕获时间轴的替代方案是要么将其设为 LSTM 或循环神经网络等时间序列网络,要么将其设为依赖于跨时间池化的 3D 卷积网络。