Полный градиентный спуск в керасе - PullRequest
0 голосов
/ 13 декабря 2018

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

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD,Adam
from keras import regularizers
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  
import random
from numpy.random import seed
import random

def xrange(start_point,end_point,N,base):
    temp = np.logspace(0.1, 1, N,base=base,endpoint=False)
    temp=temp-temp.min()
    temp=(0.0+temp)/(0.0+temp.max()) #this is between 0 and 1
    return (end_point-start_point)*temp +start_point #this is the range

def train_model(x_train,y_train,x_test):
    #seed(1)
    model=Sequential()
    num_units=100
    act='relu'
    model.add(Dense(num_units,input_shape=(1,),activation=act)) 
    model.add(Dense(num_units,activation=act))
    model.add(Dense(num_units,activation=act))
    model.add(Dense(num_units,activation=act))
    model.add(Dense(1,activation='tanh')) #output layer 1 unit ; activation='tanh'
    model.compile(Adam(),'mean_squared_error',metrics=['mse'])
    history=model.fit(x_train,y_train,batch_size=len(x_train),epochs=500,verbose=0,validation_split = 0.2 ) #train on the noise (not moshe)
    fit=model.predict(x_test)
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    return fit

N = 1024
start_point=-5.25
end_point=5.25
base=500# the base of the log of the trainning
train_step=0.0007
x_test=np.arange(start_point,end_point,train_step+0.05)

x_train=xrange(start_point,end_point,N,base)
#random.shuffle(x_train)

function_y=np.sin(3*x_train)/2
noise=np.random.uniform(-0.2,0.2,len(function_y))
y_train=function_y+noise
fit=train_model(x_train,y_train,x_test)

plt.scatter(x_train,y_train, facecolors='none', edgecolors='g') #plt.plot(x_value,sample,'bo')
plt.scatter(x_test, fit, facecolors='none', edgecolors='b') #plt.plot(x_value,sample,'bo')

enter image description here

Однако, когда я раскомментирую #random.shuffle (x_train) - чтобы перетасовать тренировку.plot:

Я не понимаю, почему я получаю разные сюжеты (зеленые кружки - это тренировка, а синие - то, чему научились современные).как и в обоих случаях, пакет имеет ВСЕ набор данных.Так что перетасовка не должна ничего менять.
Спасибо.

Ариэль

1 Ответ

0 голосов
/ 14 декабря 2018

Это происходит по двум причинам:

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

Почему ваша модель не соответствует волне?

С model.fit :

  • validation_split : Плавать в диапазоне от 0 до 1. Часть данных обучения, которые будут использоваться в качестве проверкиданные.Модель выделит эту часть обучающих данных, не будет обучаться им и будет оценивать потери и любые метрики модели на этих данных в конце каждой эпохи. Данные проверки выбираются из последних выборок в предоставленных данных x и y перед перетасовкой .

Это означает, что ваш набор проверки состоит из последних 20%учебные образцы.Поскольку вы используете логарифмическую шкалу для своей независимой переменной (x_train), получается, что ваш разделение поезда / проверки:

split_point = int(0.2*N)
x_val = x_train[-split_point:]
y_val = y_train[-split_point:]
x_train_ = x_train[:-split_point]
y_train_ = y_train[:-split_point]
plt.scatter(x_train_, y_train_, c='g')
plt.scatter(x_val, y_val, c='r')
plt.show()

Train - validation split

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


Почему он все еще не соответствует учебному набору данных?

В дополнение к неподходящему поезду/ test split, полный градиентный спуск может требует большего количества тренировочных эпох, чтобы сходиться (градиенты менее шумные, но он выполняет только одно обновление градиента за эпоху).Если вместо этого вы тренируете свою модель в течение ~ 1500 эпох (или используете мини-пакетный градиентный спуск с размером партии, скажем, 32), вы получите:

Result

...