2016-04-07 44 views
0

Ben sadece çok kolay bir işlev öğrenmek için bir ağ eğitmek için, Keras ile pratik için çalışıyoruz. Ağın girişi 2Dimensional'dur. Çıktı tek boyutlu'dur. Fonksiyon gerçekten bir görüntü ile temsil edilebilir ve aynı fonksiyon yaklaşık aynıdır. Şu anda iyi bir genelleme aramıyorum, sadece ağın eğitim setini temsil etmede en azından iyi olmasını istiyorum. Gördüğünüz gibiKeras ile basit bir regresyon düzgün çalışmıyor

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

, iki fonksiyon tamamen farklıdır ve sebebini anlayamıyorum: İşte benim kodu yerleştirebilirsiniz. Belki de model.predict, aksanlı çalıştığım gibi çalışmıyor.

+0

Ben iki işlev farklı olduğunu görmüyorum, sen reffering olan eksik bir arsa var gibi görünüyor. –

cevap

1

Anlayışınız doğru; Bu sadece hiperparametre ayarlaması meselesi.

Sadece kodunuzu çalıştı ve size eğitim yeterli zaman vermiyorsun gibi görünüyor: 100 çağlarında altında, zararına

Bak, etrafında 0.23 de sıkışmış. Ama SGD yerine 'adam' otimizer'ı kullanmayı deneyin ve 10,000'e kadar olan zamanların sayısını artırın: kayıp şimdi 0,09'a iner ve resminiz daha iyi görünür.

Hala sizin için yeterince hassas değilse, parametre sayısını artırmayı da deneyebilirsiniz: sadece birkaç katman ekleyin; Bu aşırı kolay hale getirecek! :-)

+0

Teşekkürler, sadece bir deneme yapmak istedim :-). Neden adam optimizer daha iyi çalışır? – Samuele

+0

Kullanabileceğiniz çok sayıda optimize edici var. Sorununuz için neden diğerlerinden daha iyi çalıştığını gösteren bir izlenim vermek için bkz. Http://sebastianruder.com/content/images/2016/01/saddle_point_evaluation_optimizers.gif veya http://sebastianruder.com/content/images/2016/ 01/contours_evaluation_optimizers.gif – frbl

0

Sadece ağ yapınızı değiştirdim ve bir eğitim veri kümesi ekledim. Kayıp 0.01'e iner.

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