tensorflow中踩过的坑

2018-02-17  本文已影响1245人  学而时习之_不亦说乎

静态和动态维度

TensorFlow: Shapes and dynamic dimensions一文中,对张量的静态和动态维度做了描述。

tf.nn.conv2d和tf.layers.conv2d

tf.nn.conv2dtf.layers.conv2d都可以用来定义一个卷积层,但是两个函数又有所不同。我个人感觉
tf.layers.conv2d应该是在tf.nn.conv2d的基础上进行封装的,因为它的参数相对而言要简单很多,最主要的参数有如下:

而滤波器的初始化,则完全可以自身完成。

tf.nn.conv2d函数而言,主要的参数如下:

主要区别就在于,使用tf.nn.conv2d的时候,用户需要自己初始化滤波器tensor,而不是自动初始化。除此之外,两者还有一个十分重要的区别:

在定义u-net的时候,需要使用tf.slice函数取出一个tensor的一部分,虽然这个tensor的维度是(?, ?, ?, 512)维度,但是使用tf.slice以后,输出的tensor则变成了(?, ?, ?, ?)维度,继续将这样的一个tensor输入tf.layers.conv2d则会下面的错误:

The channel dimension of the inputs should be defined. Found `None`.

但是将这个tensor给tf.nn.conv2d则不会产生相同的错误,因为在定义filter的时候,定义了in_channels,相当于纠正了tf.slice的错误。

所以,在定义一些较为复杂网络graph的时候,最好还是使用tf.nn.conv2d,而不是使用tf.layers.conv2d

上一篇下一篇

猜你喜欢

热点阅读