Returns the spatial size of a n-d convolution/pooling output.
(input_size, filter_size, strides, padding_type)
| 116 | |
| 117 | |
| 118 | def get_conv_output_size(input_size, filter_size, strides, padding_type): |
| 119 | """Returns the spatial size of a n-d convolution/pooling output.""" |
| 120 | input_size = tuple([tensor_shape.as_dimension(x).value for x in input_size]) |
| 121 | filter_size = tuple([tensor_shape.as_dimension(x).value for x in filter_size]) |
| 122 | strides = [int(x) for x in strides] |
| 123 | |
| 124 | if all(x == 1 for x in input_size) and all(x == 1 for x in filter_size): |
| 125 | return input_size |
| 126 | |
| 127 | if any(x is not None and y is not None and x > y for x, y in |
| 128 | zip(filter_size, input_size)): |
| 129 | raise ValueError("Filter must not be larger than the input: " |
| 130 | "Filter: %r Input: %r" % (filter_size, input_size)) |
| 131 | |
| 132 | if padding_type == b"VALID": |
| 133 | |
| 134 | def _valid(in_dim, k_dim, s_dim): |
| 135 | if in_dim is not None and k_dim is not None: |
| 136 | return (in_dim - k_dim + s_dim) // s_dim |
| 137 | else: |
| 138 | return None |
| 139 | |
| 140 | output_size = [ |
| 141 | _valid(in_dim, k_dim, s_dim) |
| 142 | for in_dim, k_dim, s_dim in zip(input_size, filter_size, strides) |
| 143 | ] |
| 144 | elif padding_type == b"SAME": |
| 145 | |
| 146 | def _same(in_dim, s_dim): |
| 147 | if in_dim is not None: |
| 148 | return (in_dim + s_dim - 1) // s_dim |
| 149 | else: |
| 150 | return None |
| 151 | |
| 152 | output_size = [_same(in_dim, s_dim) |
| 153 | for in_dim, s_dim in zip(input_size, strides)] |
| 154 | else: |
| 155 | raise ValueError("Invalid padding: %r" % padding_type) |
| 156 | |
| 157 | return tuple(output_size) |
| 158 | |
| 159 | |
| 160 | def get2d_conv_output_size(input_height, input_width, filter_height, |