Простая линейная регрессия с использованием Keras - PullRequest
0 голосов
/ 05 июля 2018

Я пытался реализовать простую модель линейной регрессии, используя нейронные сети в Keras, в надежде понять, как мы работаем в библиотеке Keras. К сожалению, я получаю очень плохую модель. Вот реализация:

from pylab import *
from keras.models import Sequential
from keras.layers import Dense

#Generate dummy data
data = data = linspace(1,2,100).reshape(-1,1)
y = data*5

#Define the model
def baseline_model():
   model = Sequential()
   model.add(Dense(1, activation = 'linear', input_dim = 1))
   model.compile(optimizer = 'rmsprop', loss = 'mean_squared_error', metrics = ['accuracy'])
   return model


#Use the model
regr = baseline_model()
regr.fit(data,y,epochs =200,batch_size = 32)
plot(data, regr.predict(data), 'b', data,y, 'k.')

Сгенерированный участок выглядит следующим образом:

Plot

Может ли кто-нибудь указать на недостаток в приведенном выше определении модели (который может обеспечить лучшее соответствие)?

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Приведенный ниже код лучше всего подходит для ваших данных.

Взгляни на это.

from pylab import *
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
%matplotlib inline

# Создать фиктивные данные

data = data = linspace(1,2,100).reshape(-1,1)
y = data*5

# Определить модель

def baseline_model():
    global num_neurons
    model = Sequential()
    model.add(Dense(num_neurons, activation = 'linear', input_dim = 1))
    model.add(Dense(1 , activation = 'linear'))
    model.compile(optimizer = 'rmsprop', loss = 'mean_squared_error')
    return model

установить num_neurons в первом плотном слое

** Вы можете изменить его позже

num_neurons = 17

# Используйте модель

regr = baseline_model()
regr.fit(data,y,epochs =200, verbose = 0)
plot(data, regr.predict(data), 'bo', data,y, 'k-')

первый график с num_neurons = 17 хорошо подходит.

Но даже мы можем исследовать больше.

нажмите на ссылки ниже, чтобы увидеть графики

График для num_neurons = 12

Участок для num_neurons = 17

Участок для num_neurons = 19

Участок для num_neurons = 20

Вы можете видеть это, когда мы увеличиваем количество нейронов

наша модель становится все умнее. и лучше всего подходит.

Надеюсь, вы поняли.

Спасибо

0 голосов
/ 05 июля 2018

Вы должны увеличить скорость обучения оптимизатора. Значение скорости обучения по умолчанию в оптимизаторе RMSprop установлено на 0.001, поэтому модели требуется несколько сотен эпох, чтобы приблизиться к окончательному решению (возможно, вы сами это заметили, что значение потерь медленно уменьшается, как показано на тренинге). журнал). Для установки скорости обучения импорт optimizers модуль:

from keras import optimizers

# ...
model.compile(optimizer=optimizers.RMSprop(lr=0.1), loss='mean_squared_error', metrics=['mae'])

Либо из 0.01, либо 0.1 должно работать нормально. После этой модификации вам может не понадобиться обучать модель на 200 эпох. Даже 5, 10 или 20 эпох может быть достаточно.

Также обратите внимание, что вы выполняете задачу регрессии (то есть прогнозируете действительные числа), и 'accuracy' в качестве метрики используется, когда вы выполняете задачу классификации (то есть предсказываете дискретные метки, такие как категория изображения). Поэтому, как вы можете видеть выше, я заменил его на mae (т.е. означает абсолютную ошибку), что также гораздо более интерпретируемо, чем значение потери (т.е. средняя квадратическая ошибка), использованное здесь.

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