<p>The answer very much depends on what exactly you call a Perceptron. Common options are:</p>

<ol>
<li><p>Complete architecture. Then <strong>no</strong>, simply because it's by definition a different NN.</p></li>
<li><p>A model of a single neuron, specifically <code>y = 1 if (w.x + b) &gt; 0 else 0</code>, where <code>x</code> is the input of the neuron, <code>w</code> and <code>b</code> are its trainable parameters and <code>w.b</code> denotes the dot product. Then <strong>yes</strong>, you can force a bunch of these perceptrons to share weights and call it a CNN. You'll find variants of this idea being used in <a href="https://arxiv.org/abs/1602.02830" rel="nofollow noreferrer">binary neural networks</a>.</p></li>
<li><p><a href="https://en.wikipedia.org/wiki/Perceptron#Learning_algorithm" rel="nofollow noreferrer">A training algorithm</a>, typically associated with the Perceptron architecture. This would make no sense to the question, because the learning algorithm is in principle orthogonal to the architecture. Though you cannot really use the Perceptron algorithm for anything with hidden layers, which would suggest <strong>no</strong> as the answer in this case.</p></li>
<li><p>Loss function associated with the original Perceptron. This notion of Peceptron is orthogonal to the problem at hand, you're loss function with a CNN is given by whatever you try to do with your whole model. You can eventually use it, but it is non-differentiable, so good luck :-)</p></li>
</ol>

<p>A sidenote rant: You can see people refer to feed-forward, fully-connected NNs with hidden layers as "Multilayer Perceptrons" (MLPs). This is a misnomer, there are no Perceptrons in MLPs, see e.g. this discussion <a href="https://en.wikipedia.org/wiki/Multilayer_perceptron#Terminology" rel="nofollow noreferrer">on Wikipedia</a> -- unless you go explore some really weird ideas. It would make sense call these networks as Multilayer Linear Logistic Regression, because that's what they used to be composed of. Up till like 6 years ago.</p>
Can a convolutional neural network be built with perceptrons?
<p>I was reading <a href="http://neuralnetworksanddeeplearning.com/chap6.html" rel="nofollow noreferrer">this interesting article</a> on convolutional neural networks. It showed this image, explaining that for every receptive field of 5x5 pixels/neurons, a value for a hidden value is calculated.</p>

<p><a href="https://i.stack.imgur.com/72Gwn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/72Gwn.png" alt="receptive field to neuron"></a></p>

<blockquote>
  <p>We can think of max-pooling as a way for the network to ask whether a given feature is found anywhere in a region of the image. It then throws away the exact positional information.</p>
</blockquote>

<p>So max-pooling is applied. </p>

<p><a href="https://i.stack.imgur.com/F0ueZ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/F0ueZ.png" alt="enter image description here"></a></p>

<p>With multiple convolutional layers, it looks something like this: </p>

<p><a href="https://i.stack.imgur.com/44S3P.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/44S3P.png" alt="enter image description here"></a></p>

<p>But my question is, this whole architecture could be build with perceptrons, right?</p>

<p>For every convolutional layer, one perceptron is needed, with layers:</p>

<pre><code>input_size = 5x5;
hidden_size = 10; e.g.
output_size = 1;
</code></pre>

<p>Then for every receptive field in the original image, the 5x5 area is inputted into a perceptron to output the value of a neuron in the hidden layer. So basically doing this for every receptive field:
<a href="https://i.stack.imgur.com/7fVFO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7fVFO.png" alt="enter image description here"></a></p>

<p>So the same perceptron is used 24x24 amount of times to construct the hidden layer, because: </p>

<blockquote>
  <p>is that we're going to use the same weights and bias for each of the 24×24 hidden neurons. </p>
</blockquote>

<p>And this works for the hidden layer to the pooling layer as well, <code>input_size = 2x2;</code> <code>output_size = 1;</code>. And in the case of a max-pool layer, it's just a <code>max()</code> function on an array.</p>

<p>and then finally:</p>

<blockquote>
  <p>The final layer of connections in the network is a fully-connected
  layer. That is, this layer connects every neuron from the max-pooled
  layer to every one of the 10 output neurons.</p>
</blockquote>

<p>which is a perceptron again.</p>

<p>So my final architecture looks like this:</p>

<pre><code>-&gt; 1 perceptron for every convolutional layer/feature map
-&gt; run this perceptron for every receptive field to create feature map
-&gt; 1 perceptron for every pooling layer
-&gt; run this perceptron for every field in the feature map to create a pooling layer
-&gt; finally input the values of the pooling layer in a regular ALL to ALL perceptron
</code></pre>

<p>Or am I overseeing something? Or is this already how they are programmed?</p>