【问题标题】:LSTM input shape error: Input 0 is incompatible with layer sequential_1LSTM 输入形状错误:输入 0 与层序号_1 不兼容
【发布时间】:2021-03-27 09:21:52
【问题描述】:

我是机器学习和 keras 的新手。我试图为我的分类问题创建一个 LSTM 模型,但我收到了这个错误:(我从互联网上得到了几个样本并试图修改它们)

ValueError:输入 0 与层序号_1 不兼容:预期形状=(无,无,30),发现形状=[无,3,1]

这就是我需要的,我有一个像 1,2,3,4 这样的序列,其中 1,2,3 是我的 X_train,4 是标签(Y),所以 我的意思是时间步长是 3 和每个人只有一个特点

我的标签有 30 个类。所以我希望输出是这 30 个类之一。 64 是内存单元的数量。

这是我的代码

def get_lstm():
    model = Sequential()  
    model.add(LSTM(64, input_shape=(3, 30), return_sequences=True))  
    model.add(LSTM(64))  
    model.add(Dropout(0.2))  
    model.add(Dense(30, activation='softmax'))

X_train = user_data[:, 0:3]
X_train = np.asarray(X_train).astype(np.float32)  
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
Y_train = user_data[:, 3]    
Y_train = np.asarray(Y_train).astype(np.float32)
local_model = Mymodel.get_lstm()  
local_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
local_model.set_weights(global_weights)           
local_model.fit(X_train, Y_train, batch_size=32,
                                        epochs=1)

如果您需要更多信息或不清楚,请告诉我。我真的需要你们的帮助,谢谢

【问题讨论】:

    标签: tensorflow machine-learning keras lstm multiclass-classification


    【解决方案1】:

    不确定为什么要将第一个 LSTM 的输入形状设置为 (3,30)。正如你提到的 -

    这就是我需要的,我有一个像这样的序列 1,2,3,4,其中 1,2,3 是我的 X_train,4 是标签(Y)。 所以我的意思是时间步长为 3,每个只有一个特征

    如果您有 3 个时间步,并且只有一个特征,那么您应该这样定义每个序列。

    此外,由于模型将始终输出 30 长度的概率分布,但您的 y_train 是单个值(在唯一的 30 个类别中),您需要使用损失 sparse_categorical_crossentropy 而不是 categorical_crossentropyRead more here.

    from tensorflow.keras import layers, Model, utils
    
    #Dummy data and its shapes
    X = np.random.random((100,3,1)) #(100,3,1)
    y = np.random.randint(0,29,(100,)) #(100,)
    
    #Design model
    inp = layers.Input((3,1))
    x = layers.LSTM(64, return_sequences=True)(inp)
    x = layers.LSTM(64)(x)
    x = layers.Dropout(0.2)(x)
    out = layers.Dense(30, activation='softmax')(x)
    model = Model(inp, out)
    
    #Compile and fit
    model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
    model.fit(X, y, batch_size=32,epochs=3)
    
    Epoch 1/3
    4/4 [==============================] - 0s 4ms/step - loss: 3.4005 - accuracy: 0.0400
    Epoch 2/3
    4/4 [==============================] - 0s 5ms/step - loss: 3.3953 - accuracy: 0.0700
    Epoch 3/3
    4/4 [==============================] - 0s 8ms/step - loss: 3.3902 - accuracy: 0.0900
    
    utils.plot_model(model, show_layer_names=False, show_shapes=True)
    

    【讨论】:

    • 谢谢我想出了一些头脑风暴:)。在输入错误(3,1)之前我做了你的解决方案:ValueError:Shapes(None,1)和(None,30)不兼容。谢谢
    • 你必须相应地重塑你的训练数据。
    • 我编辑了,这是我的重塑我忘了它, X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) 。如果你知道,你会纠正它吗?
    • 它也不适用于 X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 30))
    • 希望能解决您的问题。如果这样做,请标记解决方案,它鼓励我将来进一步解决您的问题:)
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多