Как исправить TensorFlow Линейная регрессия без изменений в MSE? - PullRequest
0 голосов
/ 09 января 2019

Я работаю над простой моделью линейной регрессии, чтобы предсказать следующий шаг в серии. Я даю ему координаты х / у и хочу, чтобы регрессор предсказал, где будет лежать следующая точка на графике.

Я использую плотные слои с AdamOptmizer, и моя функция потерь установлена ​​на:

tf.reduce_mean(tf.square(layer_out - y))

Я пытаюсь создать модели линейной регрессии с нуля (я не хочу использовать здесь пакет оценки TF).

Я видел способы сделать это вручную, указав веса и смещения, но ничего не входит в глубокую регрессию.

    X = tf.placeholder(tf.float32, [None, self.data_class.batch_size, self.inputs])
    y = tf.placeholder(tf.float32, [None, self.data_class.batch_size, self.outputs])
    layer_input = tf.layers.dense(inputs=X, units=10, activation=tf.nn.relu)
    layer_hidden = tf.layers.dense(inputs=layer_input, units=10, activation=tf.nn.relu)
    layer_out = tf.layers.dense(inputs=layer_hidden, units=1, activation=tf.nn.relu)
    cost = tf.reduce_mean(tf.square(layer_out - y))
    optmizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
    training_op = optmizer.minimize(cost)

    init = tf.initialize_all_variables()
    iterations = 10000
    with tf.Session() as sess:
        init.run()
        for iteration in range(iterations):
            X_batch, y_batch = self.data_class.get_data_batch()
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
            if iteration % 100 == 0:
                mse = cost.eval(feed_dict={X:X_batch, y:y_batch})
                print(mse)
        array = []
        for i in range(len(self.data_class.dates), (len(self.data_class.dates)+self.data_class.batch_size)):
            array.append(i)
        x_pred = np.array(array).reshape(1, self.data_class.batch_size, 1)
        y_pred = sess.run(layer_out, feed_dict={X: x_pred})
        print(y_pred)
        predicted = np.array(y_pred).reshape(self.data_class.batch_size)
        predicted = np.insert(predicted, 0, self.data_class.prices[0], axis=0)
        plt.plot(self.data_class.dates, self.data_class.prices)
        array = [self.data_class.dates[0]]
        for i in range(len(self.data_class.dates), (len(self.data_class.dates)+self.data_class.batch_size)):
            array.append(i)

        plt.plot(array, predicted)
        plt.show()

Когда я бегу тренироваться, я снова и снова получаю одно и то же значение потери.

Это не уменьшается, как должно, почему?

1 Ответ

0 голосов
/ 09 января 2019

Проблема в том, что я применяю активацию к выходному слою. Это приводит к тому, что этот вывод идет во все, что он активирует.

Указав в последнем слое, что активация = Нет, глубокая регрессия работает как задумано.

Вот обновленная архитектура:

layer_input = tf.layers.dense(inputs=X, units=150, activation=tf.nn.relu)
    layer_hidden = tf.layers.dense(inputs=layer_input, units=100, activation=tf.nn.relu)
    layer_out = tf.layers.dense(inputs=layer_hidden, units=1, activation=None)
...