Closed whm1006 closed 6 years ago
另外,tf版本1.0.0,输入X的shape感觉好像不对: 根据tf.nn.dynamic_rnn(cell, inputs)的文档,inputs的shape应该是[batch_size, time_steps, ...], 但由generate函数得到的X的shape是[batch_size, 1, 10],这里time_step=10不是应该在第二个维度吗? X的shape应该是[batch_size, 10, 1]才对吧?
@wanghaoming1006 ,你好,我也有同样的问题,请问你后来修改通了吗
@Hailprob 暂时还没有,之后如果理解了会分享
@wanghaoming1006 @Hailprob 这个问题我也是想了很久才明白的,参照另一个,用keras写了一个,希望对大家有帮助 https://github.com/forqzy/keras-LSTM-predict-study
@forqzy 感谢分享
对于HIDDEN_SIZE的问题:换了台机器,改变HIDDEN_SIZE并不会报错,可能是设置问题。
对于1.0.0版本中X的shape问题:参考Mourad的原文,认为输入的shape应该是[batch_size, 10, 1]。我将源代码中的输入X改成[batch_size, 10, 1]后也有相同的预测效果:
def generate_data(seq):
X = []
y = []
for i in range(len(seq) - TIMESTEPS - 1):
X.append([[x] for x in seq[i: i + TIMESTEPS]]) # 此处将输入修改为[batch_size, 10, 1]
y.append([seq[i + TIMESTEPS]])
return np.array(X, dtype=np.float32), np.array(y, dtype=np.float32)
def lstm_model(X, y):
lstm_cell = tf.contrib.rnn.BasicLSTMCell(HIDDEN_SIZE, state_is_tuple=True)
cell = tf.contrib.rnn.MultiRNNCell([lstm_cell] * NUM_LAYERS)
output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
output = tf.unstack(output, axis=1)[-1] # 此处修改为最后时刻的输出
# 通过无激活函数的全联接层计算线性回归,并将数据压缩成一维数组的结构。
predictions = tf.contrib.layers.fully_connected(output, 1, None)
# 将predictions和labels调整统一的shape
labels = tf.reshape(y, [-1])
predictions=tf.reshape(predictions, [-1])
loss = tf.losses.mean_squared_error(predictions, labels)
train_op = tf.contrib.layers.optimize_loss(
loss, tf.contrib.framework.get_global_step(),
optimizer="Adagrad", learning_rate=0.1)
return predictions, loss, train_op
如有理解错的地方,欢迎指正
您好!在预测正弦函数的实例中,HIDDEN_SIZE为什么要设置成30呢?
我查阅了关于HIDDEN_SIZE的资料,发现这个参数反映网络的学习能力,可根据经验设置。但为何我把HIDDEN_SIZE修改为其他数值时(例如20、40等),程序就跑不通了呢?(会报错Invalid Argument Error: Assign requires shapes of both tensors to match)按理说如果可以根据经验设置,应该类似BATCH_SIZE,设置在合理范围就不会影响程序的运行吧?
在8.4.1节PTB的程序中HIDDEN_SIZE取值为词向量的维度,这个很好理解,但这里取值是30,真的想不通为什么。烦请指教!