2016-04-07 6 views
0

J'essaie, juste pour pratiquer avec Keras, pour former un réseau pour apprendre une fonction très facile. L'entrée du réseau est 2D dimensions. La sortie est unidimensionnelle. La fonction peut en effet être représentée avec une image, et il en est de même pour la fonction approximative. Pour l'instant je ne cherche pas de bonne généralisation, je veux juste que le réseau soit au moins bon pour représenter l'ensemble d'entraînement. Ici, je place mon code:La régression simple avec Keras ne semble pas fonctionner correctement

import matplotlib.pyplot as plt 
import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD 
import random as rnd 
import math 

m = [ 
[1,1,1,1,0,0,0,0,1,1], 
[1,1,0,0,0,0,0,0,1,1], 
[1,0,0,0,1,1,0,1,0,0], 
[1,0,0,1,0,0,0,0,0,0], 
[0,0,0,0,1,1,0,0,0,0], 
[0,0,0,0,1,1,0,0,0,0], 
[0,0,0,0,0,0,1,0,0,1], 
[0,0,1,0,1,1,0,0,0,1], 
[1,1,0,0,0,0,0,0,1,1], 
[1,1,0,0,0,0,1,1,1,1]]      #A representation of the function that I would like to approximize 

matrix = np.matrix(m) 

evaluation = np.zeros((100,100)) 

x_train = np.zeros((10000,2)) 
y_train = np.zeros((10000,1)) 

for x in range(0,100): 
    for y in range(0,100): 
     x_train[x+100*y,0] = x/100.    #I normilize the input of the function, between [0,1) 
     x_train[x+100*y,1] = y/100. 
     y_train[x+100*y,0] = matrix[int(x/10),int(y/10)] +0.0 


#Here I show graphically what I would like to have 
plt.matshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) 

#Here I built the model 
model = Sequential() 
model.add(Dense(20, input_dim=2, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dense(1, init='uniform')) 
model.add(Activation('sigmoid')) 

#Here I train it 
sgd = SGD(lr=0.5) 
model.compile(loss='mean_squared_error', optimizer=sgd) 

model.fit(x_train, y_train, 
      nb_epoch=100, 
      batch_size=100, 
      show_accuracy=True) 

#Here (I'm not sure), I'm using the network over the given example 
x = model.predict(x_train,batch_size=1) 

#Here I show the approximated function 
print x 
print x_train 
for i in range(0, 10000): 
    evaluation[int(x_train[i,0]*100),int(x_train[i,1]*100)] = x[i] 

plt.matshow(evaluation, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) 
plt.colorbar() 
plt.show() 

Comme vous pouvez le voir, les deux fonctions sont complètement différents, et je ne comprends pas pourquoi. Je pense que peut-être model.predict ne fonctionne pas comme je l'entends.

+0

Je ne vois pas que les deux fonctions sont différentes, semble qu'il y ait une parcelle manquante que vous reffering à. –

Répondre

1

Votre compréhension est correcte; c'est juste une question de réglage de l'hyperparamètre.

Je viens d'essayer votre code, et il semble que vous ne donnez pas votre temps assez de formation:

Regardez la perte, à moins de 100 époques, il est coincé à environ 0,23. Mais essayez d'utiliser l'adam 'otimizer au lieu de SGD, et augmentez le nombre d'époques jusqu'à 10.000: la perte diminue maintenant jusqu'à 0.09 et votre image semble beaucoup mieux.

Si ce n'est pas encore assez précis pour vous, vous pouvez également essayer d'augmenter le nombre de paramètres: il suffit d'ajouter quelques couches; Cela rendra le surissage beaucoup plus facile! :-)

+0

Merci, je voulais juste faire une expérience :-). Pourquoi adam optimizer fonctionne mieux? – Samuele

+0

Il y a beaucoup d'optimiseurs que vous pouvez utiliser. Pour vous donner une idée de la raison pour laquelle vous travaillez mieux que d'autres pour votre problème, consultez http://sebastianruder.com/content/images/2016/01/saddle_point_evaluation_optimizers.gif ou http://sebastianruder.com/content/images/2016/ 01/contours_evaluation_optimizers.gif – frbl

0

J'ai simplement changé la structure de votre réseau et ajouté un jeu de données d'entraînement. La perte diminue jusqu'à 0,01.

enter image description here

# -*- coding: utf-8 -*- 
""" 
Created on Thu Mar 16 15:26:52 2017 

@author: Administrator 
""" 

import matplotlib.pyplot as plt 
import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD 
import random as rnd 
import math 
from keras.optimizers import Adam,SGD 
m = [ 
[1,1,1,1,0,0,0,0,1,1], 
[1,1,0,0,0,0,0,0,1,1], 
[1,0,0,0,1,1,0,1,0,0], 
[1,0,0,1,0,0,0,0,0,0], 
[0,0,0,0,1,1,0,0,0,0], 
[0,0,0,0,1,1,0,0,0,0], 
[0,0,0,0,0,0,1,0,0,1], 
[0,0,1,0,1,1,0,0,0,1], 
[1,1,0,0,0,0,0,0,1,1], 
[1,1,0,0,0,0,1,1,1,1]]      #A representation of the function that I would like to approximize 

matrix = np.matrix(m) 

evaluation = np.zeros((1000,1000)) 

x_train = np.zeros((1000000,2)) 
y_train = np.zeros((1000000,1)) 

for x in range(0,1000): 
    for y in range(0,1000): 
     x_train[x+1000*y,0] = x/1000.    #I normilize the input of the function, between [0,1) 
     x_train[x+1000*y,1] = y/1000. 
     y_train[x+1000*y,0] = matrix[int(x/100),int(y/100)] +0.0 


#Here I show graphically what I would like to have 
plt.matshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) 

#Here I built the model 
model = Sequential() 
model.add(Dense(50, input_dim=2, init='uniform'))## init是关键字,’uniform’表示用均匀分布去初始化权重 
model.add(Activation('tanh')) 
model.add(Dense(20, init='uniform')) 
model.add(Activation('tanh')) 
model.add(Dense(1, init='uniform')) 
model.add(Activation('sigmoid')) 

#Here I train it 
#sgd = SGD(lr=0.01) 
adam = Adam(lr = 0.01) 
model.compile(loss='mean_squared_error', optimizer=adam) 

model.fit(x_train, y_train, 
      nb_epoch=100, 
      batch_size=100, 
      show_accuracy=True) 

#Here (I'm not sure), I'm using the network over the given example 
x = model.predict(x_train,batch_size=1) 

#Here I show the approximated function 
print (x) 
print (x_train) 
for i in range(0, 1000000): 
    evaluation[int(x_train[i,0]*1000),int(x_train[i,1]*1000)] = x[i] 

plt.matshow(evaluation, interpolation='nearest', cmap=plt.cm.ocean, extent=(0,1,0,1)) 
plt.colorbar() 
plt.show()