tensorflow学习(9)风格迁移代码解读

针对这篇文章https://blog.csdn.net/aaronjny/article/details/79681080#commentsedi给的代码和讲解(非常感谢!),在我的上一篇文章的基础上,学习风格迁移的代码和损失函数计算方法,有以下总结:

1、在获得vgg参数时,有以下代码:

w = tf.constant(layers[i][0][0][0][0][0])
        bias = layers[i][0][0][0][0][1]
        b = tf.constant(np.reshape(bias, (bias.size)))
        return w, b

为什么是vgg[layers][0][i][0][0][0][0][0]?好像他们是这样得到的:打印出每一层的大小,然后自己判断是不是w,d。可以看出w的大小是3*3*3,共64个,b是64个。

vgg = scipy.io.loadmat( 'imagenet-vgg-verydeep-19.mat')

print(scipy.shape(vgg['layers'][0]))
print(scipy.shape(vgg['layers'][0][0]))
print(scipy.shape(vgg['layers'][0][0][0]))
print(scipy.shape(vgg['layers'][0][0][0][0]))
print(scipy.shape(vgg['layers'][0][0][0][0][0]))
print(scipy.shape(vgg['layers'][0][0][0][0][0][0]))

结果:

(43,)
(1, 1)
(1,)
()
(1, 2)
(2,)
(3, 3, 3, 64)
(1, 64)

而 i 对应的是vgg模型的第几层,第0层是conv1_1,第1层是relu1_1,以此类推。所以程序中的参数选取并不是每一层的都取,而是取了卷积层的参数。

我的问题是 np.reshape(bias, (bias.size) 这一句有什么作用? 不还是原来的size吗?

2、根据噪音和内容图片,生成一张随机图片 ,为什么不能直接用原图片作为输入呢?

3、 在读取图片的函数中:resize 和 reshape有什么区别,为什么不一次性改变大小?

resize 和 reshape的区别:                                             

         1、reshape可以实现维度的提升!!!                  

          2、reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改;                          

         resize:无返回值,所谓有返回值,即会对原始多维数组进行修改;               

4、下面的代码中,看似一样的两句代码,得到的值不一样:

作者的回答:

#tensorflow里的所有操作,只有在session.run里才会运行并计算值。
# 在代码的这一段,上面的内容图片的损失是固定的,为了避免重复计算,就先计算了出来。
# 而噪音的特征这里只是定义计算方式,并没有真正运行,
# 它是在后面训练的时候才运行的,输入的内容就是噪声图片,并且噪声图片会随着训练不停改变。

关于其中的权重参数weight,是因为内容图片和风格图片取的 conv层数不同,所以权重参数不同。内容图片取2层conv,所以每次权重为1/2,而风格图片取4层conv,每次权重参数为1/4。(我刚开始看作者的公式没弄明白分母的2和4 啥意思,现在明白了)

猜你喜欢

转载自blog.csdn.net/weixin_40820983/article/details/85300559