Линейная модель Tensorflow возвращает nan - PullRequest
0 голосов
/ 13 июля 2020

У меня очень простая модель, в которой я пытаюсь предсказать значение выражения 2x - 2

Она работает хорошо, но вот мой вопрос.

Пока что я обучал ее на основе всего 20 значений (от -10 до 10), и он отлично работает. Я не понимаю, что когда я тренирую его на большем количестве значений, скажем, (-10 to 25), мой прогноз возвращает [[nan]]. Даже веса модели равны [<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[nan]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([nan], dtype=float32)>]

Почему добавление дополнительных обучающих данных приводит к nan?

import tensorflow as tf
import numpy as np
from tensorflow import keras


def gen_vals(x):
    return x*2 - 2

model = tf.keras.Sequential([
    keras.layers.InputLayer(input_shape=(1,)),
    keras.layers.Dense(units=1)
])

model.compile(optimizer='sgd', loss='mean_squared_error', metrics=['accuracy'])

xs = []
ys = []
for x in range(-10, 10):
    xs.append(x)
    ys.append(gen_vals(x))

xs = np.array(xs, dtype=float)
ys = np.array(ys, dtype=float)

model.fit(xs, ys, epochs=500)

print(model.predict([20]))

1 Ответ

0 голосов
/ 13 июля 2020

Итак, я проверил ваш код, и проблема в вашей функции потерь. Вы используете mean_squared_erro. Из-за этого ваша ошибка достигает бесконечности.

Epoch 1/15
7/7 [==============================] - 0s 1ms/step - loss: 22108.5449 - accuracy: 0.0000e+00
Epoch 2/15
7/7 [==============================] - 0s 1ms/step - loss: 2046332.6250 - accuracy: 0.0286
Epoch 3/15
7/7 [==============================] - 0s 1ms/step - loss: 18862860288.0000 - accuracy: 0.0000e+00
Epoch 4/15
7/7 [==============================] - 0s 1ms/step - loss: 8550264864768.0000 - accuracy: 0.0286
Epoch 5/15
7/7 [==============================] - 0s 1ms/step - loss: 24012283831123968.0000 - accuracy: 0.0000e+00
Epoch 6/15
7/7 [==============================] - 0s 1ms/step - loss: 22680820415763316736.0000 - accuracy: 0.0000e+00
Epoch 7/15
7/7 [==============================] - 0s 1ms/step - loss: 1655609635839244500992.0000 - accuracy: 0.0000e+00
Epoch 8/15
7/7 [==============================] - 0s 1ms/step - loss: 611697420191128514199552.0000 - accuracy: 0.0000e+00
Epoch 9/15
7/7 [==============================] - 0s 1ms/step - loss: 229219278753403035799519232.0000 - accuracy: 0.0286
Epoch 10/15
7/7 [==============================] - 0s 1ms/step - loss: 2146224141449145393293494845440.0000 - accuracy: 0.0000e+00
Epoch 11/15
7/7 [==============================] - 0s 1ms/step - loss: 1169213631609383639522618269237248.0000 - accuracy: 0.0000e+00
Epoch 12/15
7/7 [==============================] - 0s 1ms/step - loss: 1042864695227246165669313090114551808.0000 - accuracy: 0.0000e+00
Epoch 13/15
7/7 [==============================] - 0s 1ms/step - loss: inf - accuracy: 0.0286                                        
Epoch 14/15
7/7 [==============================] - 0s 3ms/step - loss: inf - accuracy: 0.0286
Epoch 15/15
7/7 [==============================] - 0s 1ms/step - loss: inf - accuracy: 0.0286

Поскольку функция потерь MSE возводит в квадрат фактические потери, и из-за набора данных игрушек, который у вас есть, может случиться так, что он достигнет inf, как в вашем случае.

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

import tensorflow as tf
import numpy as np
from tensorflow import keras


def gen_vals(x):
    return x*2 - 2

model = tf.keras.Sequential([
    keras.layers.InputLayer(input_shape=(1,)),
    keras.layers.Dense(units=1)
])

model.compile(optimizer='sgd', loss='mae', metrics=['accuracy'])

xs = []
ys = []
for x in range(-10, 25):
    xs.append(x)
    ys.append(gen_vals(x))

Epoch 1/15
7/7 [==============================] - 0s 1ms/step - loss: 14.5341 - accuracy: 0.0000e+00
Epoch 2/15
7/7 [==============================] - 0s 2ms/step - loss: 7.5144 - accuracy: 0.0000e+00
Epoch 3/15
7/7 [==============================] - 0s 2ms/step - loss: 2.0986 - accuracy: 0.0000e+00
Epoch 4/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4349 - accuracy: 0.0000e+00
Epoch 5/15
7/7 [==============================] - 0s 1ms/step - loss: 1.3424 - accuracy: 0.0000e+00
Epoch 6/15
7/7 [==============================] - 0s 1ms/step - loss: 1.5290 - accuracy: 0.0000e+00
Epoch 7/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4349 - accuracy: 0.0000e+00
Epoch 8/15
7/7 [==============================] - 0s 1ms/step - loss: 1.2839 - accuracy: 0.0000e+00
Epoch 9/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4003 - accuracy: 0.0000e+00
Epoch 10/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4593 - accuracy: 0.0000e+00
Epoch 11/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4561 - accuracy: 0.0000e+00
Epoch 12/15
7/7 [==============================] - 0s 1ms/step - loss: 1.4761 - accuracy: 0.0000e+00
Epoch 13/15
7/7 [==============================] - 0s 2ms/step - loss: 1.3080 - accuracy: 0.0000e+00
Epoch 14/15
7/7 [==============================] - 0s 1ms/step - loss: 1.1885 - accuracy: 0.0000e+00
Epoch 15/15
7/7 [==============================] - 0s 1ms/step - loss: 1.2665 - accuracy: 0.0000e+00
[[38.037006]]
...