如何使用具有动态大小维度的输入的密集层?

问题描述 投票:0回答:1

我有一个模型,其输入(带有形状(高度、宽度、时间)的图像批次)具有动态大小的维度(时间),仅在运行时确定。然而,

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
层兼容。

tensorflow machine-learning keras neural-network tf.keras
1个回答
0
投票

这是不可能的,因为密集层具有固定数量的权重。当你在展平后调用密集层时,它实际上是在做

activation(w0 * x0 + w1 * x1 + w2 * x2 + .... + wn * xn)
,其中
w
是权重,
x
是展平的输入特征值。

因此,如果由于维度未知,无法提前知道

n
,那么网络就不可能配置适当数量的权重。

即使您知道“最大时间”并想要预先分配网络中的权重数量来支持它,它也可能会遇到两个问题

  1. 网络变得太大
  2. 网络过度拟合,因为它将每个时间步中的每个像素视为完全独立的特征,这会导致维度膨胀而没有真正的好处

因此,捕获时间轴的替代方案是要么将其设为 LSTM 或循环神经网络等时间序列网络,要么将其设为依赖于跨时间池化的 3D 卷积网络。

© www.soinside.com 2019 - 2024. All rights reserved.