import tensorflow as tf

        dec = tf.layers.max_pooling1d(dec, pool_size=2, strides=1, padding="same")
        dec = tf.layers.conv1d(dec, embed_size // 2, 3, name="decoder-conv1-1", padding="SAME")
        dec = tf.nn.relu(tf.layers.batch_normalization(dec, training=self.training))
        dec = tf.layers.conv1d(dec, embed_size // 2, 3, name="decoder-conv1-2", padding="SAME")
        dec = tf.layers.batch_normalization(dec, training=self.training)
        dec = tf.layers.dense(dec, embed_size // 2)
        for i in range(4):
            dec = highwaynet(
                dec, num_units=embed_size // 2, scope="decoder-highwaynet-{}".format(i)
            )
        with tf.variable_scope("decoder-gru", reuse=False):
            cell = tf.contrib.rnn.GRUCell(embed_size // 2)
            cell_bw = tf.contrib.rnn.GRUCell(embed_size // 2)
            outputs, _ = tf.nn.bidirectional_dynamic_rnn(cell, cell_bw, dec, dtype=tf.float32)
            outputs = tf.concat(outputs, 2)
        self.Z_hat = tf.layers.dense(outputs, 1 + fourier_window_size // 2)
        self.loss1 = tf.reduce_mean(tf.abs(self.Y_hat - self.Y))
        self.loss2 = tf.reduce_mean(tf.abs(self.Z_hat - self.Z))
        self.loss = self.loss1 + self.loss2
        self.optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(self.loss)
