regressão simples com Keras parece não funcionar correctamente

votos
0

Eu estou tentando, apenas para praticar com Keras , para treinar uma rede para aprender uma função muito fácil. A entrada da rede é 2Dimensional . A saída é unidimensional . A função pode, efectivamente, representado com uma imagem, e o mesmo é para a função aproximada. No momento eu não estou olhando para qualquer boa generalização, eu só quero que a rede é pelo menos boa em representar o conjunto de treinamento. Aqui eu colocar o meu código:

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

Como você pode ver, os dois função são completamente diferentes, e eu não consigo entender o porquê. Eu acho que talvez model.predict não funciona como eu axpect.

Publicado 07/04/2016 em 08:19
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

O seu entendimento está correto; é apenas uma questão de ajuste hiperparâmetro.

Eu apenas tentei seu código, e parece que você não está dando a sua formação tempo suficiente:

Olhe para a perda, menos de 100 épocas, que está preso em torno de 0,23. Mas tente usar o 'adam' otimizer vez de SGD, e aumentar o número de épocas até 10.000: a perda agora diminui para baixo para 0,09 e a sua imagem parece muito melhor.

Se ainda não é precisa o suficiente para você, você também pode querer tentar aumentar o número de parâmetros: basta adicionar algumas camadas; isso fará com que overfitting muito mais fácil! :-)

Respondeu 25/04/2016 em 13:45
fonte usuário

votos
0

Eu mudei apenas a sua estrutura de rede e acrescentou um conjunto de dados de treinamento. A perda diminui até 0,01.

digite descrição da imagem aqui

# -*- 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()
Respondeu 16/03/2017 em 08:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more