我的输入看起来像这样:
[ [1, 2, 3] [4, 5, 6] [7, 8, 9] ...]
形状(1, num_samples, num_features)
和标签看起来像这样:
[ [0, 1] [1, 0] [1, 0] ...]
形状(1, num_samples, 2)
.
但是,当我尝试运行以下Keras代码时,我收到此错误:
ValueError: Error when checking model target: expected dense_1 to have 2 dimensions, but got array with shape (1, 8038, 2)
.从我所读到的,这似乎源于我的标签是2D,而不仅仅是整数.这是否正确,如果是这样,我如何使用Keras的单热标签?
这是代码:
num_features = 463 trX = np.random(8038, num_features) trY = # one-hot array of shape (8038, 2) as described above def keras_builder(): #generator to build the inputs while(1): x = np.reshape(trX, (1,) + np.shape(trX)) y = np.reshape(trY, (1,) + np.shape(trY)) print(np.shape(x)) # (1, 8038, 463) print(np.shape(y)) # (1, 8038, 2) yield x, y model = Sequential() model.add(LSTM(100, input_dim = num_features)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit_generator(keras_builder(), samples_per_epoch = 1, nb_epoch=3, verbose = 2, nb_worker = 1)
哪个迅速抛出上面的错误:
Traceback (most recent call last): File "file.py", line 35, inmodel.fit_generator(keras_builder(), samples_per_epoch = 1, nb_epoch=3, verbose = 2, nb_worker = 1) ... ValueError: Error when checking model target: expected dense_1 to have 2 dimensions, but got array with shape (1, 8038, 2)
谢谢!
有很多东西没有加起来.
我假设您正在尝试解决顺序分类任务,即您的数据形状为(
.
在批处理生成器中,您创建一个批处理,其中包含一个长度为8038的序列和每个序列元素的463个特征.您创建一个匹配的Y批次进行比较,由一个序列组成,其中包含8038个元素,每个元素的大小为2.
您的问题是Y
与最后一层的输出不匹配.你Y
是三维的,而模型的输出只是二维的:Y.shape = (1, 8038, 2)
不匹配dense_1.shape = (1,1)
.这解释了您收到的错误消息.
解决方案:您需要return_sequences=True
在LSTM层中启用返回序列而不是仅返回最后一个元素(有效地删除时间维度).这将给出(1, 8038, 100)
LSTM层的输出形状.由于Dense
图层无法处理顺序数据,因此需要将其单独应用于每个序列元素,这是通过将其包装在TimeDistributed
包装器中完成的.然后,这会为您的模型提供输出形状(1, 8038, 1)
.
您的模型应如下所示:
from keras.layers.wrappers import TimeDistributed model = Sequential() model.add(LSTM(100, input_dim=num_features, return_sequences=True)) model.add(TimeDistributed(Dense(1, activation='sigmoid')))
在检查模型摘要时可以很容易地发现这一点:
print(model.summary())