R/runNeuralStyleR.R

#' addContentToNetwork
#'
#' @return
#' @export
#' @import reticulate
#' @import imager
#' @references \insertRef{Simonyan2014}{neuralstyleR}
#' @references \insertRef{Gatys2016}{neuralstyleR}
#'
#' @examples
runNeuralStyleR<-function(network, t_cont, dtype="torch.FloatTensor",
                          params.optimizer = 'lbfgs'){

    torch <- import("torch")
    sci<-import("scipy.optimize")

    #set all modules to loss
    for(layer in network$contentLayers){
        layer$mode <- "loss"
    }
    for(layer in network$styleLayers){
        layer$mode <- "loss"
    }

    #ToDo delete unnecessary stuff

    img <- torch$randn(t_cont$size())$float()$mul(0.001)

    net <- network$net

    #y <- net$forward(img)
    #dy <- torch$zeros(y$size())

    evalMain = py_run_string(
"class evaluator():
    def __init__(self, network, contentLayers, styleLayers, width, height):
        self.network = network
        self.contentLayers = contentLayers
        self.styleLayers = styleLayers
        self.width = width
        self.height = height
    def loss(self, input):
        self.input = torch.FloatTensor(input).view(1, 3, self.width, self.height)
        self.y = self.network.forward(self.input)
        self.dy = torch.zeros(self.y.size())
        loss = 0
        for layer in self.contentLayers:
            loss += layer.loss.detach().numpy()

        for layer in self.styleLayers:
            loss += layer.loss.detach().numpy()
        return loss
    def grad(self, input):
        return self.dy.view(-1).numpy()
")

    evaluator <- evalMain$evaluator(network$net, network$contentLayers,
                                    network$styleLayers, 512L, 341L)

    res <- optim(par = img$numpy(), fn = evaluator$loss, gr = evaluator$grad,
                 method = "L-BFGS-B", control = list( maxit = 1, abstol = -1, reltol = -1))
    #res<-sci$minimize(fun = evaluator$loss, jac = evaluator$grad, x0 = img$numpy(),
    #                  tol = -1L, options = evalMain$options, method="L-BFGS-B")
#, method="L-BFGS-B"
    return(evaluator)
}
David-J-R/neuralstyleR documentation built on May 8, 2019, 1:54 p.m.