赞
踩
图像风格转换的概念部分,可以参考博客:图像风格转换(Image style transfer)
这里是手动实现了这样一个demo
# -*- coding:utf-8 -*- import os import math import numpy as np import tensorflow as tf from PIL import Image import time # VGG 自带的一个常量,之前VGG训练通过归一化,所以现在同样需要作此操作 VGG_MEAN = [103.939, 116.779, 123.68] # rgb 三通道的均值 class VGGNet(): ''' 创建 vgg16 网络 结构 从模型中载入参数 ''' def __init__(self, data_dict): ''' 传入vgg16模型 :param data_dict: vgg16.npy (字典类型) ''' self.data_dict = data_dict def get_conv_filter(self, name): ''' 得到对应名称的卷积层 :param name: 卷积层名称 :return: 该卷积层输出 ''' return tf.constant(self.data_dict[name][0], name = 'conv') def get_fc_weight(self, name): ''' 获得名字为name的全连接层权重 :param name: 连接层名称 :return: 该层权重 ''' return tf.constant(self.data_dict[name][0], name = 'fc') def get_bias(self, name): ''' 获得名字为name的全连接层偏置 :param name: 连接层名称 :return: 该层偏置 ''' return tf.constant(self.data_dict[name][1], name = 'bias') def conv_layer(self, x, name): ''' 创建一个卷积层 :param x: :param name: :return: ''' # 在写计算图模型的时候,加一些必要的 name_scope,这是一个比较好的编程规范 # 可以防止命名冲突, 二可视化计算图的时候比较清楚 with tf.name_scope(name): # 获得 w 和 b conv_w = self.get_conv_filter(name) conv_b = self.get_bias(name) # 进行卷积计算 h = tf.nn.conv2d(x, conv_w, strides = [1, 1, 1, 1], padding = 'SAME') ''' 因为此刻的 w 和 b 是从外部传递进来,所以使用 tf.nn.conv2d() tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu = None, name = None) 参数说明: input 输入的tensor, 格式[batch, height, width, channel] filter 卷积核 [filter_height, filter_width, in_channels, out_channels] 分别是:卷积核高,卷积核宽,输入通道数,输出通道数 strides 步长 卷积时在图像每一维度的步长,长度为4 padding 参数可选择 “SAME” “VALID” ''' # 加上偏置 h = tf.nn.bias_add(h, conv_b) # 使用激活函数 h = tf.nn.relu(h) return h def pooling_layer(self, x, name): ''' 创建池化层 :param x: 输入的tensor :param name: 池化层名称 :return: tensor ''' return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], # 核参数, 注意:都是4维 strides = [1, 2, 2, 1<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。