检查输入时出错:预期 lstm_input 有 3 个维度,但得到了形状为 (160, 1000) 的数组
Posted
技术标签:
【中文标题】检查输入时出错:预期 lstm_input 有 3 个维度,但得到了形状为 (160, 1000) 的数组【英文标题】:Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (160, 1000) 【发布时间】:2020-02-27 19:45:23 【问题描述】:当我尝试将 RNN 模型用于我的数据集时,我遇到了这个错误。这是我的模型和数据集的精简版本,但它产生完全相同的错误 - dropbox.com/sh/1a2guzsk4afp94r/AACkOQ1UibLZAhzGoyZJtVcqa?dl=0
训练数据由每 1000 个浮点数长的浮点数列表组成。例如,
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0.55 0.2 0.5 0.85 0.8 0.2
0.2 1. 0.2 0.2 0.5 0.75 0.3 0.5 0.5 0.3 0.85 0.65 0.15 0.4
0.3 0.6 0.05 0.15 0.85 0.5 0.45 0.45 0.05 0.25 0.5 0.45 0.05 0.1
0.45 0.9 0.35 0.35 0.65 0.15 0.45 0.3 0.3 0.6 0.2 0.2 0.05 0.55
0.45 0.75 0.5 0.5 1. 0.5 1. 0.6 0.45 0.05 0.45 0.4 0.05 0.05
0.8 0.05 0.85 0.85 0.8 0.7 0.9 0.65 0.2 1. 0.3 0.85 0.8 0.7
0.95 0.2 0.7 0.95 0.95 0.2 0.2 0.25 0.6 0.7 0.3 0.25 0.15 0.2
0.7 0.15 0.5 0.35 0.1 0.15 0.2 0.2 0.5 0.2 0.65 0.8 0.15 0.6
0.2 0.2 0.2 0.6 0.65 0.05 0.3 0.8 0.7 0.05 0.65 0.3 0.8 0.7
0.05 0.85 0.65 0.65 0.45 0.45 0.65 0.75 0.85 0.8 0.65 0.15 0.25 0.65
0.2 0.9 0.5 0.45 0.2 1. 0.9 0.8 0.6 0.05 0.5 0.25 0.85 0.6
0.75 0.85 1. 0.6 0.1 0.25 0.4 0.4 0.25 0.85 0.85 0.05 0.2 0.45
0.3 0.45 0.2 0.5 1. 0.65 0.1 0.4 0.7 0.05 0.05 1. 0.45 0.1
0.85 0.25 0.4 0.05 0.5 1. 0.55 1. 0.6 0.3 0.15 0.8 0.9 0.5
1. 0.4 0.4 0.85 0.9 0.3 0.45 0.35 0.75 0.9 0.6 0.05 0.55 0.2
0.6 0.5 0.1 0.8 0.45 0.45 0.1 0.85 0.9 0.8 0.25 0.5 0.7 0.05
0.45 0.3 0.9 0.5 0.45 0.65 0.7 0.2 0.05 1. 0.6 0.9 0.1 0.1
0.85 0.25 0.2 0.5 0.4 0.8 0.7 0.6 0.4 0.7 0.3 0.3 0.5 0.65
0.8 0.8 0.25 0.25 0.6 0.65 0.9 0.7 0.2 0.2 0.2 0.45 0.8 0.9
0.6 0.95 0.45 0.5 0.4 0.8 0.2 0.25 0.05 0.1 0.8 0.4 0.45 0.1
0.85 0.15 0.65 0.5 0.5 0.5 0.55 0.05 0.5 1. 0.5 0.2 0.25 0.85
0.85 0.05 0.65 0.2 0.05 0.1 0.45 0.9 0.1 0.15 0.6 0.65 0.75 0.75
0.5 0.2 0.35 0.75 0.75 0.35 0.35 0.85 0.45 0.15 0.35 0.85 0.5 0.6
0.05 0.5 0.5 0.25 0.7 0.15 0.8 0.45 0.85 0.7 0.45 0.85 0.4 0.1
0.6 0.7 0.05 0.1 0.15 0.85 0.9 0.5 0.05 0.45 0.75 0.75 0.5 0.15
0.55 0.45 0.85 0.5 0.85 0.75 0.6 0.2 0.5 0.5 0.9 0.7 0.75 0.95
0.7 0.3 0.5 0.25 0.7 0.2 0.55 0.2 0.15 0.5 0.25 0.3 0.05 0.75
0.3 0.2 0.2 0.35 0.5 0.05 0.35 0.75 0.55 0.05 0.05 0.9 0.55 0.95
0.5 0.6 0.05 0.5 0.35 0.65 0.6 0.55 0.65 0.15 0.9 0.4 0.25 0.6
1. 0.4 0.45 0.55 0.9 0.9 0.2 0.6 0.45 0.65 0.45 0.7 0.75 1.
0.5 0.5 0.5 0.45 0.3 0.65 0.9 0.6 0.1 0.3 0.45 0.85 0.85 0.9
0.05 0.05 0.3 0.5 0.4 0.3 0.5 0.1 0.3 0.3 0.05 1. 0.5 0.6
0.4 0.6 0.1 0.65 0.65 0.2 0.75 0.5 0.05 0.25 0.2 0.5 0.3 0.55
0.05 0.4 0.15 0.7 0.25 0.85 0.9 0.9 0.25 0.2 0.15 0.9 0.45 0.3
0.45 0.45 0.8 0.8 0.45 0.8 0.8 0.5 0.7 0.85 0.3 0.4 0.3 0.25
0.2 0.6 0.5 0.15 0.6 0.5 0.75 0.15 0.35 0.5 0.15 0.3 0.05 0.9
0.65 0.9 0.6 0.5 0.2 0.75 0.45 0.35 0.7 0.6 0.45 0.9 0.85 0.7
0.4 0.25 0.65 0.65 0.3 0.4 0.9 0.85 0.1 0.6 0.2 1. 0.15 0.4
0.65 0.5 0.85 0.9 0.45 0.4 0.75 0.55 1. 0.7 0.45 0.9 0.2 0.5
0.5 0.35 0.6 1. 0.6 0.5 1. 0.45 0.8 0.5 0.45 0.6 0.85 0.2
0.2 0.9 0.3 0.45 0.45 0.75 1. 0.5 0.7 0.8 0.3 0.4 0.85 0.95
0.5 0.5 0.5 0.5 0.4 1. 0.25 0.75 0.8 0.9 0.15 0.15 0.25 0.85
0.2 0.45 0.5 0.7 0.2 0.1 0.9 0.9 0.45 0.95 0.45 0.2 0.75 0.4
0.2 0.85 0.2 0.9 0.3 0.15 0.55 0.95 0.5 0.5 0.85 0.55 0.45 0.2
0.6 0.4 0.2 0.7 0.3 0.45 0.6 0.4 0.5 0.2 0.45 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. ]
数据用 0 填充,因此所有序列的长度为 1000 个元素。
这是我正在使用的模型的代码(如果要下载,请使用保管箱链接)
import numpy as np
from sklearn.utils import shuffle
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM
import numpy as np
def main():
posData = createListOfSequences('PositiveData.txt')
negData = createListOfSequences('NegativeData.txt')
# Shuffle both
np.random.shuffle(posData)
np.random.shuffle(negData)
# Create target lists
PosTargets = [1.0] * len(posData)
NegTargets = [0.0] * len(negData)
# Combine PosData and NegData into 1 list
Sequences = posData + negData
Targets = PosTargets + NegTargets
# shuffle sequences but maintain link to targets
(Sequences, Targets) = shuffle(Sequences, Targets)
# make all sequences 1000 in length
for sequence in Sequences:
sequence = padWithZero(1000, sequence)
Sequences = np.array(Sequences)
Targets = np.array(Targets)
FitModel(Sequences, Targets)
def FitModel(data, target):
trainPercentage = 0.8
splitValue = round(len(data) * trainPercentage)
(x_train, y_train) = data[0:splitValue], target[0:splitValue]
(x_test, y_test) = data[splitValue:len(
data)], target[splitValue:len(target)]
model = Sequential()
model.add(LSTM(128, activation='relu',
input_shape=(1000, 1), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
def padWithZero(targetLength, sequence):
i = 0
while not(len(sequence) >= targetLength):
if (i % 2 == 0):
sequence.append(0.0)
else:
sequence.insert(0, 0.0)
i += 1
return sequence
def createListOfSequences(dataPath):
DataAsString = []
for line in open(dataPath):
x = line.rstrip()
DataAsString.append((x.split(',')))
ListOfSequences = []
for seq in DataAsString:
listOfFloats = []
for val in seq:
if '.' in val:
listOfFloats.append(float(val))
ListOfSequences.append(listOfFloats)
return(ListOfSequences)
main()
任何帮助将不胜感激。谢谢。
【问题讨论】:
一份正式说明 - 请提供minimal
可重现的示例。问更有针对性的问题,不要提供这么长的代码和数据。如果需要,您可以将其分解为更多问题。
抱歉,我认为我的保管箱链接是一个最小的可重现示例。下次我会尽量减少它。
【参考方案1】:
正如错误消息所说,LSTM 需要 3 个维度的输入。你可以像这样重塑:
x_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])
基本上,将形状(a, b)
变成(a, 1, b)
。
【讨论】:
我现在收到此错误:ValueError: Error when checking input: expected lstm_input to have shape (1000, 1) but got array with shape (1, 1000)
尝试切换它以获取 (1000,1)
但这只会产生另一个错误
你的input_shape
参数是否对应x_train.shape[1:]
?
我不确定我是否理解您的问题,抱歉。你的意思是和它对应吗?
在这一行:model.add(LSTM(128, activation='relu', input_shape=(1000, 1), return_sequences=True))
,input_shape
参数应该是(x_train.shape[1:])
。以上是关于检查输入时出错:预期 lstm_input 有 3 个维度,但得到了形状为 (160, 1000) 的数组的主要内容,如果未能解决你的问题,请参考以下文章
检查输入时出错:预期 input_1 有 4 个维度,但得到了形状为 (224, 224, 3) 的数组
检查输入时出错:预期 lstm_1_input 有 3 个维度,但得到了形状为 (5, 3) 的数组
ValueError:检查输入时出错:预期 lstm_16_input 有 3 个维度,但得到的数组形状为 (836, 400, 3, 1)
检查输入时出错:预期 flatten_1_input 有 3 个维度,但得到了形状为 (28, 28) 的数组
检查输入时出错:预期 flatten_input 有 3 个维度,但得到了形状为 (None, 100, 100, 1) 的数组
model.predict() == ValueError:检查输入时出错:预期 flatten_input 有 3 个维度,但得到的数组形状为 (1, 2)