Я обучил нейронную сеть, используя пакет h2o и функцию h2o.deeplearning в R. Выбранная модель состоит из:
- входной слой из 15 входных значений
- 3 скрытый слои с 12 нейронами каждый
- выходной слой с одним выходным значением
Теперь я сохранил веса и смещения, используя следующие команды:
weights = list()
biases = list()
nHiddenLayers = 3
for (hh in seq(nHiddenLayers+1)){
weights[[hh]] = as.data.frame(h2o.weights(model,hh))
biases[[hh]] = as.data.frame(h2o.biases(model,hh))
}
Я хочу использовать эти списки, чтобы использовать модель на новых данных. Я написал следующую функцию для выполнения этого вычисления:
computeNN <- function(input,weights,biases,scale,act_fun=relu){
## Compute the result of the neural network with 3 layers of 12 neurons
## input is a row extracted from a df with variables as column names and a values as rows, must contain at least the 15 variables used in the NN and the OUT variable for rescaling
## weights contains the 15*12 initial weights for first hidden layer, 12*12 for second and third H and 12*1 for output layer
## biases contains the 12 biases for each hidden layer and the final bias for output
## scale contains the min and max of the reference data set for scaling
## act_fun is the activation function used in the neural network (ReLU)
nLayers = 3
nNeurons = 12
struct = zeros(12,3) # inner structure of the neural network containing results at each neuron
listParams = colnames(weights[[1]])
nParams = length(listParams)
struct.inputs = data.frame(variable=character(),value=double(),value.scaled=double(),stringsAsFactors=F)
for (idx in seq(nParams)){
varName = listParams[idx]
min = scale$min_data[scale$Variable==varName]
max = scale$max_data[scale$Variable==varName]
struct.inputs[idx,"variable"] = varName
struct.inputs[idx,"value"] = input[1,varName]
struct.inputs[idx,"value.scaled"] = (input[1,varName]-min)/(max-min)
}
# first hidden layer
for (idn in seq(nNeurons)){
struct[idn,1] = act_fun(biases[[1]]$C1[idn]+sum(struct.inputs$value.scaled*weights[[1]][idn,]))
}
# 2dn and 3rd hidden layers
for (idl in seq(2,nLayers)){
for (idn in seq(nNeurons)){
struct[idn,idl] = act_fun(biases[[idl]]$C1[idn]+sum(struct[,idl-1]*weights[[idl]][idn,]))
}
}
# output layer
output.scaled = act_fun(biases[[nLayers+1]]$C1[1]+sum(struct[,nLayers]*weights[[nLayers+1]]))
min = scale$min_data[scale$Variable=="OUT"]
max = scale$max_data[scale$Variable=="OUT"]
output = output.scaled*(max-min)+min
return(output)
}
К сожалению, я не могу воспроизвести результаты, полученные с помощью модели H2O, когда я запускаю оба метода на одном наборе данных. Есть ли очевидная ошибка в функции? Кроме того, есть ли другой способ воспроизвести модель?
Большое спасибо