<p>Let me explain the operations you mentioned in a bit of detail so you understand the differences between their intuition and usage:</p>
<h3>Cascaded cross-channel parametric pooling:</h3>
<p>This is introduced in the <a href="https://arxiv.org/pdf/1312.4400.pdf" rel="nofollow noreferrer">Network-in-Network</a> paper and is implemented in Keras as <code>GlobalAveragePooling2D()</code>. This operation averages over the output of each feature map in the previous layers.</p>
<p>It is a structural regularizer that enforces correspondence between feature maps
and categories, so feature maps can be interpreted as category confidence. It reduces parameter count and sums up spatial information and hence, it is more robust to spatial translations of the input.</p>
<p><code>GlobalAveragePooling2D()</code> is generally used without <code>Dense()</code> layers in the model before it.</p>
<h3>Conv1D:</h3>
<p><code>Conv1D()</code> is a convolution operation exactly similar to <code>Conv2D()</code> but it applies only to one dimension. <code>Conv1D()</code> is generally used on sequences or other 1D data, not as much on images.</p>
<h3>Depthwise Separable Convolution:</h3>
<p>Quoting from the Keras <a href="https://keras.io/layers/convolutional/" rel="nofollow noreferrer">documentation</a></p>
<blockquote>
<p>Separable convolutions consist in first performing a depthwise spatial convolution (which acts on each input channel separately) followed by a pointwise convolution which mixes together the resulting output channels. The depth_multiplier argument controls how many output channels are generated per input channel in the depthwise step.</p>
</blockquote>
<p>This <a href="https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728" rel="nofollow noreferrer">blog</a> explains the depthwise separable convolution pretty well.</p>
<h3>Conv2D(num_filters, (1, 1)):</h3>
<p>This is generally known as <code>1x1</code> convolution, introduced in the <a href="https://arxiv.org/pdf/1312.4400.pdf" rel="nofollow noreferrer">Network-in-Network</a> paper.</p>
<p>The <code>1x1</code> convolutional filters are used to reduce/increase dimensionality in the filter dimension, without affecting the spatial dimensions. This is also used in the <a href="https://arxiv.org/pdf/1409.4842.pdf" rel="nofollow noreferrer">Google Inception</a> architecture for dimensionality reduction in filter space.</p>
<p>In your particular case, I am not exactly sure which of this techniques you can use. I do not think <code>Conv1D</code> would be of much use. You can definitely use<code> GlobalMaxPooling</code> or <code>GlobalAveragePooling</code> as long as you do not use <code>Dense</code> before them. This is helpful to get spatial information. Depthwise Separable Convolution can be used as well in place of your <code>Conv2D</code> layers. <code>Conv2D(num_filters, (1, 1))</code> is very helpful for dimensionality reduction in filter space, mostly towards the end of your model architecture.</p>
<p>Maybe, if you follow the resources you get a better understanding of the operations and see how they apply to your problem.</p>
Convolving Across Channels in Keras CNN: Conv1D, Depthwise Separable Conv, CCCP?
<p>I am developing a CNN in keras to classify satellite imagery that has 10 spectral bands. I'm getting decent accuracy with the network below (~60% val accuracy across 15 classes) but I want to better incorporate the relationships between spectral bands at a single pixel which can yield a lot of information on the pixel's class. I see a lot of papers doing this but it is often called different things. For example:</p>

<ul>
<li>Cascaded cross-channel parametric pooling</li>
<li>Conv1D</li>
<li>Depthwise Separable Convolution</li>
<li>Conv2D(num_filters, (1, 1))</li>
</ul>

<p>And I'm not certain about the differences between these approaches (if there are any) and how I should implement this in my simple CNN below. I'm also not clear if I should do this at the very beginning or towards the end. I'm inclined to do it right at the start when the channels are still the raw spectral data rather than the feature maps.</p>

<pre><code>input_shape = (32,32,10)
num_classes = 15

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape))
model.add(Activation('relu'))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
</code></pre>