public void FullyConnectedBackward()
        {
            FullyConnectedLayer
                cpu = new FullyConnectedLayer(TensorInfo.Linear(250), 127, ActivationType.LeCunTanh, WeightsInitializationMode.GlorotNormal, BiasInitializationMode.Gaussian),
                gpu = new CuDnnFullyConnectedLayer(cpu.InputInfo, cpu.OutputInfo.Size, cpu.Weights, cpu.Biases, cpu.ActivationType);

            TestBackward(cpu, gpu, 400);
        }
        public void FullyConnectedForward()
        {
            float[,] x = WeightsProvider.NewFullyConnectedWeights(TensorInfo.Linear(400), 250, WeightsInitializationMode.GlorotNormal).AsSpan().AsMatrix(400, 250);
            FullyConnectedLayer
                cpu = new FullyConnectedLayer(TensorInfo.Linear(250), 127, ActivationFunctionType.LeCunTanh, WeightsInitializationMode.GlorotNormal, BiasInitializationMode.Gaussian),
                gpu = new CuDnnFullyConnectedLayer(cpu.InputInfo, cpu.OutputInfo.Size, cpu.Weights, cpu.Biases, cpu.ActivationFunctionType);

            TestForward(cpu, gpu, x);
        }
        internal static INetworkLayer CuDnnLayerDeserialize([NotNull] Stream stream, LayerType type)
        {
            switch (type)
            {
            case LayerType.FullyConnected: return(CuDnnFullyConnectedLayer.Deserialize(stream));

            case LayerType.Convolutional: return(CuDnnConvolutionalLayer.Deserialize(stream));

            case LayerType.Pooling: return(CuDnnPoolingLayer.Deserialize(stream));

            case LayerType.Softmax: return(CuDnnSoftmaxLayer.Deserialize(stream));

            case LayerType.Inception: return(CuDnnInceptionLayer.Deserialize(stream));

            default: return(null);
            }
        }