【问题标题】:Keras ValueError: Shapes (?, ?, ?) and (6, 1) must have the same rank & logits and labels must have the same shape ((6, 1) vs (?, ?, ?)) when compileKeras ValueError:编译时形状 (?, ?, ?) 和 (6, 1) 必须具有相同的等级 & logits 和标签必须具有相同的形状 ((6, 1) vs (?, ?, ?))
【发布时间】:2019-05-22 07:43:32
【问题描述】:

我正在尝试为多类分类(6 类)构建 NLP CNN 模型。结构的第一部分是:

Input --> Embedding --> Conv --> GlobalMaxPool --> Dropout --> Dense

并且在密集层之后,每个输入句子都被转换为一个 100 维的嵌入。

在此之后,我传入一个常量矩阵 (6,100),它是一个包含六个不同标签的词嵌入矩阵(每行代表一个 100 维的词嵌入),然后我计算句子嵌入和每个标签之间的余弦相似度将标签词嵌入作为评分函数,它给我的结果是(6,100)。

接下来,我将结果传递给一个密集层以获得输出,使用 1 个神经元和 sigmoid 作为激活,它给出了 (6, 1) 的结果,但是当我编译它时它给了我标题中的错误。

以下是所有代码,感谢所有帮助!

MAX_SEQUENCE_LENGTH = 250

jdes_sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='float32')
word_embedding_layer = embedding_layer(jdes_sequence_input)
jdes = word_embedding_layer
jdes = Conv1D(filters=1000, kernel_size=5, strides=1, activation='tanh')(jdes)
jdes = GlobalMaxPooling1D()(jdes)
jdes = Dense(1000, activation='tanh')(jdes)
jdes = Dropout(0.3)(jdes)
jdes = Dense(100, activation='relu')(jdes)

def cosine_distance(input): # label_embedding is the constant matrix
    jd = K.l2_normalize(input, axis=-1)
    jt_six = K.l2_normalize(label_embedding, axis=-1)
    return jd * jt_six # return a 6*100 result

distance = Lambda(cosine_distance, output_shape=(6,100))(jdes)
result = Dense(1, activation='sigmoid')(distance)

model = Model(inputs=jdes_sequence_input, outputs = result)
sgd = optimizers.SGD(lr=0.05)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
model.fit(pad_data, labels, validation_split=0.2, batch_size=64, nb_epoch=1)

pad_data 具有形状:(18722, 250) 标签有形状:(18722, 6)

【问题讨论】:

    标签: tensorflow keras deep-learning nlp conv-neural-network


    【解决方案1】:

    花了很多时间来理解问题和错误。我得出的结论是:

    形状 (?, ?, ?) 和 (6, 1) 必须具有相同的等级

    这表明输出有问题(形状为 (6, 1))。您在此模型的末尾使用了自定义层,即在 Dense 层之后。错误在于该自定义层。

    距离 = Lambda(cosine_distance, output_shape=(6,100))(jdes)

    您将输出形状定义为 (6, 100)。我的想法是,您忘记了您在 Keras 中编写的层必须能够一次处理整个批次。因此,输出的形状应该是 (batch_size, 6, 100)。

    现在,output_shape 将是 (?, 6, 100),其等级为“3”,与形状 (?, ?, ?) 的等级相同。

    试试这个..

    【讨论】:

    • 感谢您的回答!错误来自 model.compile 并且它还没有适应并且知道 batch_size 是多少。但我所做的是:distance = Lambda(cosine_distance, output_shape=(None, 6,100))(jdes)。我在编译时得到的是ValueError: Shapes (?, ?, ?, ?) and (6, 1) must have the same rank。我做对了吗?谢谢
    • 不.. 出了点问题。你能提供完整的错误跟踪和最小的代码sn-p吗?这样我就可以知道哪一行给出了这个错误,哪些行间接影响了这个错误..谢谢..
    【解决方案2】:

    我有一个类似的问题,它与我的自定义距离 lambda 和我传递给它的函数有关。

    要修复它,我必须这样做

    def get_abs_diff( vects ):
        x, y = vects
        return K.abs( x - y )  
    
    def eucl_dist_output_shape(shapes):
        shape1, shape2 = shapes
        return (shape1[0], 1)
        #Original
        #return(1,) This messed up the ranking
    

    这不是解决您的问题所必需的,但它是一个开始的地方。 @Kadam Parikh 是正确的,因为问题出在自定义距离公式中。

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2023-04-08
      • 2021-10-22
      • 2021-08-27
      • 2019-02-23
      • 1970-01-01
      • 2021-09-19
      • 2018-06-29
      • 2021-09-16
      相关资源
      最近更新 更多