Функция для воспроизведения модели нейронной сети от весов и уклонов - PullRequest
0 голосов
/ 07 апреля 2020

Я обучил нейронную сеть, используя пакет 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, когда я запускаю оба метода на одном наборе данных. Есть ли очевидная ошибка в функции? Кроме того, есть ли другой способ воспроизвести модель?

Большое спасибо

...