def __fit_one(self, link, content4_2, style3_2,style4_2):
        xp = self.xp
        link.zerograds()
        layer3_2,layer4_2 = self.model(link.x)
        if self.keep_color:
            #trans_layers = self.model(util.gray(link.x))
            print "don't keep color!"
        loss_info = []
        loss = Variable(xp.zeros((), dtype=np.float32))
        #layer = layers[name]
        content_loss = self.content_weight * F.mean_squared_error(layer4_2, Variable(content4_2))
        loss_info.append(('content_', float(content_loss.data)))
        loss += content_loss

        style_patch, style_patch_norm =  style3_2
        near,size,size2 = util.nearest_neighbor_patch(layer3_2, style_patch, style_patch_norm)
        style_loss = self.style_weight * (F.sum(F.square(layer3_2))*size2/size-2*F.sum(near)/size) 
        loss_info.append(('style_', float(style_loss.data)))
        loss+=style_loss
        
        style_patch, style_patch_norm =  style4_2
        near,size,size2 = util.nearest_neighbor_patch(layer4_2, style_patch, style_patch_norm)
        style_loss = self.style_weight *1.5* (F.sum(F.square(layer4_2))*size2/size-2*F.sum(near)/size) 
        loss_info.append(('style_', float(style_loss.data)))
        loss+= style_loss

        tv_loss = self.tv_weight * util.total_variation(link.x)
        loss_info.append(('tv', float(tv_loss.data)))
        loss+=tv_loss
        loss.backward()
        self.optimizer.update()
        return loss_info
 def __fit_one(self, link, content_layers, style_grams):
     xp = self.xp
     link.zerograds()
     layers = self.model(link.x)
     if self.keep_color:
         trans_layers = self.model(util.gray(link.x))
     else:
         trans_layers = layers
     loss_info = []
     loss = Variable(xp.zeros((), dtype=np.float32))
     for name, content_layer in content_layers:
         layer = layers[name]
         content_loss = self.content_weight * F.mean_squared_error(layer, Variable(content_layer.data))
         loss_info.append(('content_' + name, float(content_loss.data)))
         loss += content_loss
     for name, style_gram in style_grams:
         gram = util.gram_matrix(trans_layers[name])
         style_loss = self.style_weight * F.mean_squared_error(gram, Variable(style_gram.data))
         loss_info.append(('style_' + name, float(style_loss.data)))
         loss += style_loss
     tv_loss = self.tv_weight * util.total_variation(link.x)
     loss_info.append(('tv', float(tv_loss.data)))
     loss += tv_loss
     loss.backward()
     self.optimizer.update()
     return loss_info
    def __fit_one(self, link, content_layers, style_patches):
        xp = self.xp
        link.zerograds()
        layers = self.model(link.x)
        if self.keep_color:
            trans_layers = self.model(util.gray(link.x))
        else:
            trans_layers = layers
        loss_info = []
        loss = Variable(xp.zeros((), dtype=np.float32))
        for name, content_layer in content_layers:
            layer = layers[name]
            content_loss = self.content_weight * F.mean_squared_error(
                layer, Variable(content_layer.data))
            loss_info.append(('content_' + name, float(content_loss.data)))
            loss += content_loss
        for name, style_patch, style_patch_norm in style_patches:
            patch = trans_layers[name]
            near, size, size2 = util.nearest_neighbor_patch(
                patch, style_patch, style_patch_norm)
            style_loss = self.style_weight * (
                F.sum(F.square(patch)) * size2 / size - 2 * F.sum(near) / size)

            loss_info.append(('style_' + name, float(style_loss.data)))
            loss += style_loss
        tv_loss = self.tv_weight * util.total_variation(link.x)
        loss_info.append(('tv', float(tv_loss.data)))
        loss += tv_loss
        loss.backward()
        self.optimizer.update()
        return loss_info