Reputation: 31
I'm trying to create this simple RNN architecture in Keras:
Here is my code:
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)
When I run this code, I get the following error on the line where I add a SimpleRNN layer:
ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2
Does anyone know what's going on? The value of trainX.shape[1] is 24
Upvotes: 3
Views: 2948
Reputation: 8537
you can add your SimpleRNN
as first layer and after your first change your train data shape like this:
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"))
...
or add a Reshape layer without reshaping trainX
, like this:
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"))
...
Upvotes: 1