keras 神经网络中的维度问题

数据挖掘 机器学习 神经网络 喀拉斯 rnn 美国有线电视新闻网
2022-03-03 14:55:59

因此,每次我尝试编写 CNN 或 RNN 时,我都无法理解维度是如何工作的。

  1. 我不明白为什么模型会编译,这在我看来意味着上一层的输出维度是下一层的输入维度,依此类推(各层相互兼容)。那么,当我拟合我的模型时,怎么可能在第 3 层或第 4 层(或除第一层之外的任何其他层)中出现错误,说对于 ex 它期望 3 维但得到 2

  2. 在一个更精确的例子中,假设我有以下一次性模型

    vocab_size =10000
    src_txt_length =10
    sum_txt_length = 100
    
    inputs = Input(shape=(src_txt_length,))
    encoder1 = Embedding(vocab_size, 128)(inputs)
    encoder2 = LSTM(128)(encoder1)
    encoder3 = RepeatVector(sum_txt_length)(encoder2)
    
    decoder1 = LSTM(128, return_sequences=True)(encoder3)
    outputs = TimeDistributed(Dense(vocab_size, activation='softmax'))(decoder1)
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    model.fit(X,y)
    

我在 TimeDistributed 层中收到一个错误,说它需要 3 个维度但得到了 2 个维度。

X.shape == (20000,10)
len(y) == 20000  # y is a list of labels 0s and 1s

所以如果我想在纸上拟合数据时计算每一层的尺寸,我该怎么做呢?

2个回答

好的,我能够重新创建错误。TimeDistributed 层将密集层应用于每个时间片。在此模型中,您将拥有sum_txt_length和 RepeatVector 层定义的 100 个不同的时间片。这些时间片将通过网络一直传播到 TimeDistributed 层。因此,您的y向量必须有维度(None,100,10000).

您可以使用model.summary()在每一层之后获取预期的尺寸。

您需要修复输出层以匹配标签尺寸。我相信您需要Flatten()在密集连接层之前添加一层,并且不要在输出处使用 TimeDistributed 层。这样你的输出就会有大小vocabsize,从而在给定输入的情况下预测下一个词汇。

输入的形状:

inputs = Input(shape=(src_txt_length,))

应该:

inputs = Input(shape=(src_txt_length,vocab_size))