卷积神经网络(Convolutional Neural Network,简称 CNN)是一种特殊的神经网络结构,主要应用于图像识别、语音识别等领域。CNN 的特点是具有卷积层和池化层,能够从复杂数据中提取特征,降低计算复杂度,并实现平移不变性。
CNN 的基本结构包括以下几个部分:
- 输入层:输入原始数据,如图像或音频信号等。
- 卷积层:提取数据特征,通常使用卷积核(一个小的函数)与输入数据进行局部卷积操作。卷积操作具有权值共享和局部性特点,可以减少计算量和参数数量。
- 池化层:对数据进行降维处理,通常采用最大池化或平均池化方法。池化层可以降低计算复杂度,同时保留关键信息。
- 激活函数:引入非线性变换,使神经网络可以学习更加复杂的函数。常见的激活函数有 sigmoid、ReLU 和 tanh 等。
- 全连接层:将卷积层和池化层输出的数据进行整合,并进行分类或回归等任务。全连接层类似于传统的多层感知器(Multilayer Perceptron,简称 MLP),但其参数数量较少,因为卷积层和池化层已经提取了关键特征。
- 输出层:根据任务类型,输出预测结果,如图像分类结果或目标检测坐标等。
CNN 学习 demos 可以帮助您更好地理解卷积神经网络的结构和原理。以下是一些建议的学习 demos: - TensorFlow 官方文档:TensorFlow 提供了详细的 CNN 教程和示例代码,涵盖了从简单的手写数字识别(MNIST 数据集)到复杂的图像分类(CIFAR-10 数据集)等多个应用场景。网址:https://www.tensorflow.org/tutorials
- PyTorch 官方文档:PyTorch 提供了丰富的 CNN 教程和 demos,包括图像分类、物体检测、语义分割等任务。网址:https://pytorch.org/tutorials
- Kaggle:Kaggle 是一个数据科学竞赛平台,提供了许多有趣的项目和数据集。您可以通过参加比赛,学习其他选手的 CNN 模型和技巧。网址:https://www.kaggle.com
通过学习 demos 和实践项目,您可以更好地理解卷积神经网络的原理和应用,为以后的研究和工作打下坚实的基础。
Convolutions and maxpool
Load the CIFAR-10 images, and define helper functions to visualize the convolutions and weights:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import cifar_tools
import tensorflow as tf
names, data, labels = \
cifar_tools.read_data('./cifar-10-batches-py')
def show_conv_results(data, filename=None):
plt.figure()
rows, cols = 4, 8
for i in range(np.shape(data)[3]):
img = data[0, :, :, i]
plt.subplot(rows, cols, i + 1)
plt.imshow(img, cmap='Greys_r', interpolation='none')
plt.axis('off')
if filename:
plt.savefig(filename)
else:
plt.show()
def show_weights(W, filename=None):
plt.figure()
rows, cols = 4, 8
for i in range(np.shape(W)[3]):
img = W[:, :, 0, i]
plt.subplot(rows, cols, i + 1)
plt.imshow(img, cmap='Greys_r', interpolation='none')
plt.axis('off')
if filename:
plt.savefig(filename)
else:
plt.show()
names ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
(50000, 3072) (50000,)
Let's start with a an example image:
raw_data = data[4, :]
raw_img = np.reshape(raw_data, (24, 24))
plt.figure()
plt.imshow(raw_img, cmap='Greys_r')
plt.show()
Define the TensorFlow ops:
x = tf.reshape(raw_data, shape=[-1, 24, 24, 1])
W = tf.Variable(tf.random_normal([5, 5, 1, 32]))
b = tf.Variable(tf.random_normal([32]))
conv = tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
conv_with_b = tf.nn.bias_add(conv, b)
conv_out = tf.nn.relu(conv_with_b)
k = 2
maxpool = tf.nn.max_pool(conv_out, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME')
Visualize the effects of running the convolution and maxpool ops:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
W_val = sess.run(W)
print('weights:')
show_weights(W_val)
conv_val = sess.run(conv)
print('convolution results:')
print(np.shape(conv_val))
show_conv_results(conv_val)
conv_out_val = sess.run(conv_out)
print('convolution with bias and relu:')
print(np.shape(conv_out_val))
show_conv_results(conv_out_val)
maxpool_val = sess.run(maxpool)
print('maxpool after all the convolutions:')
print(np.shape(maxpool_val))
show_conv_results(maxpool_val)
weights:
convolution results:
(1, 24, 24, 32)
convolution with bias and relu:
(1, 24, 24, 32)
maxpool after all the convolutions:
(1, 12, 12, 32)