gpt4 book ai didi

tensorflow - Keras 后端扁平化的问题

转载 作者:行者123 更新时间:2023-12-01 01:47:41 26 4
gpt4 key购买 nike

为什么 Keras.backend.flatten 没有显示正确的尺寸?我有以下几点:

x 是

后:

Keras.backend.flatten(x)

x 变为: 形状=(?,) dtype=float32>

为什么 x 不是形状=(?, 4*8*62)

编辑-1

如果我使用 batch_flatten,我会得到 (?, ?) (以下 branch3x3branch5x5 是之前卷积的张量):
x = Lambda(lambda v: K.concatenate([v[0], v[1]], axis=3))([branch3x3, branch5x5])
x = Lambda(lambda v: K.batch_flatten(v))(x)

第一个 Lambda 的结果是

第二个 Lambda 的结果是

编辑 2

试过 batch_flatten但是当我构建模型输出时在下游出现错误(使用 reshape 而不是 batch_flatten 似乎有效)。 branch3x3branch5x5 :
from keras import backend as K
x = Lambda(lambda v: K.concatenate([v[0], v[1]], axis=3))([branch3x3, branch5x5])
x = Lambda(lambda v: K.batch_flatten(v))(x)
y = Conv1D(filters=2, kernel_size=4)(Input(shape=(4, 1)))
y = Lambda(lambda v: K.batch_flatten(v))(y)
z = Lambda(lambda v: K.concatenate([v[0], v[1]], axis=1))([x, y])
output = Dense(32, kernel_initializer=TruncatedNormal(), activation='linear')(z)
cnn = Model(inputs=[m1, m2], outputs=output)
output语句导致 kernel_initializer 出现以下错误: 类型错误:无法将类型的对象转换为张量。内容:(无,32)。考虑将元素转换为支持的类型。

最佳答案

来自 flatten 的文档字符串:

def flatten(x):
"""Flatten a tensor.
# Arguments
x: A tensor or variable.
# Returns
A tensor, reshaped into 1-D
"""

所以它变成了一个形状为 (batch_size, 4, 8, 62) 的张量转换成形状为 (batch_size * 4 * 8 * 62,) 的一维张量.这就是为什么你的新张量具有一维形状 (?,) .

如果要保留第一个维度,请使用 batch_flatten :

def batch_flatten(x):
"""Turn a nD tensor into a 2D tensor with same 0th dimension.
In other words, it flattens each data samples of a batch.
# Arguments
x: A tensor or variable.
# Returns
A tensor.
"""

编辑:你看到的形状是 (?, ?)因为形状是在运行时动态确定的。如果输入 numpy 数组,则可以轻松验证形状是否正确。

input_tensor = Input(shape=(4, 8, 62))
x = Lambda(lambda v: K.batch_flatten(v))(input_tensor)
print(x)

Tensor("lambda_1/Reshape:0", shape=(?, ?), dtype=float32)

model = Model(input_tensor, x)
out = model.predict(np.random.rand(32, 4, 8, 62))
print(out.shape)

(32, 1984)

编辑 2:

从错误信息看来, TruncatedNormal需要来自前一层的固定输出形状。所以动态形状 (None, None)来自 batch_flatten不会工作。

我能想到两个选择:
  • 提供人工计算output_shapeLambda层:

  • x = Lambda(lambda v: K.concatenate([v[0], v[1]], axis=3))([branch3x3, branch5x5])
    x_shape = (np.prod(K.int_shape(x)[1:]),)
    x = Lambda(lambda v: K.batch_flatten(v), output_shape=x_shape)(x)

    input_y = Input(shape=(4, 1))
    y = Conv1D(filters=2, kernel_size=4)(input_y)
    y_shape = (np.prod(K.int_shape(y)[1:]),)
    y = Lambda(lambda v: K.batch_flatten(v), output_shape=y_shape)(y)

    z = Lambda(lambda v: K.concatenate([v[0], v[1]], axis=1))([x, y])
    output = Dense(32, kernel_initializer=TruncatedNormal(), activation='linear')(z)
    cnn = Model(inputs=[m1, m2, input_y], outputs=output)
  • 使用 Flatten层(调用 batch_flatten 并计算其中的输出形状):

  • x = Concatenate(axis=3)([branch3x3, branch5x5])
    x = Flatten()(x)

    input_y = Input(shape=(4, 1))
    y = Conv1D(filters=2, kernel_size=4)(input_y)
    y = Flatten()(y)

    z = Concatenate(axis=1)([x, y])
    output = Dense(32, kernel_initializer=TruncatedNormal(), activation='linear')(z)
    cnn = Model(inputs=[m1, m2, input_y], outputs=output)

    我更喜欢后者,因为它使代码不那么困惑。还,
  • 您可以更换 Lambda层包装K.concatenate()Concatenate层。
  • 记得移动Input(shape=(4, 1))并在您的 Model(inputs=...) 中提供称呼。
  • 关于tensorflow - Keras 后端扁平化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480076/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com