gpt4 book ai didi

python - Keras 中的 conv2d 和 Conv2D 有什么区别?

转载 作者:太空狗 更新时间:2023-10-30 00:00:54 24 4
gpt4 key购买 nike

我对 Keras 中的 Conv2Dconv2d 感到困惑。它们之间有什么区别?我认为第一个是层,第二个是后端功能,但这是什么意思?在 Conv2D 中,我们发送过滤器的数量、过滤器的大小和步幅( Conv2D(64,(3,3),stride=(8,8))(input)) 但在 conv2d 中我们使用conv2d(input, kernel, stride=(8,8)) kernel 是什么(64,3,3),我们把过滤器的数量和大小放在一起?我应该在哪里输入内核数?你能帮我解决这个问题吗?谢谢。

pytorch 中的代码

def apply_conv(self, image, filter_type: str):

if filter_type == 'dct':
filters = self.dct_conv_weights
elif filter_type == 'idct':
filters = self.idct_conv_weights
else:
raise('Unknown filter_type value.')

image_conv_channels = []
for channel in range(image.shape[1]):
image_yuv_ch = image[:, channel, :, :].unsqueeze_(1)
image_conv = F.conv2d(image_yuv_ch, filters, stride=8)
image_conv = image_conv.permute(0, 2, 3, 1)
image_conv = image_conv.view(image_conv.shape[0], image_conv.shape[1], image_conv.shape[2], 8, 8)
image_conv = image_conv.permute(0, 1, 3, 2, 4)
image_conv = image_conv.contiguous().view(image_conv.shape[0],
image_conv.shape[1]*image_conv.shape[2],
image_conv.shape[3]*image_conv.shape[4])

image_conv.unsqueeze_(1)

# image_conv = F.conv2d()
image_conv_channels.append(image_conv)

image_conv_stacked = torch.cat(image_conv_channels, dim=1)

return image_conv_stacked

Keras 中更改的代码

def apply_conv(self, image, filter_type: str):

if filter_type == 'dct':
filters = self.dct_conv_weights
elif filter_type == 'idct':
filters = self.idct_conv_weights
else:
raise('Unknown filter_type value.')
print(image.shape)

image_conv_channels = []
for channel in range(image.shape[1]):
print(image.shape)
print(channel)
image_yuv_ch = K.expand_dims(image[:, channel, :, :],1)
print( image_yuv_ch.shape)
print(filters.shape)
image_conv = Kr.backend.conv2d(image_yuv_ch,filters,strides=(8,8),data_format='channels_first')
image_conv = Kr.backend.permute_dimensions(image_conv,(0, 2, 3, 1))
image_conv = Kr.backend.reshape(image_conv,(image_conv.shape[0], image_conv.shape[1], image_conv.shape[2], 8, 8))
image_conv = Kr.backend.permute_dimensions(image_conv,(0, 1, 3, 2, 4))
image_conv = Kr.backend.reshape(image_conv,(image_conv.shape[0],
image_conv.shape[1]*image_conv.shape[2],
image_conv.shape[3]*image_conv.shape[4]))

Kr.backend.expand_dims(image_conv,1)

# image_conv = F.conv2d()
image_conv_channels.append(image_conv)

image_conv_stacked = Kr.backend.concatenate(image_conv_channels, axis=1)

return image_conv_stacked

但是当我执行代码时,它会产生以下错误:

Traceback (most recent call last):

File "", line 383, in decoded_noise=JpegCompression()(act11)#16

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py", line 457, in call output = self.call(inputs, **kwargs)

File "", line 169, in call image_dct = self.apply_conv(noised_image, 'dct')

File "", line 132, in apply_conv image_conv = Kr.backend.conv2d(image_yuv_ch,filters,strides=(8,8),data_format='channels_first')

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\backend\tensorflow_backend.py", line 3650, in conv2d data_format=tf_data_format)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 779, in convolution data_format=data_format)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 839, in init filter_shape[num_spatial_dims]))

ValueError: number of input channels does not match corresponding dimension of filter, 1 != 8

新代码

