【问题标题】:Tensorflow throws 'Incompatible shapes' error in Lambda layer when batch_size > 1当 batch_size > 1 时,Tensorflow 在 Lambda 层中抛出“不兼容的形状”错误
【发布时间】:2019-08-29 00:55:19
【问题描述】:

我有一个简单的 CNN,带有两个用于文本处理的输入(代码如下)。一个用于令牌的输入,另一个用于权重。两个输入都是相同MAX_LENGTH 的序列。在通过嵌入层传递令牌后,我想将这些嵌入乘以相应的权重。所以我为此目的定义了新的 Lambda 层和函数 mult

实际行为

当我尝试仅在 batch_size==1 中输入的模型拟合时,它可以工作。但是如果batch_size > 1 它显示了

InvalidArgumentError: Incompatible shapes

预期行为

模型适合任何规模的批次。

例外

以下是运行 fit 时与batch_size=256MAX_LENGTH=30EMB_SIZE=300 一起出现的异常示例:

InvalidArgumentError: Incompatible shapes: [256,30,300] vs. [30,256] [[{{node lambda_41/mul}}]]

它是否暗示 imp_w 张量形状等于 [30,256]?不应该等于[256,30]吗?

最后的问题是我的网络配置有什么问题?谢谢!

def mult(tensors):
    # print(tensors[0].shape, tensors[1].shape)
    return np.multiply(tensors[0], K.transpose(tensors[1]))

def TextSentCNN(n_filters, filter_sizes):
    inp_t = Input(shape=(MAX_LENGTH,))
    inp_w = Input(shape=(MAX_LENGTH,))

    x = Embedding(MAX_FEATURES, EMB_SIZE, weights=[embedding_matrix], trainable=False)(inp_t)    
    x = keras.layers.Lambda(mult, output_shape=(MAX_LENGTH, EMB_SIZE,))([x, inp_w])
    x = SpatialDropout1D(0.2)(x)
    x = Reshape((MAX_LENGTH, EMB_SIZE, 1))(x)    

    pools = []
    for filter_size in filter_sizes:
        conv = Conv2D(n_filters, kernel_size=(filter_size, EMB_SIZE), padding='valid', kernel_initializer='normal', activation='relu')(x)
        pool = MaxPool2D(pool_size=(MAX_LENGTH - filter_size + 1, 1), strides=(1,1), padding='valid')(conv)
        pools.append(pool)

    x = Concatenate(axis=1)(pools)
    x = Flatten()(x)
    x = Dropout(.5)(x)
    out = Dense(3, activation='softmax')(x)

    model = Model(inputs=[inp_t, inp_w], outputs=out)
    model.compile(
        loss='categorical_crossentropy',
        optimizer=Adam(lr=0.001),
        metrics=['accuracy']
    )
    return model

【问题讨论】:

    标签: tensorflow lambda keras embedding


    【解决方案1】:

    调用 lambda 层时,张量 x 的形状为 (batch_size, MAX_LENGTH, EMB_SIZE)inp_w 的形状为 (batch_size, MAX_LENGTH)。由于您在自定义 mult 函数中对 inp_w 进行转置,因此您最终会得到错误消息中提到的不兼容的形状。

    您的代码的另一个问题是您试图在 lambda 层内使用 numpy 函数。您应该只使用 Keras 后端函数。下面的代码应该可以代替:

    def mult(tensors):
        x = tensors[0] # shape (bs, len, dim)
        weights = K.expand_dims(tensors[1], -1) # shape (bs, len, 1)
        return weights * x # pointwise multiplication
    

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多