TensorFlow实战(五)Deep Dream(计算机生成梦幻图像)——理解深度神经网络结构及应用

一、疑问

  • 卷积层究竟学到了什么内容
  • 同一卷积层中不同通道学习到的内容有什么区别
  • 浅层的卷积和深层的卷积学习到的内容有什么区别

二、Deep Dream技术原理

Deep Dream生成梦幻图像

1. 利用CNN进行图像分类:

CNN的图像分类

2. Deep Dream

使用梯度上升的方法可视化网络每一层的特征,即用一张噪声图像输入网络,反向更新的时候不更新网络权重,而是更新初始图像的像素值,(这里卷积神经网络是固定的,使用预训练好的ImageNet图像识别模型),以这种“训练图像”的方式可视化网络

Deep Dream技术原理

Deep Dream技术原理

三、Inception模型文件导入与卷积层分析

1. 模型的加载

TensorFlow提供了以下两种方式来存储和加载模型:

  • 生成检查点文件(checkpoint file),拓展名一般为.ckpt,通过在tf.train.Saver对象上调用Saver.save()生成,通过saver.restore()来加载。
  • 生成图协议文件(graph proto file),这是一个二进制文件,拓展名一般为.pb,用tf.train.write_graph()保存,然后使用tf.import_graph_def()来加载图。

2. 图模型的加载

#图模型的加载

import tensorflow as tf
# 图的保存
v = tf.Variable(1.0, name='my_variable')
with tf.Session() as sess:
    tf.train.write_graph(sess.graph_def,'./tfmodel','test_pb.pb',as_text=False)
# 图的加载
with tf.Session() as sess:
    with tf.gfile.FastGFile('./tfmodel/test_pb.pb','rb')as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        sess.graph.as_default()
        tf.import_graph_def(graph_def,name='tf.graph')
        print(graph_def)

3. 导入Inception模型

# 导入库
from _future_ import print_function
import os
from io import BytestIO
import numpy as np
from functools import partial
import PIL.Image
import scipy.misc
import tensorflow as tf

# 创建图和会话
graph = tf.Graph()
sess = tf.InteractiveSession(graph=graph)

# 导入Inception网络
model_fn = 'tensorflow_inception_graph.pb'
# tensorflow_inception_graph.pb文件的下载:
# https://storage.gooleapis.com/download.tensorflow.org/models/inception5h.zip

with tf.gfile.FastGFile(model_fn,'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
# 定义输入图像的占位符
t_input = tf.placeholder(np.float32, name='input')

# 图像预处理——减均值
imagenet_mean = 117.0
# 在训练Inception模型时做了减均值预处理,此处也需减同样的均值以保持一致

# 图像预处理——增加维度
# 图像数据格式一般是(height, width, channels),为同时将多张图片输入网络而在前面增加一维
# tf.expand_dims(input,dim,name=None)
# 向tensor插入维度1,插入位置就是参数代表的位置(维度从0开始)
t_preprocessed = tf.expand_dims(t_input - imagenet_mean, 0)


# 导入模型并将经预处理的图像送入网络中
tf.import_graph_def(graph_def,{'input':t_preprocessed})

4. 图的基本操作

  • 创建、重置和获得默认图
import numpy as np
import tensorflow as tf

g = tf.Graph() # 创建新的图
with g.as_default():
    c1 = tf.constant(0,0) # 在新图中添加变量
    print(c1) #Tensor("Const:0", shape=(), dtype = float32)
    # 可通过变量的'.graph'可获得其所在的图
    print("c1.graph:", c1.graph) 
    #c1.graph:<tensorflow.python.framework.ops.Graph object at 0xxxxxxxxxx94A1FD0>
    
tf.reset_default_graph() # 重置默认图
g2 = tf.get_default_graph() # 获得默认图
print("g2:", g2) 
#g2:<tensorflow.python.framework.ops.Graph object at 0xxxxxxxxxx923CE10>
  • 获取张量:get_tensor_by_name
# 先获取张量的名字
print(c1.name) #Const:0
# 然后将张量名字放到tf.Graph().get_tensor_by_name(name="")中
t = g.get_tensor_by_name(name = "Const:0")
# 通过打印 t 验证get_tensor_by_name所获取的张量就是前面定义的张量c1
print(t) #Tensor("Const:0",shape=(),dtype=float32)
  • 获取节点操作:get_operation_by_name
a = tf.constant([[1.0,2.0]])
b = tf.constant([[1.0],[2.0]])

tensor1 = tf.matmul(a,b,name='example_op')
print(tensor1) #Tensor("example_op:0",shape=(1,1),dtype=float32)
print(tensor1.name) #example_op:0

# 先把op的名字打印出来
print(tensor1.op.name) #example_op
# 然后get_operation_by_name函数
test_op = g2.get_operation_by_name("example_op")
print(test_op)

5. 模型中各卷积层分析

# 找出卷积层
layers = [op.name for op in graph.get_operations() if op.type == 'Conv2D'] 
# 输出卷积层层数
print('Number of layers',len(layers))
#Number of layers 59
# 输出所有卷积层名称
print(layers)

# 还可输出指定卷积层的参数
name1 = 'mixed4d_3x3_bottleneck_pre_relu'
print('shape of %s:%s' % (name1,str(graph.get_tensor_by_name('import/'+name1+':0').get_shape())))

四、Deep Dream图像生成

1. 以背景图像为起点生成Deep Dream图像

背景图像

生成的Deep Dream图像

2. 生成原始Deep Dream图像

可视化卷积层
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容