caicloud / tensorflow-tutorial

Example TensorFlow codes and Caicloud TensorFlow as a Service dev environment.
2.93k stars 2.08k forks source link

8.4.2节预测正弦函数的疑惑 #71

Closed whm1006 closed 6 years ago

whm1006 commented 7 years ago

您好!在预测正弦函数的实例中,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,真的想不通为什么。烦请指教!

whm1006 commented 7 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]才对吧?

Hailprob commented 6 years ago

@wanghaoming1006 ,你好,我也有同样的问题,请问你后来修改通了吗

whm1006 commented 6 years ago

@Hailprob 暂时还没有,之后如果理解了会分享

forqzy commented 6 years ago

@wanghaoming1006 @Hailprob 这个问题我也是想了很久才明白的,参照另一个,用keras写了一个,希望对大家有帮助 https://github.com/forqzy/keras-LSTM-predict-study

whm1006 commented 6 years ago

@forqzy 感谢分享

whm1006 commented 6 years ago

对于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

如有理解错的地方,欢迎指正