简单循环神经网络的输入形状

8
我正在尝试使用Keras编写一个非常简单的RNN示例,但结果并不如预期。
我的X_train是一个重复的列表,长度为6000,例如:1, 0, 0, 0, 0, 0, 1, 0, 0, 0, ... 我将其格式化为(6000, 1, 1)的形状。
我的y_train也是一个重复的列表,长度为6000,例如:1, 0.8, 0.6, 0, 0, 0, 1, 0.8, 0.6, 0, ... 我将其格式化为(6000, 1)的形状。
据我理解,循环神经网络应该能够正确地预测0.8和0.6,因为它可以记住两个时间步骤之前的X_train中的1。
我的模型:
model=Sequential()
model.add(SimpleRNN(input_dim=1, output_dim=50))
model.add(Dense(output_dim=1, activation = "sigmoid"))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, batch_size=32)

这个模型可以成功地训练,最小损失只有0.1015,但是结果并不如预期。

test case ---------------------------------------------  model result -------------expected result 

model.predict(np.array([[[1]]])) --------------------0.9825--------------------1

model.predict(np.array([[[1],[0]]])) ----------------0.2081--------------------0.8

model.predict(np.array([[[1],[0],[0]]])) ------------0.2778 -------------------0.6

model.predict(np.array([[[1],[0],[0],[0]]]))---------0.3186--------------------0

有什么提示可以帮我理解这里的误解吗?
1个回答

20

输入格式应该是三维的:三个分量分别表示样本大小、时间步数和输出维度。

一旦适当地重新格式化,RNN确实可以很好地预测目标序列。

np.random.seed(1337)

sample_size = 256
x_seed = [1, 0, 0, 0, 0, 0]
y_seed = [1, 0.8, 0.6, 0, 0, 0]

x_train = np.array([[x_seed] * sample_size]).reshape(sample_size,len(x_seed),1)
y_train = np.array([[y_seed]*sample_size]).reshape(sample_size,len(y_seed),1)

model=Sequential()
model.add(SimpleRNN(input_dim  =  1, output_dim = 50, return_sequences = True))
model.add(TimeDistributed(Dense(output_dim = 1, activation  =  "sigmoid")))
model.compile(loss = "mse", optimizer = "rmsprop")
model.fit(x_train, y_train, nb_epoch = 10, batch_size = 32)

print(model.predict(np.array([[[1],[0],[0],[0],[0],[0]]])))
#[[[ 0.87810659]
#[ 0.80646527]
#[ 0.61600274]
#[ 0.01652312]
#[ 0.00930419]
#[ 0.01328572]]]

1
  • 函数式编程,我的第一次运行RNN模型 :)
- Masud Rahman
为了保持传统,给1337加上+1。 - Mindaugas Bernatavičius

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