关于卷积的具体操作不细讲,本文只是自己太懒了不想记手写笔记。
由于自己接触到的都是图像
处理相关的工作,因此,在这里只介绍2D卷积。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
keras.layers.convolutional.Conv2D(filters,kernel_size,strides(1,1), padding='valid', data_format=None, dilation_rate=(1,1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None) |
此操作将二维向量进行卷积,当使用该层作为第一层时,应提供input_shape参数。
conv2d和conv2dTranspose属于最常用的层,但在keras的实现中关于padding的部分有点模糊,周末趁着空闲做了一些尝试,来实验padding的valid和same参数在实际过程中如何操作的。
conv2D部分
1 2 3 4 5 6 7 8 9 10 11 |
v_input = np.ones([1,5,5,1]) kernel = np.ones([3,3]) stride = 1 model = Sequential() model.add(Conv2D(1, kernel_size=(3, 3), activation='relu', padding="valid" , # "same" strides = 1, # dilation_rate = 1, kernel_initializer = keras.initializers.Ones(), input_shape=v_input.shape[1:])) |
其中stride可以尝试多组测试
padding在valid 和 same 间切换测试
padding 为valid则不进行填充, 根据stride的滑动大小来做平移, 则:
1 |
output_shape = ceil( (input_shape - (kernel_size - 1)) / stride ) |
如果是same模式则 会进行左右上下的补齐, 其中左,上依次补齐 flood (kernel_size -1 ) / 2 , 右下补齐ceil (( kernel_size - 1) /2 ) ,补齐后进行的操作就是类似valid下的滑动卷积
1 |
output_shape = ceil (input_shape / stride) |
1 2 3 4 5 6 7 8 9 10 11 |
v_input = np.ones([1,5,5,1]) kernel = np.ones([3,3]) stride = 1 model = Sequential() model.add(Conv2DTranspose(1, kernel_size=(3, 3), activation='relu', padding="valid" , # "same" strides = 1, # dilation_rate = 1, kernel_initializer = keras.initializers.Ones(), input_shape=v_input.shape[1:])) |
如果padding的设置为valid则,保持最小相交的原则上下左右均填充kernel_size大小,如果stride设置为非1,起实际的作用和dilation_rate一样均是在矩阵中进行填充(实际滑动是永远都是1) 具体填充出来的矩阵大小是 (input_size -1) * stride + 1 + 2 * (kernel_size - 1)
之后就是按照这个矩阵做着类似conv2d valid的卷积 则:
1 |
output_shape = (input_size -1) * stride + 1 + 2 * (kernel_size - 1) - (kernel_size -1) = (input_size - 1) * stride + kernel_size |
如果padding为same的话则output_shape = input_shape * stride
其中原始矩阵左上padding = ceil (( kernel_size ) /2 ) 右下补齐 flood (( kernel_size ) /2 ) 这里conv2d