数值错误:输入0与层simple_rnn_1不兼容:在Keras中预期ndim=3,但发现ndim=2

3
我将尝试在Keras中创建这个简单的RNN架构:
  • 24个输入神经元的输入层
  • 4个隐藏神经元的循环隐藏层
  • 4个输出神经元的输出层
以下是我的代码:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation
from keras.layers import SimpleRNN

#fix random seed
np.random.seed(7)

trainX = np.loadtxt('trainX.csv', delimiter=',', dtype=np.float32)
trainT = np.loadtxt('trainT.csv', delimiter=',', dtype=np.float32)

print(trainX)
print(trainT)
print(trainX.shape[1])

HIDDEN_LAYERS = 4

model = Sequential()

model.add(Dense(output_dim=HIDDEN_LAYERS, input_dim=trainX.shape[1]))
model.add(Activation("relu"))
model.add(SimpleRNN(4, input_dim=trainX.shape[1], input_length=128))
model.add(Activation("relu"))
model.add(Dense(output_dim=4))
model.add(Activation("softmax"))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(trainX, trainT, nb_epoch=20, batch_size=128)

当我运行这段代码时,在添加SimpleRNN层的那一行出现了以下错误:
ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2

有人知道发生了什么吗?trainX.shape[1]的值为24。

1个回答

1

您可以将SimpleRNN添加为第一层,并在第一层之后更改训练数据的形状,如下所示:

trainX=trainX.reshape(trainX.shape[0],1,trainX.shape[1])

model = Sequential()
model.add(SimpleRNN(4,  input_shape=(trainX.shape[1:])))
model.add(Dense(output_dim=HIDDEN_LAYERS))
model.add(Activation("relu"))
model.add(Dense(output_dim=4))
model.add(Activation("softmax"))
...

或者添加一个Reshape层,而不需要对trainX进行重塑,就像这样:
from keras.layers import Reshape

model = Sequential()
model.add(Dense(output_dim=HIDDEN_LAYERS, input_dim=trainX.shape[1]))
model.add(Activation("relu"))
model.add(Reshape((1,4)))
model.add(SimpleRNN(4))
model.add(Dense(output_dim=4))
model.add(Activation("softmax"))
...

谢谢!将SimpleRNN作为第一层添加,会创建我想要的相同架构吗(一个非循环的输入层)? - QQQQQQQQQQQQQQQQQQ
我发现trainX.reshape((trainX.shape[0], trainX.shape[1], 1))trainX=trainX.reshape(trainX.shape[0],1,trainX.shape[1])更适合我的情况。 - Cherry Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接