for channel in range(image.shape[1]):
image_yuv_ch = K.expand_dims(image[:, channel, :, :],axis=1)
image_yuv_ch = K.permute_dimensions(image_yuv_ch, (0, 2, 3, 1))
image_conv = tf.keras.backend.conv2d(image_yuv_ch,kernel=filters,strides=(8,8),padding='same')
image_conv = tf.keras.backend.reshape(image_conv,(image_conv.shape[0],image_conv.shape[1], image_conv.shape[2],8,8))

错误:

Traceback (most recent call last):

File "", line 263, in decoded_noise=JpegCompression()(act11)#16

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py", line 457, in call output = self.call(inputs, **kwargs)

File "", line 166, in call image_dct = self.apply_conv(noised_image, 'dct')

File "", line 128, in apply_conv image_conv = tf.keras.backend.reshape(image_conv,(image_conv.shape[0],image_conv.shape[1], image_conv.shape[2],8,8))

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\keras\backend.py", line 2281, in reshape return array_ops.reshape(x, shape)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\ops\gen_array_ops.py", line 6482, in reshape "Reshape", tensor=tensor, shape=shape, name=name)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 513, in _apply_op_helper raise err

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 510, in _apply_op_helper preferred_dtype=default_dtype)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\ops.py", line 1146, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\constant_op.py", line 229, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\constant_op.py", line 208, in constant value, dtype=dtype, shape=shape, verify_shape=verify_shape))

File "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 531, in make_tensor_proto "supported type." % (type(values), values))

TypeError: Failed to convert object of type to Tensor. Contents: (Dimension(None), Dimension(4), Dimension(4), 8, 8). Consider casting elements to a supported type.

最佳答案

Tensorflow 和 Keras 现在使用 channel_last 约定。所以首先你应该使用 K.permute_dimension 将 channel dim 置换为最后一个。您可以在 colab.research.google.com 中尝试这段代码来了解自己。

第一个问题:

  • conv2d 是执行二维卷积的函数 docs
  • keras.layers.Conv2D() 将返回执行卷积功能的类 Conv2D 的实例。查看更多here
# The second 
import keras
conv_layer = keras.layers.Conv2D(filters=64, kernel_size=8, strides=(4, 4), padding='same')

基本上,它们在定义方式和使用方式上有所不同。 K.conv2dkeras.layers.Conv2D 中使用,当 conv_layer 对某些输入 x 应用卷积时,例如 conv_layer.

The example below may help you to understand it easier the difference between say_hello and SayHello.

def say_hello(word, name):
print(word, name)


class SayHello():

def __init__(self, word='Hello'):
self.word = word
pass

def __call__(self, name):
say_hello(self.word, name)


say_hello('Hello', 'Nadia') #Hello Nadia

sayhello = SayHello(word='Hello') # you will get an instance `sayhello` from class SayHello

sayhello('Nadia') # Hello Nadia

第二个问题:

  • kernel 这里是张量的形状 (kernel_size, kernel_size, in_channels, out_channels)
  • 如果您想获得形状为 (8, 8, 64) 的 image_conv,则 strides=(4,4)
import tensorflow as tf
import tensorflow.keras.backend as K

image = tf.random_normal((10,3, 32, 32))
print(image.shape) # shape=(10, 3, 32, 32)

channel = 1
image_yuv_ch = K.expand_dims(image[:, channel,:,:], axis=1) # shape=(10, 1, 32, 32)
image_yuv_ch = K.permute_dimensions(image_yuv_ch, (0, 2, 3, 1)) # shape=(10, 32, 32, 1)

# The first K.conv2d
in_channels = 1
out_channels = 64 # same as filters
kernel = tf.random_normal((8, 8, in_channels, out_channels)) # shape=(8, 8, 1, 64)

image_conv = tf.keras.backend.conv2d(image_yuv_ch, kernel=kernel, strides=(4, 4), padding='same')
print(image_conv.shape) #shape=(10, 8, 8, 64)


# The second
import keras
conv_layer = keras.layers.Conv2D(filters=64, kernel_size=8, strides=(4, 4), padding='same')
image_conv = conv_layer(image_yuv_ch)
print(image_conv.shape) #shape=(10, 8, 8, 64)

关于python - Keras 中的 conv2d 和 Conv2D 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55925283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com