我想建立一个神经网络,其中两个第一层是前馈,最后一个是递归的。
这是我的代码:

model = Sequential()
model.add(Dense(150, input_dim=23,init='normal',activation='relu'))
model.add(Dense(80,activation='relu',init='normal'))
model.add(SimpleRNN(2,init='normal'))
adam =OP.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="mean_squared_error", optimizer="rmsprop")

我得到这个错误:
Exception: Input 0 is incompatible with layer simplernn_11: expected  ndim=3, found ndim=2.
model.compile(loss='mse', optimizer=adam)

最佳答案

在keras中,rnn层希望输入(nb_samples, time_steps, input_dim),这是正确的。但是,如果要在密集层之后添加rnn层,则在重塑rnn层的输入后仍可以执行此操作。在序列模型中,整形既可以用作第一层,也可以用作中间层。下面给出例子:
在序列模型中重塑为第一层

model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# now: model.output_shape == (None, 3, 4)
# note: `None` is the batch dimension

在序列模型中作为中间层重塑
model.add(Reshape((6, 2)))
# now: model.output_shape == (None, 6, 2)

例如,如果按照以下方式更改代码,则不会出错。我已经检查了它和编译的模型,没有任何错误报告。您可以根据需要更改尺寸。
from keras.models import Sequential
from keras.layers import Dense, SimpleRNN, Reshape
from keras.optimizers import Adam

model = Sequential()
model.add(Dense(150, input_dim=23,init='normal',activation='relu'))
model.add(Dense(80,activation='relu',init='normal'))
model.add(Reshape((1, 80)))
model.add(SimpleRNN(2,init='normal'))
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="mean_squared_error", optimizer="rmsprop")

08-24 23:47