---
title: MPSCNNFullyConnected
framework: metalperformanceshaders
role: symbol
role_heading: Class
path: metalperformanceshaders/mpscnnfullyconnected
---

# MPSCNNFullyConnected

A fully connected convolution layer, also known as an inner product layer.

## Declaration

```swift
class MPSCNNFullyConnected
```

## Overview

Overview A fully connected layer in  a Convolutional Neural Network (CNN) is one where every input channel is connected to every output channel. The kernel width is equal to the width of the source image, and the kernel height is equal to the height of the source image. The width and height of the output is 1 x 1. A fully connected layer takes an MPSImage object with dimensions source.width x source.height x Ni, convolves it with Weights[No][source.width][source.height][Ni], and produces a 1 x 1 x No output. Thus, the following conditions must be true: kernelWidth  == source.width kernelHeight == source.height clipRect.size.width == 1 clipRect.size.height == 1 You can think of a fully connected layer as a matrix multiplication where the image is flattened into a vector of length source.width*source.height*Ni, and the weights are arranged in a matrix of dimension No x (source.width*source.height*Ni) to produce an output vector of length No. The value of the strideInPixelsX, strideInPixelsY, and groups properties must be 1. The offset property is not applicable and it is ignored. Because the clip rectangle is clamped to the destination image bounds, if the destination is 1 x 1, you do not need to set the clipRect property. note: You can implement a fully connected convolution layer using an MPSCNNConvolution object by setting the following property values: offset = (kernelWidth/2,kernelHeight/2) clipRect.origin = (ox,oy) clipRect.size = (1,1) strideInPixelsX = strideInPixelsY = groups = 1 However, using an MPSCNNFullyConnected object directly is better for performance as it lets the Metal Performance Shaders framework choose the most performant implementation method, which may not be possible when you use a general convolution. For example, the framework may internally use matrix multiplication or special reduction kernels for a specific Metal feature set.

## Topics

### Initializers

- [init(coder:device:)](metalperformanceshaders/mpscnnfullyconnected/init(coder:device:).md)
- [init(device:weights:)](metalperformanceshaders/mpscnnfullyconnected/init(device:weights:).md)
- [MPSCNNConvolutionDataSource](metalperformanceshaders/mpscnnconvolutiondatasource.md)
- [init(device:convolutionDescriptor:kernelWeights:biasTerms:flags:)](metalperformanceshaders/mpscnnfullyconnected/init(device:convolutiondescriptor:kernelweights:biasterms:flags:).md)
- [MPSCNNConvolutionDescriptor](metalperformanceshaders/mpscnnconvolutiondescriptor.md)
- [MPSCNNConvolutionFlags](metalperformanceshaders/mpscnnconvolutionflags.md)

## Relationships

### Inherits From

- [MPSCNNConvolution](metalperformanceshaders/mpscnnconvolution.md)

### Conforms To

- [CVarArg](swift/cvararg.md)
- [CustomDebugStringConvertible](swift/customdebugstringconvertible.md)
- [CustomStringConvertible](swift/customstringconvertible.md)
- [Equatable](swift/equatable.md)
- [Hashable](swift/hashable.md)
- [NSCoding](foundation/nscoding.md)
- [NSCopying](foundation/nscopying.md)
- [NSObjectProtocol](objectivec/nsobjectprotocol.md)
- [NSSecureCoding](foundation/nssecurecoding.md)

## See Also

### Fully Connected Layers

- [MPSCNNBinaryFullyConnected](metalperformanceshaders/mpscnnbinaryfullyconnected.md)
- [MPSCNNFullyConnectedGradient](metalperformanceshaders/mpscnnfullyconnectedgradient.md)
