GRU的配置相同,但以两种不同的方式产生两种不同的10进制输出

2024-09-30 20:24:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用GRU在tensorflow中做一些序列预测。所以我用两种不同的方法创建了同一个模型,如下所示:

在模型1中,我有一个接一个的2个GRU,即第一个GRU的最终隐藏状态new_state1,充当第二个GRU的初始状态。因此,模型会相应地输出new_state1和{}。请注意,这不是2层模型,而是1层模型。从下面的代码中,我将输入和输出分成两部分,GRU1占第一部分,第二部分由GRU承担。在

此外,两个模型的random_seed也被设置和固定,以便结果可以比较。在

模型1

import tensorflow as tf
import numpy as np

cell_size = 32

seq_length = 1000

time_steps1 = 500
time_steps2 = seq_length - time_steps1

x_t = np.arange(1, seq_length + 1)    
x_t_plus_1 = np.arange(2, seq_length + 2)

tf.set_random_seed(123)

m_dtype = tf.float32

input_1 = tf.placeholder(dtype=m_dtype, shape=[None, time_steps1, 1], name="input_1")
input_2 = tf.placeholder(dtype=m_dtype, shape=[None, time_steps2, 1], name="input_2")

labels1 = tf.placeholder(dtype=m_dtype, shape=[None, time_steps1, 1], name="labels_1")
labels2 = tf.placeholder(dtype=m_dtype, shape=[None, time_steps2, 1], name="labels_2")

labels = tf.concat([labels1, labels2], axis=1, name="labels")

initial_state = tf.placeholder(shape=[None, cell_size], dtype=m_dtype, name="initial_state")

def model(input_feat1, input_feat2):
    with tf.variable_scope("GRU"):
        cell1 = tf.nn.rnn_cell.GRUCell(cell_size)
        cell2 = tf.nn.rnn_cell.GRUCell(cell_size)

        with tf.variable_scope("First50"):
            # output1: shape=[1, time_steps1, 32]
            output1, new_state1 = tf.nn.dynamic_rnn(cell1, input_feat1, dtype=m_dtype, initial_state=initial_state)

        with tf.variable_scope("Second50"):
            # output2: shape=[1, time_steps2, 32]
            output2, new_state2 = tf.nn.dynamic_rnn(cell2, input_feat2, dtype=m_dtype, initial_state=new_state1)

        with tf.variable_scope("output"):
            # output shape: [1, time_steps1 + time_steps2, 32] => [1, 100, 32]
            output = tf.concat([output1, output2], axis=1)

            output = tf.reshape(output, shape=[-1, cell_size])
            output = tf.layers.dense(output, units=1)
            output = tf.reshape(output, shape=[1, time_steps1 + time_steps2, 1])

        with tf.variable_scope("outputs_1_2_reshaped"):
            output1 = tf.slice(input_=output, begin=[0, 0, 0], size=[-1, time_steps1, -1])
            output2 = tf.slice(input_=output, begin=[0, time_steps1, 0], size=[-1, time_steps2, 1])

            print(output.get_shape().as_list(), "1")
            print(output1.get_shape().as_list(), "2")
            print(output2.get_shape().as_list(), "3")

            return output, output1, output2, initial_state, new_state1, new_state2

output, output1, output2, initial_state, new_state1, new_state2 = model(input_1, input_2)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)

    to_run_list = [new_state1, new_state2]

    in1 = np.reshape(x_t[:time_steps1], newshape=(1, time_steps1, 1))
    in2 = np.reshape(x_t[time_steps1:], newshape=(1, time_steps2, 1))
    l1 = np.reshape(x_t_plus_1[:time_steps1], newshape=(1, time_steps1, 1))
    l2 = np.reshape(x_t_plus_1[time_steps1:], newshape=(1, time_steps2, 1))
    i_s = np.zeros([1, cell_size])

    new_s1, new_s2 = sess.run(to_run_list, feed_dict={input_1: in1,
                                                              input_2: in2,
                                                              labels1: l1,
                                                              labels2: l2,
                                                              initial_state: i_s})

    print(np.shape(new_s1), np.shape(new_s2))

    print(np.mean(new_s1), np.mean(new_s2))
    print(np.sum(new_s1), np.sum(new_s2))

在这个模型中,我没有创建两个不同的GRU,而是创建了一个,并将输入和标签分成两个不同的部分,并使用for循环来迭代输入数据集。然后进入与模型相同的初始状态。在

注意,model1和model2的第一个初始状态都是零。在

模型2

^{pr2}$

最后,在打印出model1中new_state1和{}的统计信息后,它们与model2中每次迭代后的new_state不同。在

我想知道如何解决这个问题,为什么会这样。在

编辑:

我发现两个文件中gru的权重值是不同的

现在我怎样才能在两个不同的文件中复制相同的结果,即使设置了随机种子?在

非常感谢任何帮助!!!在


Tags: 模型newinputoutputsizetimetfnp
1条回答
网友
1楼 · 发布于 2024-09-30 20:24:51

因此,要在不同的文件中复制相同的结果,tf.set_random_seed()是不够的。我发现我们还需要为gru细胞的intializers设置种子,以及输出dense层中权重的initializers(这至少符合我的模型);因此,单元的定义现在是:

cell1 = tf.nn.rnn_cell.GRUCell(cell_size, kernel_initializer=tf.glorot_normal_initializer(seed=123, dtype=m_dtype))

对于致密层:

^{pr2}$

请注意,只要我们为它设置种子的数据类型,就可以使用任何其他初始值设定项。在

相关问题 更多 >