为何这里的参数要写名字

来源:4-20 动手实现CNN卷积神经网络(二)

Thomas_wade

2018-04-20

我注意到下面这段代码里面函数调用时含有参数的名字的,如inputs=input_x_images,这个inputs就是名字。但是在定义比如placeholder时就没有写参数的名字,直接tf.placeholder(tf.float32, [None, 28 * 28]),没有写明各个未知的参数名字,这有什么区别吗?是不是因为写上名字可以指定参数的接受对象?

conv1 = tf.layers.conv2d(

    inputs=input_x_images,  # 形状 [28, 28, 1]

    filters=32,             # 32 个过滤器,输出的深度(depth)是32

    kernel_size=[5, 5],     # 过滤器在二维的大小是 (5 * 5)

    strides=1,              # 步长是 1

    padding='same',         # same 表示输出的大小不变,因此需要在外围补零 2 圈

    activation=tf.nn.relu   # 激活函数是 Relu

)  # 形状 [28, 28, 32]


写回答

2回答

Oscar

2018-04-20

有时不写参数也是可以的,但是有时须要写上,不然程序不知道你赋的值对应的是哪个参数,而且写上也更方便别人阅读。


placeholder 的参数是这样的:

tf.placeholder(
    dtype,
    shape=None,
    name=None
)

它的参数第一个和第二个分别按顺序被给了 tf.float32 和 [None, 28 * 28],第三个参数 name(“名字”)你不给也行,API 里写了这个参数是 Optional(“可选的”),就是不一定要赋值,它用了 Python 的默认参数机制,如果你不给它赋值,它的值也是 None。当然了,第二个参数也是可选的。


而 tf.layers.conv2d 则不一样,它的参数是这样的 :

tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

如果在我们的程序里不写上参数,而是按顺序地一个个给其赋值,如下:

conv1 = tf.layers.conv2d(
    input_x_images,  # 形状 [28, 28, 1]
    32,             # 32 个过滤器,输出的深度(depth)是32
    [5, 5],     # 过滤器在二维的大小是 (5 * 5)
    1,              # 步长是 1
    'same',         # same 表示输出的大小不变,因此需要在外围补零 2 圈
    tf.nn.relu   # 激活函数是 Relu
)  # 形状 [28, 28, 32]

那运行是会出现错误的:

Traceback (most recent call last):
  File "cnn_mnist.py", line 46, in <module>
    tf.nn.relu   # 激活函数是 Relu
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 613, in conv2d
    _scope=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 507, in __init__
    name=name, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 112, in __init__
    self.data_format = utils.normalize_data_format(data_format)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/utils.py", line 93, in normalize_data_format
    data_format = value.lower()
AttributeError: 'function' object has no attribute 'lower'

因为,按照顺序下来,你赋的值 tf.nn.relu 对应的是 data_format 这个参数,所以会出错。

当然了,如果写成这样,就可以了:

conv1 = tf.layers.conv2d(
    input_x_images,  # 形状 [28, 28, 1]
    32,             # 32 个过滤器,输出的深度(depth)是32
    [5, 5],     # 过滤器在二维的大小是 (5 * 5)
    1,              # 步长是 1
    'same',         # same 表示输出的大小不变,因此需要在外围补零 2 圈
    'channels_last',
    (1, 1),
    tf.nn.relu   # 激活函数是 Relu
)  # 形状 [28, 28, 32]


所以,对于参数很多的方法,还是标明参数名比较好,这样你可以不用拘束,打乱参数赋值顺序也不怕。

0
0

Thomas_wade

提问者

2018-04-20

我知道了,是这样的


0
0

基于Python玩转人工智能最火框架 TensorFlow应用实践

机器学习入门,打牢TensorFlow框架应用是关键!

2214 学习 · 688 问题

查看课程