【问题标题】:ValueError: Error when checking target: expected dense_19 to have 3 dimensions, but got array with shape (5, 3)ValueError:检查目标时出错:预期 dense_19 具有 3 个维度,但得到了形状为 (5, 3) 的数组
【发布时间】:2019-01-22 16:12:21
【问题描述】:

我有以下代码使用带有 TensorFlow 后端的 Keras 创建 LSTM 网络。 这段代码运行良好。

import numpy as np
import pandas as pd
from sklearn import model_selection
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.utils import np_utils

flights = {
            'flight_stage': [1,0,1,1,0,0,1],
            'scheduled_hour': [16,16,17,17,17,18,18],
            'delay_category': [1,0,2,2,1,0,2]
        }

columns = ['flight_stage', 'scheduled_hour', 'delay_category']

df = pd.DataFrame(flights, columns=columns)

X = df.drop('delay_category',1)
y = df['delay_category']

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=42)

nb_features = X_train.shape[1]
nb_classes = y.nunique()
hidden_neurons = 32
timestamps = X_train.shape[0]

# Reshape input data to 3D array
X_train = X_train.values.reshape(1, X_train.shape[0], X_train.shape[1])
X_test = X_test.values.reshape(1, X_test.shape[0], X_test.shape[1])

y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()
model.add(LSTM(
                units=hidden_neurons, 
                return_sequences=True, 
                input_shape=(timestamps,nb_features)
              )
         )

model.add(Dropout(0.2))

model.add(Dense(activation='softmax', units=nb_classes))

model.compile(loss="categorical_crossentropy",
              optimizer='adadelta')

但是当我开始训练模型时,它失败了:

history = model.fit(X_train, y_train, validation_split=0.25, epochs=500, batch_size=2, shuffle=True, verbose=0)

错误:

ValueError: Error when checking target: expected dense_19 to have 3 dimensions, but got array with shape (5, 3)

这个错误是指最后的 Dense 层。我使用model.summary() 来获得准确的尺寸。密集层的输出形状是(None, 5, 3)。 但是我不明白为什么它有 3 个维度以及 None 代表什么(它是如何出现在最后一层的)?

【问题讨论】:

  • 特征和标签数据的形状是什么?
  • @edkeveked:形状如下:X_train shape: (1, 5, 2)、X_test shape: (1, 2, 2)、y_train shape: (5,3)、y_test shape: (2,3)。

标签: python tensorflow keras lstm


【解决方案1】:

3 是最后一层返回的单位数。它是softmax激活的类数

5 是 lstm 返回的单位数,表示返回的序列的大小

None 是最后一层的元素个数。它只是意味着最后一层可以接受形状为 [5, 3] 的每批张量的不同大小

X_train shape: (1, 5, 2), 
X_test shape: (1, 2, 2), 
y_train shape: (5,3), 
y_test shape: (2,3)

查看数据形状,特征的批量大小与标签的批量大小显然不匹配。最左边的数字应该在特征形状 X 和标签形状 y 之间相等。它是批量大小。

'1', 5, 2 => batch size of 1
'2', 3 => batch size of 2

这里不匹配。 另外为了解决lstm层的输出和最后一层的输入之间的问题,可以使用layer.flatten

nb_classes = 3
hidden_neurons = 32

model = Sequential()

model.add(LSTM(
                units=hidden_neurons, 
                return_sequences=True, 
                input_shape=(5, 2)
              )
         )

model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(activation='softmax', units=nb_classes))

model.compile(loss="categorical_crossentropy",
              optimizer='adadelta')

model.compile(loss='categorical_crossentropy',
              optimizer='adam')

live code

【讨论】:

  • 感谢您的解释。您能否指出如何解决我的问题?我认为我的代码中的所有数字都正确地符合您的定义。因此我无法理解我做错了什么。
  • @ingrid,我编辑了我的问题。告诉我是否还有要解释的事情
  • 谢谢,我完全理解为什么会发生这个错误。但是,我仍然不明白如何解决它。如果解决方案是使用layer.flatten,您能否使用我的代码示例说明它是如何工作的?
  • 它真的适合你吗?我在问题中发布的输入数据出现此错误:ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 5 target samples.
  • 批次大小应相同。将标签形状 y 更改为 (1, 3)。查看我用于工作代码的形状。此外,请记住 X_train 和 X_test 的数据形状应与模型的输入形状相匹配。 X 形状可以是 (1, 5, 2)
猜你喜欢
  • 2019-09-11
  • 2018-06-17
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2021-03-20
  • 2020-09-26
相关资源
最近更新 更多