2016-04-07 15 views
0

私は、Kerasで練習するだけで、非常に簡単な機能を習得しています。 ネットワークの入力は2次元です。出力は1次元です。 関数は実際には画像で表現できますが、近似関数についても同様です。 私は良い一般化を探していない瞬間、ネットワークがトレーニングセットを表現する上で少なくとも良いと思っています。 は、ここで私は私のコードを配置:あなたが見ることができるようにKerasを使用した単純回帰が正しく機能していないようです。

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

、2つの機能は完全に異なっている、と私は理由を理解することはできません。 私はおそらくmodel.predictは私がaxensとして動作しないと思う。

+0

私は2つの機能が異なっていることを確認していない、あなたがrefferingている欠落プロットがあるようです。 –

答えて

1

ご理解に間違いがありません。それは単なるハイパーパラメータチューニングの問題です。

私はちょうどあなたのコードを試みたが、あなたはあなたのトレーニングに十分な時間を与えていないように見える:損失で

ルックを、100のエポックの下で、それが周りに0.23で立ち往生しています。しかし、SGDの代わりに 'adam' otimizerを使用し、エポック数を10,000まで増やしてください。損失は0.09に減少し、画像ははるかに良く見えます。

まだ十分正確でない場合は、パラメータの数を増やしてみてください。いくつかのレイヤーを追加するだけです。オーバーフィットがずっと簡単になります! :-)

+0

ありがとう、私はちょうど実験をしたいと思った:-)。なぜadam optimizerがうまくいくのですか? – Samuele

+0

使用できるオプティマイザはたくさんあります。なぜあなたの問題が他のものよりもうまくいくかの印象を与えるために、http://sebastianruder.com/content/images/2016/01/saddle_point_evaluation_optimizers.gifまたはhttp://sebastianruder.com/content/images/2016/を参照してください。 01/contours_evaluation_optimizers.gif – frbl

0

あなたのネットワーク構造を変更し、トレーニングデータセットを追加しました。損失は​​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() 
関連する問題