internal static Function Conv(this Function input, int[] filterShape, int filterCount, int[] filterStride, Padding padding, // TODO: Consider if padding should be decided pr. dimension. CNTKDictionary weightInitializer, CNTKDictionary biasInitializer, DeviceDescriptor device, DataType dataType) { var weights = new Parameter(NDShape.CreateNDShape(filterShape), dataType, weightInitializer, device); var strideShape = NDShape.CreateNDShape(filterStride); // Currently, only sharing=true is supported by CNTK. So these are hardcoded. // sharing dimensions follows stride dimensions. 1D, 2D, 3D, etc. var sharing = CntkUtilities.CreateFilledBoolVector(filterStride.Length, true); // Padding dimensions follows stride dimensions. 1D, 2D, 3D, etc. var usePadding = padding.ToBoolean(); var autoPadding = CntkUtilities.CreateFilledBoolVector(filterStride.Length, usePadding); // TODO: Consider if we want to surface the additional options for Convolution: // - dilation // - reductionRank // - groups // - maxTempMemSizeInSamples // Default for dilation seems to be a shape of size (1) with value 1 var dilation = NDShape.CreateNDShape(new[] { 1 }); // Following are defaults extrapolated from CNTK code var reductionRank = 1u; var groups = 1u; var maxTempMemSizeInSamples = 0u; var sequential = false; var result = CNTKLib.Convolution( weights, input, strideShape, sharing, autoPadding, dilation, reductionRank, groups, maxTempMemSizeInSamples, sequential); if (biasInitializer != null) { // Bias dimensions should be defined for filter dimensions. // For instance for 2D case: (1, 1, filterChannels). var biasShape = filterStride.Select(s => 1).ToList(); biasShape.Add(filterCount); var bias = new Parameter(NDShape.CreateNDShape(biasShape.ToArray()), dataType, biasInitializer, device); result = CNTKLib.Plus(result, bias); } return(result); }
public static Function MaxPool2D(this Function input, ValueTuple <int, int> poolShape, ValueTuple <int, int> strideShape, Padding padding) { var usePadding = padding.ToBoolean(); var poolSizes = new int[] { poolShape.Item1, poolShape.Item2 }; var strideSizes = new int[] { strideShape.Item1, strideShape.Item2 }; var paddingSizes = new bool[] { usePadding, usePadding }; return(CNTKLib.Pooling(input, PoolingType.Max, poolSizes, strideSizes, paddingSizes)); }
public static Function MaxPool1D(this Function input, int poolShape, int strideShape, Padding padding) { var usePadding = padding.ToBoolean(); var poolSizes = new int[] { poolShape }; var strideSizes = new int[] { strideShape }; var paddingSizes = new bool[] { usePadding }; return(CNTKLib.Pooling(input, PoolingType.Max, poolSizes, strideSizes, paddingSizes)); }