用 CNN(卷积神经网络)识别手写数字(0-9)

简单示例,一个用 CNN 识别 MNIST 手写数字的模型。数据是 60,000 张训练和 10,000 张测试的 28×28 灰度图,先归一化到 0-1,再加通道。模型用两层卷积(32 和 64 个滤波器)提取特征,两层池化缩小尺寸,再展平后用两个全连接层(128 和 10 个神经元)输出概率。训练 5 轮,用 adam 优化,损失是交叉熵。

import tensorflow as tf
import numpy as np

# 1. 加载MNIST 数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.l[......]

继续阅读

理解卷积神经网络(CNN)四个基本概念四:展平与全连接

展平与全连接得到特征值

import numpy as np

# 1、定义输入图片:4x4的图片,0表示白色,1表示黑色
image = np.array([
    [0, 0, 1, 1],
    [0, 0, 1, 1],
    [1, 1, 0, 0],
    [1, 1, 0, 0]
])
print('输入图片: \n', image)

# 2、卷积:用2x2滤波找对角特征
filter_simple = np.array([
    [1, 0], 
    [0, 1]
])
print('滤波器: \n', filter_simple)

# 计算卷积结果
con[......]

继续阅读

理解卷积神经网络(CNN)四个基本概念三:矩阵

矩阵是图像在计算机中的一种表示方式

import numpy as np
import matplotlib.pyplot as plt

image = np.array([
    [0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0],
])
print('图片矩阵:\n', image)

plt.imshow(image, cmap='gray')
plt.title('Simple Image')
plt.axis('off')
plt.[......]

继续阅读

理解卷积神经网络(CNN)四个基本概念二:池化

池化的目的是采样,减少计算量

import numpy as np

feature_map = np.array([
    [1, 1, 1, 1],
    [1, 1, 1, 1],
    [2, 2, 2, 2],
    [2, 2, 2, 2]
])

print('特征图:\n', feature_map)

pooled = np.zeros((2, 2))

for i in range(0, 4, 2):
    for j in range(0, 4, 2):
        pooled[i // 2, j // 2] = np.max(feature_map[i[......]

继续阅读