Не удается получить тензор потока для построения модели, которая будет даже соответствовать очень простому линейному графику - PullRequest
2 голосов
/ 05 мая 2019

Кажется, я не могу получить тензорный поток для построения модели, которая соответствует даже простейшему линейному графику.Ниже приведен код и фактические результаты модели.Что я делаю неправильно?

import numpy as np
import matplotlib.pyplot as plt
import keras

x = np.array([[1965.0], [1980.0]])
y = np.array([[320.0], [345.0]])

plt.plot(x, y)
model = keras.Sequential([keras.layers.Dense(1, activation='linear')])
model.compile(optimizer='adam',
              loss="mean_squared_error")
model.fit(x=x, y=y, epochs=10000)


yHat = model.predict(x)
print("yHat ", yHat)
plt.plot(x, yHat)
plt.show()

Results

1 Ответ

1 голос
/ 06 мая 2019

Вы на правильном пути, просто упускаете некоторые ключевые моменты при нормализации ваших данных и построении модели.

  1. В вашей нейронной сети есть только 2 точки данных.Вместо этого используйте np.arange() для создания большего массива.

  2. Нейронные сети, такие как точки данных между 0 и 1 (помогает в обучении конвергенции).Итак, давайте преобразуем массивы x и y с помощью sklearn.MinMaxScaler:
    (это преобразует каждую переменную между 0 и 1, основываясь на ее значении, в минимальное и максимальное значения массива)

from sklearn.preprocessing import MinMaxScaler  
scaler = MinMaxScaler()  
x = scaler.fit_transform(np.arange(1965, 1990).reshape(-1,1))  
y = scaler.fit_transform(np.arange(320, 345).reshape(-1,1))

(примечание: мы изменяем x, y, чтобы соответствовать массиву (1,0) numpy)

Затем мы можем построить модель, используя 1 линейный плотный слой:
epochs = 20
model = keras.Sequential()
model.add(Dense( units=1, input_dim=1, activation="linear" ))

## Establishing optimizer so that we can modify the learning rate >= 1
sgd = keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)
model.compile( optimizer=sgd, loss="mean_squared_error" )
model.fit( x, y, batch_size=1, epochs=epochs)
Наконец, мы можем построить прогнозные и фактические переменные Y:
predicted = model.predict(x)
predicted = predicted + .01 ## offset prediction so the two lines don't overlap

plt.plot(scaler.inverse_transform(y), label='actual_y')
plt.plot(scaler.inverse_transform(predicted), label='predicted_y')
plt.legend(loc='upper left')
plt.show()

(Примечание: мы обращаемся к sklearn.tranform, чтобы показать фактические данные вместо Scaled версии)

Итоговый код все вместе:

import numpy as np
import matplotlib.pyplot as plt
import keras
from keras.layers.core import Dense

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

epochs = 20

## Using np.arange() instead of np.array()
## Transforming x,y so that the model can understand the variables
x = scaler.fit_transform(np.arange(1965, 1990).reshape(-1,1))
y = scaler.fit_transform(np.arange(320, 345).reshape(-1,1))

model = keras.Sequential()
model.add(Dense( units=1, input_dim=1, activation="linear" ))

## Establishing optimizer so that we can modify the learning rate >= 1
sgd = keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)
model.compile( optimizer=sgd, loss="mean_squared_error" )
model.fit( x, y, batch_size=1, epochs=epochs)

predicted = model.predict(x)
predicted = predicted + .01 ## offset prediction so the two lines don't overlap

plt.plot(scaler.inverse_transform(y), label='actual_y')
plt.plot(scaler.inverse_transform(predicted), label='predicted_y')
plt.legend(loc='upper left')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...