Spaces:
Build error
Build error
/* Copyright 2016 The TensorFlow Authors. All Rights Reserved. | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
==============================================================================*/ | |
namespace tensorflow { | |
// GetWindowedOutputSize(): Given an input tensor, kernel, stride and padding | |
// type, the function computes the output and padding dimensions. | |
// | |
// For example, ignoring batches or multiple features, a 1D convolution | |
// takes as input a 1D tensor of shape (H), and convolves it with a filter of | |
// shape (K). | |
// | |
// It also takes in a few additional parameters: | |
// | |
// Stride (S): the stride with which we apply the filters. This 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 each | |
// dimension. This is usually used to make sure that the spatial dimensions | |
// do not shrink when we progress with convolutions. Two types of padding are | |
// often used: | |
// SAME: the pad value is computed so that the output will have size H/S. | |
// VALID: no padding is carried out. | |
// The padded area is zero-filled. | |
// | |
// The output dimensions for convolution and many other operations, when given | |
// all the parameters above, are as follows: | |
// - When Padding = SAME: the output size is (H'), where | |
// H' = ceil(float(H) / float(S)) | |
// where ceil is the ceiling function. The number of padded cells | |
// is computed as: | |
// Pc = ((H' - 1) * S + K - H) / 2 | |
// When the stride is 1, the expression simplifies to | |
// H' = H, 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 | |
// H' = ceil(float(H - K + 1) / float(S)) | |
// and the number of padded cells is always zero. | |
// When the stride is 1, the expression simplifies to | |
// H' = H-K+1. | |
// | |
// For convolution, mathematically, the output value at location (r') | |
// is the inner product of two vectors: the chunk of input at | |
// ((r'*S-Pr) : (r'*S-Pr+K)), | |
// and the filter. | |
// | |
// For 2D and 3D convolutions, the spatial dimensions are orthogonal, so the | |
// size and padding of each spatial dimension can be computed by calling | |
// GetWindowedOutputSize separately for each dimension. | |
// | |
Status GetWindowedOutputSize(int64 input_size, int64 filter_size, int64 stride, | |
Padding padding_type, int64* output_size, | |
int64* padding_size); | |
// The V2 version computes the same outputs with arbitrary dilation_rate. | |
// The output dimensions are computed as follows: | |
// - When adding dilation_rate (D), we compute an effective filter size (K'): | |
// K' = (K - 1) * D + 1 | |
// - When Padding = SAME: the output size is (H'), where | |
// H' = ceil(float(H) / float(S)) | |
// where ceil is the ceiling function. The number of padded cells | |
// is computed as: | |
// Pc = ((H' - 1) * S + K' - H) / 2 | |
// When the stride is 1, the expression simplifies to | |
// H' = H, 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 | |
// H' = ceil(float(H - K' + 1) / float(S)) | |
// and the number of padded cells is always zero. | |
// When the stride is 1, the expression simplifies to | |
// H' = H-K'+1. | |
// | |
// TODO(b/67112639): Merge V2 versions and the original versions eventually. | |
Status GetWindowedOutputSizeV2(int64 input_size, int64 filter_size, | |
int64 dilation_rate, int64 stride, | |
Padding padding_type, int64* output_size, | |
int64* padding_size); | |
// Returns the same output dimensions as in GetWindowedOutputSize, but returns | |
// verbose padding dimensions (before/after). Any excess padding | |
// (caused by an odd padding size value) is added to the 'padding_after' | |
// dimension. | |
Status GetWindowedOutputSizeVerbose(int64 input_size, int64 filter_size, | |
int64 stride, Padding padding_type, | |
int64* output_size, int64* padding_before, | |
int64* padding_after); | |
// The V2 version computes the same outputs with arbitrary dilation_rate. For | |
// detailed equations, refer to the comments for GetWindowedOutputSizeV2(). | |
Status GetWindowedOutputSizeVerboseV2(int64 input_size, int64 filter_size, | |
int64 dilation_rate, int64 stride, | |
Padding padding_type, int64* output_size, | |
int64* padding_before, | |
int64* padding_after); | |
// Given an input tensor, kernel, stride and padding type, populates the 3D size | |
// of the output tensor and padding to be applied to the input tensor at the | |
// lower end of every dimension. Use for 3D convolutions, where the input data | |
// is padded with zeros, as well as for 3D avg/max pooling, where the input data | |
// is padded with invalid values that are not considered for pooling. | |
Status Get3dOutputSize(const std::array<int64, 3>& input, | |
const std::array<int64, 3>& window, | |
const std::array<int64, 3>& strides, | |
Padding padding_type, std::array<int64, 3>* output_ptr, | |
std::array<int64, 3>* padding_ptr); | |
// The V2 version computes the same outputs with arbitrary dilation_rate. For | |
// detailed equations, refer to the comments for GetWindowedOutputSizeV2(). | |
Status Get3dOutputSizeV2(const std::array<int64, 3>& input, | |
const std::array<int64, 3>& window, | |
const std::array<int64, 3>& dilations, | |
const std::array<int64, 3>& strides, | |
Padding padding_type, std::array<int64, 3>* output_ptr, | |
std::array<int64, 3>* padding_ptr); | |
namespace shape_inference { | |
// Like GetWindowedOutputSize, but deals with DimensionHandles. | |
Status GetWindowedOutputSizeFromDims(InferenceContext* c, | |
DimensionHandle input_size, | |
DimensionOrConstant filter_size, | |
int64 stride, Padding padding_type, | |
DimensionHandle* output_size); | |
// The V2 version computes the same outputs with arbitrary dilation_rate. For | |
// detailed equations, refer to the comments for GetWindowedOutputSizeV2(). | |
Status GetWindowedOutputSizeFromDimsV2(InferenceContext* c, | |
DimensionHandle input_size, | |
DimensionOrConstant filter_size, | |
int64 dilation_rate, int64 stride, | |
Padding padding_type, | |
DimensionHandle* output_size); | |
// Transfers shape of input(0) to output(0). | |
Status UnchangedShape(shape_inference::InferenceContext* c); | |
// Transfers shape of input(0) to output(0), after asserting its rank is <rank>. | |
inline Status UnchangedShapeWithRank(shape_inference::InferenceContext* c, | |
int32 rank) { | |
ShapeHandle out; | |
TF_RETURN_IF_ERROR(c->WithRank(c->input(0), rank, &out)); | |
c->set_output(0, out); | |
return Status::OK(); | |
} | |
// Transfers shape of input(0) to output(0), after asserting its rank >= <rank>. | |
inline Status UnchangedShapeWithRankAtLeast( | |
shape_inference::InferenceContext* c, int32 rank) { | |
ShapeHandle out; | |
TF_RETURN_IF_ERROR(c->WithRankAtLeast(c->input(0), rank, &out)); | |
c->set_output(0, out); | |
return Status::OK(); | |
} | |
// Transfers shape of input(0) to output(0), after asserting its rank <= <rank>. | |
inline Status UnchangedShapeWithRankAtMost(shape_inference::InferenceContext* c, | |
int32 rank) { | |
ShapeHandle out; | |
TF_RETURN_IF_ERROR(c->WithRankAtMost(c->input(0), rank, &out)); | |
c->set_output(0, out); | |
return Status::OK(); | |
} | |
// Shape function for use with ops no outputs. | |
inline Status NoOutputs(shape_inference::InferenceContext* c) { | |
return Status::OK(); | |
} | |
// Shape function for ops that output a single scalar value. | |
inline Status ScalarShape(shape_inference::InferenceContext* c) { | |
c->set_output(0, c->Scalar()); | |
return Status::OK(); | |
} | |
// Shape function for binary ops where both inputs and the output match. | |
inline Status MergeBothInputsShapeFn(InferenceContext* c) { | |
ShapeHandle out; | |
TF_RETURN_IF_ERROR(c->Merge(c->input(0), c->input(1), &out)); | |
c->set_output(0, out); | |
return Status::OK(); | |
} | |
// Returns a new shape with the specified dims arranged in the specified | |
// format. The returned value is owned by this context. | |
// Note: if format = "FORMAT_NCHW_VECT_C" then C represents the outer_depth. | |
Status MakeShapeFromFormat(TensorFormat format, DimensionOrConstant N, | |
const std::vector<DimensionOrConstant>& spatial, | |
DimensionOrConstant C, ShapeHandle* out, | |
shape_inference::InferenceContext* context); | |
// Shape function for MatMul-like operations. | |
Status MatMulShape(shape_inference::InferenceContext* c); | |
// Shape function for BiasAdd-like operations. | |
Status BiasAddShape(shape_inference::InferenceContext* c); | |
// Shape function for BiasAddGrad-like operations. | |
Status BiasAddGradShape(shape_inference::InferenceContext* c); | |
// Shape function for Conv2D-like operations. | |
Status Conv2DShape(shape_inference::InferenceContext* c); | |
// Shape function for Conv3D-like operations. | |
Status Conv3DShape(shape_inference::InferenceContext* c); | |
// Shape function for DepthwiseConv2D-like operations. | |
Status DepthwiseConv2DNativeShape(shape_inference::InferenceContext* c); | |
// Shape function for AvgPool-like operations. | |
Status AvgPoolShape(shape_inference::InferenceContext* c); | |
// Shape function for FusedBatchNorm and FusedBatchNormV2 operations. | |
Status FusedBatchNormShape(shape_inference::InferenceContext* c); | |
// Shape function for FusedBatchNormGrad and FusedBatchNormGradV2 operations. | |
Status FusedBatchNormGradShape(shape_inference::InferenceContext* c); | |
// Shape function for MaxPool-like operations. | |
Status MaxPoolShape(shape_inference::InferenceContext* c); | |
// Shape function for MaxPoolV2-like operations. | |
Status MaxPoolV2Shape(shape_inference::InferenceContext* c, int num_inputs); | |
// Shape function for 3D Pooling operations. | |
Status Pool3DShape(shape_inference::InferenceContext* c); | |
// Shape function for use with ops whose output shapes are unknown. | |
Status UnknownShape(shape_inference::InferenceContext* c); | |
// Shape function for reduction operations. | |
Status ReductionShape(shape_inference::InferenceContext* c); | |
// Shape function for concat operations. | |
// <num_inputs_to_concat> is the number of inputs to concatenate and are taken | |
// from inputs | |
// [1,num_inputs_to_concat] of the op. Input 0 is the concat_dim input. | |
Status ConcatShape(shape_inference::InferenceContext* c, | |
int num_inputs_to_concat); | |
// Shape function for concat operations. | |
Status ConcatV2Shape(shape_inference::InferenceContext* c); | |
// Shape function for binary operators that broadcast their inputs. | |
// Tested by ops/math_ops_test.cc. | |
Status BroadcastBinaryOpShapeFn(InferenceContext* c); | |
// Shape function for random operations. | |
Status RandomShape(shape_inference::InferenceContext* c); | |
// Validates the 3 component tensors of a sparse tensor have the proper | |
// shapes. This mimics SparseTensor.__init__ in python/framework/ops.py. | |
Status ValidateSparseTensor(InferenceContext* c, ShapeHandle indices_shape, | |
ShapeHandle values_shape, ShapeHandle shape_shape); | |
// Shape function for ScatterNd update/add/sub/... operations. | |
Status ScatterNdUpdateShape(InferenceContext* c); | |
// Shape function for ops with an explicit "shape" attribute. | |
Status ExplicitShape(InferenceContext* c); | |
} // namespace shape_inference | |
} // namespace tensorflow | |