// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2014 Benoit Steiner <[email protected]> // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_CXX11_TENSOR_TENSOR_TRAITS_H #define EIGEN_CXX11_TENSOR_TENSOR_TRAITS_H // IWYU pragma: private #include "./InternalHeaderCheck.h" namespace Eigen { namespace internal { template <typename Scalar, int Options> class compute_tensor_flags { … }; traits<Tensor<Scalar_, NumIndices_, Options_, IndexType_>>; traits<TensorFixedSize<Scalar_, Dimensions, Options_, IndexType_>>; traits<TensorMap<PlainObjectType, Options_, MakePointer_>>; traits<TensorRef<PlainObjectType>>; eval<Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense>; eval<const Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense>; eval<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense>; eval<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense>; eval<TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense>; eval<const TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense>; eval<TensorRef<PlainObjectType>, Eigen::Dense>; eval<const TensorRef<PlainObjectType>, Eigen::Dense>; // TODO nested<> does not exist anymore in Eigen/Core, and it thus has to be removed in favor of ref_selector. template <typename T, int n = 1, typename PlainObject = void> struct nested { … }; nested<Tensor<Scalar_, NumIndices_, Options_, IndexType_>>; nested<const Tensor<Scalar_, NumIndices_, Options_, IndexType_>>; nested<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>>; nested<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>>; nested<TensorRef<PlainObjectType>>; nested<const TensorRef<PlainObjectType>>; } // end namespace internal // Convolutional layers take in an input tensor of shape (D, R, C, B), or (D, C, // R, B), and convolve it with a set of filters, which can also be presented as // a tensor (D, K, K, M), where M is the number of filters, K is the filter // size, and each 3-dimensional tensor of size (D, K, K) is a filter. For // simplicity we assume that we always use square filters (which is usually the // case in images), hence the two Ks in the tensor dimension. It also takes in // a few additional parameters: // Stride (S): The convolution stride is the offset between locations where we // apply the filters. A larger stride means that the output will be // spatially smaller. // Padding (P): The padding we apply to the input tensor along the R and C // dimensions. This is usually used to make sure that the spatial // dimensions of the output matches our intention. // // Two types of padding are often used: // SAME: The pad value is computed so that the output will have size // R/S and C/S. // VALID: no padding is carried out. // When we do padding, the padded values at the padded locations are usually // zero. // // The output dimensions for convolution, when given all the parameters above, // are as follows: // When Padding = SAME: the output size is (B, R', C', M), where // R' = ceil(float(R) / float(S)) // C' = ceil(float(C) / float(S)) // where ceil is the ceiling function. The input tensor is padded with 0 as // needed. The number of padded rows and columns are computed as: // Pr = ((R' - 1) * S + K - R) / 2 // Pc = ((C' - 1) * S + K - C) / 2 // when the stride is 1, we have the simplified case R'=R, C'=C, Pr=Pc=(K-1)/2. // This is where SAME comes from - the output has the same size as the input has. // When Padding = VALID: the output size is computed as // R' = ceil(float(R - K + 1) / float(S)) // C' = ceil(float(C - K + 1) / float(S)) // and the number of padded rows and columns are computed in the same way as in // the SAME case. // When the stride is 1, we have the simplified case R'=R-K+1, C'=C-K+1, Pr=0, // Pc=0. enum PaddingType { … }; } // end namespace Eigen #endif // EIGEN_CXX11_TENSOR_TENSOR_TRAITS_H