我正在尝试在喀拉拉邦实现全梯度下降。这意味着我要针对每个时期在整个数据集上进行训练。这就是为什么将批次大小定义为训练集的长度大小的原因。
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)时-为了改组训练。 :
我不明白为什么会得到不同的情节(绿色圆圈代表训练,蓝色圆圈代表现代人学到的东西)。因为在这两种情况下,批次都是所有数据集。因此,洗牌不应该改变任何事情。
谢谢 。
Ariel
答案 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()
在上一个图中,训练和验证数据分别由绿色和红色点表示。请注意,您的训练数据集不能代表整个人群。
除了不适当的训练/测试拆分外,完整梯度下降可能需要更多的训练时间来收敛(梯度噪声较小,但仅执行一次每个时期进行渐变更新)。相反,如果您以大约1500个时间段训练模型(或使用批量大小为例如32的小批量梯度下降),则最终会得到: