Faz keras apoiar avanços costume numpy?

votos
2

Considere-se uma matriz numpy 1D. Pode-se simular janelas deslizantes em cima deste matriz, mudando a forma e passos da matriz. Por exemplo, considere o meio parábola em que aplicamos duas janelas de correr:

data = numpy.arange(20)
data **= 2
item_size = data.itemsize

data_input  = numpy.ndarray(
    buffer  = data.data,
    dtype   = data.dtype,
    shape   = (data.shape[0] - 4 + 1, 2),
    strides = (item_size, item_size),
    offset  = 0
)

data_output  = numpy.ndarray(
    buffer  = data.data,
    dtype   = data.dtype,
    shape   = (data.shape[0] - 4 + 1, 2),
    strides = (item_size, item_size),
    offset  = 2 * item_size
)

Aqui cada linha data_inputtem uma linha correspondente em data_outputque precedem o outro em data. Isso é:

list(zip(data_input.tolist(), data_output.tolist()))

A saída são as tuplas de linhas de entradas e saídas, às quais vamos encaixam uma rede neural em breve.

[([  0,   1], [  4,   9]),
 ([  1,   4], [  9,  16]),
 ([  4,   9], [ 16,  25]),
 ([  9,  16], [ 25,  36]),
 ([ 16,  25], [ 36,  49]),
 ([ 25,  36], [ 49,  64]),
 ([ 36,  49], [ 64,  81]),
 ([ 49,  64], [ 81, 100]),
 ([ 64,  81], [100, 121]),
 ([ 81, 100], [121, 144]),
 ([100, 121], [144, 169]),
 ([121, 144], [169, 196]),
 ([144, 169], [196, 225]),
 ([169, 196], [225, 256]),
 ([196, 225], [256, 289]),
 ([225, 256], [289, 324]),
 ([256, 289], [324, 361])]

Observe que os 2 1's mostrados acima referem-se a mesma memória. Ou seja, criamos uma janela deslizante vista em vez de uma cópia . O mesmo vale para todos os 4's, todos os 9' s, etc.

Eu gostaria de saber se é seguro para usá-los para treinamento de uma rede neural Keras. Por exemplo:

from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD

model = Sequential()
model.add(Dense(output_dim=3, input_dim=2, init=glorot_uniform))
model.add(Activation('linear'))
model.add(Dense(output_dim=2, input_dim=3, init=glorot_uniform))
model.add(Activation('linear'))
model.compile(loss='mse', optimizer=SGD(lr=0.000001, momentum=0.9, nesterov=True))

model.fit(data_input, data_output, nb_epoch=100000, batch_size=32, verbose=0)

numpy.sqrt( ((model.predict(data_input) - data_output) ** 2).mean() )

O código parece funcionar, como os pesos têm valores normais entre -2 e 2 e o RMSE resultante é de cerca de 0,65.

No entanto, eu poderia estar abusando da sorte. Será Keras considerar que

  1. avanços podem assumir valores incomuns, em particular menor do que o que numpy.zeros(...)cria
  2. diferentes elementos nos dados podem se referir à mesma memória
  3. elementos em entradas podem se referir aos mesmos elementos als memória na saída.

Por favor, não responda com a alternativa de simplesmente materializar todas as janelas separadamente, nem com bibliotecas alternativas.

Eu gostaria de saber se é seguro usar Keras como este, e se os resultados são os mesmos que quando os dados foram materializados completamente. Se a resposta depende do backend, por favor responda-lo tanto para backend (Theano / Tensorflow).

Publicado 06/04/2016 em 15:45
fonte usuário
Em outras línguas...                            

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