Почему моя простая линейная регрессия не работает - PullRequest
0 голосов
/ 15 апреля 2020

Я новичок в tenorflow-2, и я начинал свою кривую обучения, следуя простой модели линейной регрессии:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


# Make data
num_samples, w, b = 20, 0.5, 2
xs = np.asarray(range(num_samples))
ys = np.asarray([x*w + b + np.random.normal() for x in range(num_samples)])
xts = tf.convert_to_tensor(xs, dtype=tf.float32)
yts = tf.convert_to_tensor(xs, dtype=tf.float32)
plt.plot(xs, ys, 'ro')

class Linear(tf.keras.Model):
    def __init__(self, name='linear', **kwargs):
        super().__init__(name='linear', **kwargs)
        self.w = tf.Variable(0, True, name="w", dtype=tf.float32)
        self.b = tf.Variable(1, True, name="b", dtype=tf.float32)   

    def call(self, inputs):
        return self.w*inputs + self.b

class Custom(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        if epoch % 20 == 0:
            preds = self.model.predict(xts)
            plt.plot(xs, preds, label='{} {:7.2f}'.format(epoch, logs['loss']))
            print('The average loss for epoch {} is .'.format(epoch, logs['loss']))

x = tf.keras.Input(dtype=tf.float32, shape=[])
#model = tf.keras.Sequential([tf.keras.layers.Dense(units=1, input_shape=[1])])
model = Linear()
optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='MSE')
model.fit(x=xts, y=yts, verbose=1, batch_size=4, epochs=250, callbacks=[Custom()])

plt.legend()
plt.show()

По какой-то причине я не понимаю, похоже, что моя модель не соответствует кривой. Я также попытался с keras.layers.Dense (1), и у меня был точно такой же результат. Также кажется, что результаты не соответствуют надлежащей функции потерь, так как примерно в эпоху 120 модель должна иметь меньшие потери, чем в 250.

The rainbow of hopelessness

Можете ли вы помочь мне понять, что я делаю неправильно? Большое спасибо!

1 Ответ

2 голосов
/ 15 апреля 2020

В вашем коде есть небольшая ошибка, поскольку xts и yts идентичны друг другу, т.е. вы написали

xts = tf.convert_to_tensor(xs, dtype=tf.float32)
yts = tf.convert_to_tensor(xs, dtype=tf.float32)

вместо

xts = tf.convert_to_tensor(xs, dtype=tf.float32)
yts = tf.convert_to_tensor(ys, dtype=tf.float32)

, что почему потеря не имеет смысла. Как только это будет исправлено, результаты будут такими, как ожидалось, см. График ниже.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...