首页 文章

Keras LSTM:检查模型输入尺寸时出错

提问于
浏览
3

我是keras的新用户,并尝试实现LSTM模型 . 对于测试,我声明了如下所示的模型,但由于输入维度的不同而失败 . 虽然我在这个网站上发现了类似的问题,但我自己找不到自己的错误 .

ValueError: 
Error when checking model input: 
expected lstm_input_4 to have 3 dimensions, but got array with shape (300, 100)

我的环境

  • python 3.5.2

  • keras 1.2.0(Theano)

代码

来自keras.layers导入输入,密集
来自keras.models导入顺序
来自keras.layers导入LSTM
来自keras.optimizers导入RMSprop,Adadelta
来自keras.layers.wrappers导入TimeDistributed
导入numpy为np

in_size = 100
out_size = 10
nb_hidden = 8

model = Sequential()
model.add(LSTM(nb_hidden,
名称= LSTM',
活化= '的tanh',
return_sequences =真,
input_shape =(None,in_size)))
model.add(TimeDistributed(Dense(out_size,activation ='softmax')))

adadelta = Adadelta(clipnorm = 1 . )
model.compile(优化= adadelta,
损失= 'categorical_crossentropy',
度量= [ '准确性'])

#create dummy data
data_size = 300
train = np.zeros((data_size,in_size,),dtype = np.float32)
labels = np.zeros((data_size,out_size,),dtype = np.float32)
model.fit(火车,标签)

编辑1(在MarcinMożejko的评论之后不起作用)

谢谢MarcinMożejko . 但我有类似的错误,如下所示 . 我更新了虚拟数据以供检查 . 这段代码有什么问题?

ValueError:检查模型目标时出错:预期timedistributed_36有3个维度,但得到的数组有形状(208,1)

def create_dataset(X, Y, loop_back=1):
    dataX, dataY = [], []
    for i in range(len(X) - loop_back-1):
        a = X[i:(i+loop_back), :]
        dataX.append(a)
        dataY.append(Y[i+loop_back, :])
    return np.array(dataX), np.array(dataY)

data_size = 300
dataset = np.zeros((data_size, feature_size), dtype=np.float32)
dataset_labels = np.zeros((data_size, 1), dtype=np.float32)

train_size = int(data_size * 0.7)
trainX = dataset[0:train_size, :]
trainY = dataset_labels[0:train_size, :]
testX = dataset[train_size:, :]
testY = dataset_labels[train_size:, 0]
trainX, trainY = create_dataset(trainX, trainY)
print(trainX.shape, trainY.shape) # (208, 1, 1) (208, 1)

# in_size = 100
feature_size = 1
out_size = 1
nb_hidden = 8

model = Sequential()
model.add(LSTM(nb_hidden, 
               name='lstm',
               activation='tanh',
               return_sequences=True,
               input_shape=(1, feature_size)))

model.add(TimeDistributed(Dense(out_size, activation='softmax')))
adadelta = Adadelta(clipnorm=1.)
model.compile(optimizer=adadelta,
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(trainX, trainY, nb_epoch=10, batch_size=1)

1 回答

  • 3

    这是 LSTMLSTM 的一个非常经典的问题 . LSTM 输入形状应为 2d - 形状为 (sequence_length, nb_of_features) . 额外的第三个维度来自示例维度 - 因此提供给模型的表格具有形状 (nb_of_examples, sequence_length, nb_of_features) . 这是您的问题所在 . 请记住, 1-d 序列应显示为 2-d 数组,形状为 (sequence_length, 1) . 这应该是 LSTM 的输入形状:

    model.add(LSTM(nb_hidden, 
               name='lstm',
               activation='tanh',
               return_sequences=True,
               input_shape=(in_size, 1)))
    

    并记住以适当的格式输入 reshape .

相关问题