对神经风格迁移有个大致理解,实现应该是件有趣的事情。对可视化卷积神经网络进行研究,代码测试。
上一篇:深度学习(5)--目标检测小总结(目标检测,人脸识别,目标识别与定位,YOLO算法,bounding box,边框回归)https://blog.csdn.net/qq_36187544/article/details/92795952
下一篇:深度学习(7)-RNN(网络模式,典型应用场景,梯度修剪,GRU,LSTM,双向RNN,深度RNN)https://blog.csdn.net/qq_36187544/article/details/93052465
目录
神经风格迁移
可视化理解卷积神经网络
卷积核输出的可视化源码
很有趣的一个应用,利用内容(content,C)和风格(style,S)生成新图像,这叫神经风格迁移,这是一个生成的过程:
在训练网络时,代价函数分为两部分,一部分为内容代价函数,一部分为风格代价函数,αβ为权重系数:
可视化CNN每一层输出可以帮助理解CNN到底学习到了什么,一般来讲,浅层学习到的是基本特征(比如线条),越高层学习到的特征越深入(比如一张完整图像)。
卷积核输出的可视化(Visualizing intermediate convnet outputs (intermediate activations),即可视化卷积核经过激活之后的结果。能够看到图像经过卷积之后结果,帮助理解卷积核的作用
卷积核的可视化(Visualizing convnets filters),帮助我们理解卷积核是如何感受图像的
热度图可视化(Visualizing heatmaps of class activation in an image),通过热度图,了解图像分类问题中图像哪些部分起到了关键作用,同时可以定位图像中物体的位置。(这篇文章介绍的挺好:https://blog.csdn.net/weiwei9363/article/details/79112872)
其实这个过程较为简单,做个记录,主要分为几步:1.微修改网络,输出中间层,2.sess.run输出具体tensor值,3.可视化
首先略微修改网络,让其能够输出某一层的参数,如下,skljdfasf这个参数就是想要输出的InceptionV3网络的某中间层:
在网络返回参数时添上这个中间层参数:
调用这个网络返回也得相应修改,out11111就是获取了中间层:
sess.run输出具体值:
再对具体值输出成图片:
# 注意,这里的output_img的shape应当为[?,?]或者[?,?,3]这种数据输出。这里out_howjdfk输出shape为(1,13,221,64),所以out_howjdfk[0][:,:,0]表示通道一的图
output_img = np.hstack([out_howjdfk[0][:,:,0]])
# vstack在竖直方向上堆叠,因为这里的图片是长条形,所以竖直堆叠看的清一些
# output_img = np.vstack([out_howjdfk[0][:,:,i] for i in range(len(out_howjdfk[0][0][0]))])
cv2.namedWindow('ouput_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('ouput_image', output_img)
cv2.waitKey(0)
竖直堆叠输出,原图都是试纸,可以看见基本的雏形: