喀拉斯河的全梯度下降

时间:2018-12-13 20:24:59

标签: python machine-learning keras deep-learning gradient-descent

我正在尝试在喀拉拉邦实现全梯度下降。这意味着我要针对每个时期在整个数据集上进行训练。这就是为什么将批次大小定义为训练集的长度大小的原因。

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

我不明白为什么会得到不同的情节(绿色圆圈代表训练,蓝色圆圈代表现代人学到的东西)。因为在这两种情况下,批次都是所有数据集。因此,洗牌不应该改变任何事情。
谢谢 。

Ariel

1 个答案:

答案 0 :(得分:6)

发生这种情况有两个原因:

  • 首先,当不对数据进行混洗时,训练/验证拆分是不合适的。
  • 第二,完整梯度下降每个时期执行一次更新,因此需要更多的训练时期可能收敛。

为什么您的模型与波浪不匹配?

来自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

在上一个图中,训练和验证数据分别由绿色和红色点表示。请注意,您的训练数据集不能代表整个人群。


为什么它仍然与训练数据集不匹配?

除了不适当的训练/测试拆分外,完整梯度下降可能需要更多的训练时间来收敛(梯度噪声较小,但仅执行一次每个时期进行渐变更新)。相反,如果您以大约1500个时间段训练模型(或使用批量大小为例如32的小批量梯度下降),则最终会得到:

Result