ошибка как функция размера набора данных - керас - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь показать простую вещь (якобы).Я хочу показать, что чем больше примеров у меня в диапазоне, тем лучше должна быть производительность.Я манипулирую количеством точек данных в наборе данных [10,20,40,200,2000].Я использую val_loss, но не похоже, что чем больше точек данных, тем меньше должна быть потеря.Мой вопрос: почему потеря не становится ниже, чем больше очков я добавляю к набору данных (делает ли Керас то, что я ожидаю?).

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD,Adam
from keras import regularizers
import numpy as np
#np.random.seed(seed=1)
import matplotlib.pyplot as plt
%matplotlib inline  
import random
import math
from numpy.random import seed
import random
import sklearn
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import PolynomialFeatures

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 func(x):
    function=np.sin(3*x)/2 + np.cos(5*x)/2 + np.sin(20*x)
    return function

def train_model(x_train,y_train,x_test):
    #seed(5)
    model=Sequential()
    num_units=100
    act='relu'
    model.add(Dense(num_units,input_shape=(1,),activation=act,kernel_initializer='random_uniform')) 
    model.add(Dense(num_units,activation=act,kernel_initializer='random_uniform'))
    model.add(Dense(num_units,activation=act,kernel_initializer='random_uniform'))
    model.add(Dense(num_units,activation=act,kernel_initializer='random_uniform'))
    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=32,epochs=500,verbose=1,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 loss,val_loss,fit

Ns=[10,20,40,200,2000]
start_point=-5.25 #-1
end_point=5.25 #1
#base=550#[0.001,1.5,5,40,400]#545 np.arange(0.05,1,0.05).tolist()#[450,0.75]#[0.5,2,5,10,100,300]#Final:[0.001,500
test_step=0.0007
x_test=np.arange(start_point,end_point,test_step)
y_test=func(x_test)

loss=[]
val_loss=[]
fit=[]
list_y_train=[]
list_x_train=[]

for N in Ns:
    x_train=np.linspace(start_point, end_point, num=N, endpoint=True)#xrange(start_point,end_point,N,b)
    func_train=func(x_train)#np.sin(3*x_train)/2 + np.cos(5*x_train)/2 + np.sin(7*x_train) #### write a functino
    noise=np.random.uniform(-0.2,0.2,len(x_train))
    y_train=func_train+noise
    l,v,f=train_model(x_train,y_train,x_test)
    loss.append(y_train)
    val_loss.append(v)
    fit.append(f)
    list_x_train.append(x_train)
    list_y_train.append(y_train)


y_ideal=func(x_test)#func np.sin(3*x_train)/2
k=1
for f in fit:
    p=plt.subplot(len(fit), 1, k)
    #plt.plot(x_train,y_ideal,'k')
    plt.scatter(list_x_train[k-1], list_y_train[k-1], facecolors='none', edgecolors='g') #plt.plot(x_value,sample,'bo')
    plt.scatter(x_test, f, facecolors='none', edgecolors='b') #plt.plot(x_value,sample,'bo')
    plt.plot(x_test,y_ideal,'k')
    k=k+1

enter image description here

plt.plot(np.asarray(val_loss[0]),label=str(Ns[0]))
plt.plot(np.asarray(val_loss[1]),label=str(Ns[1]))
plt.plot(np.asarray(val_loss[2]),label=str(Ns[2]))
plt.plot(np.asarray(val_loss[3]),label=str(Ns[3]))
plt.plot(np.asarray(val_loss[4]),label=str(Ns[4]))

plt.legend()

enter image description here

...