【问题标题】:Full gradient descent in keraskeras 中的全梯度下降
【发布时间】:2019-05-15 02:59:03
【问题描述】:

我正在尝试在 keras 中实现完全梯度下降。这意味着对于每个时期,我都在整个数据集上进行训练。这就是为什么将批大小定义为训练集的长度大小的原因。

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')

但是,当我取消注释 #random.shuffle(x_train) 时 - 为了调整训练。 :

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

爱丽儿

【问题讨论】:

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


    【解决方案1】:

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

    • 首先,当数据没有被shuffle时,train/validation split是不合适的。
    • 其次,完全梯度下降在每个 epoch 执行一次更新,因此可能需要更多的训练 epoch 才能收敛。

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

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

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


    为什么还是不匹配训练数据集?

    除了不适当的训练/测试拆分之外,完全梯度下降可能需要更多的训练 epoch 才能收敛(梯度噪声较小,但它只执行一次每个时期的梯度更新)。相反,如果你训练你的模型大约 1500 个 epoch(或者使用批量大小为 32 的小批量梯度下降),你最终会得到:

    【讨论】:

    • 如果我使用 .fit 而没有任何额外的规范,“adam”是否默认使用小批量?我认为 min-batch 是专门针对 GD/SGD 之类的,而不是 Adam。
    • @VISQL 优化算法与批量大小无关(在 fit 中默认为 32)。设置batch_size=1 产生SGD,而batch_size=nb_total_samples 对应于完全梯度下降。您可以通过在两者之间设置一个值来执行小批量梯度下降(这是最典型的选择)。
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 2016-06-13
    • 2020-06-03
    • 2014-07-22
    • 2017-06-23
    • 2015-11-17
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多