2017-11-16 2 views
2

Ich habe ein neuronales Netzwerk mit Mxnet erstellt. Jetzt möchte ich dieses Modell iterativ an neuen Datenpunkten trainieren. Nachdem ich einen neuen Datenpunkt simuliert habe, möchte ich ein neues Gradienten-Sinkflug-Update für dieses Modell durchführen. Ich möchte das Modell nicht in einer externen Datei speichern und es erneut laden.Retrain mxnet Modell in R

Ich habe den folgenden Code geschrieben, aber die Gewichte ändern sich nicht nach einem neuen Trainingsschritt. Ich bekomme auch NaN als einen Trainingsfehler.

library(mxnet) 
data <- mx.symbol.Variable("data") 
fc1 <- mx.symbol.FullyConnected(data, num_hidden = 2, no.bias = TRUE) 
lro <- mx.symbol.LinearRegressionOutput(fc1) 

# first data observation 
train.x = matrix(0, ncol = 3) 
train.y = matrix(0, nrow = 2) 

# first training step 
model = mx.model.FeedForward.create(lro, 
    X = train.x, y = train.y, initializer = mx.init.uniform(0.001), 
    num.round = 1, array.batch.size = 1, array.layout = "rowmajor", 
    learning.rate = 0.1, eval.metric = mx.metric.mae) 
print(model$arg.params) 

# second data observation 
train.x = matrix(0, ncol = 3) 
train.x[1] = 1 
train.y = matrix(0, nrow = 2) 
train.y[1] = -33 

# retrain model on new data 
# pass on params of old model 
model = mx.model.FeedForward.create(symbol = model$symbol, 
    arg.params = model$arg.params, aux.params = model$aux.params, 
    X = train.x, y = train.y, num.round = 1, 
    array.batch.size = 1, array.layout = "rowmajor", 
    learning.rate = 0.1, eval.metric = mx.metric.mae) 
# weights do not change 
print(model$arg.params) 

Antwort

1

Ich fand eine Lösung. begin.round im zweiten Trainingsschritt muss im ersten Trainingsschritt größer als num.round sein, damit das Modell weiter trainiert.

library(mxnet) 
data <- mx.symbol.Variable("data") 
fc1 <- mx.symbol.FullyConnected(data, num_hidden = 2, no.bias = TRUE) 
lro <- mx.symbol.LinearRegressionOutput(fc1) 

# first data observation 
train.x = matrix(0, ncol = 3) 
train.y = matrix(0, nrow = 2) 

# first training step 
model = mx.model.FeedForward.create(lro, 
    X = train.x, y = train.y, initializer = mx.init.uniform(0.001), 
    num.round = 1, array.batch.size = 1, array.layout = "rowmajor", 
    learning.rate = 0.1, eval.metric = mx.metric.mae) 
print(model$arg.params) 

# second data observation 
train.x = matrix(0, ncol = 3) 
train.x[1] = 1 
train.y = matrix(0, nrow = 2) 
train.y[1] = -33 

# retrain model on new data 
# pass on params of old model 
model = mx.model.FeedForward.create(symbol = model$symbol, 
    arg.params = model$arg.params, aux.params = model$aux.params, 
    X = train.x, y = train.y, begin.round = 2, num.round = 3, 
    array.batch.size = 1, array.layout = "rowmajor", 
    learning.rate = 0.1, eval.metric = mx.metric.mae) 

print(model$arg.params) 
0

haben Sie versucht, mx.model.FeedForward.create zu nennen nur einmal und dann die fit Funktion für inkrementelles Training verwenden?

+1

Ich kann eine Fit-Funktion in 'mxnet' nicht finden. Welche Paketversion verwendest du? Können Sie uns bitte einen Beispielcode zur Verfügung stellen? – needRhelp

+0

Vielen Dank für diese Art der Umschulung des mxnet. –