为何这里的参数要写名字
来源: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]
所以,对于参数很多的方法,还是标明参数名比较好,这样你可以不用拘束,打乱参数赋值顺序也不怕。
00 -
Thomas_wade
提问者
2018-04-20
我知道了,是这样的
00
相似问题