# 18.2 实现几何图形分类

## 18.2 实现几何图形分类⚓︎

### 18.2.2 用前馈神经网络解决问题⚓︎

def dnn_model():
num_output = 5
max_epoch = 50
batch_size = 16
learning_rate = 0.1
params = HyperParameters_4_2(
learning_rate, max_epoch, batch_size,
net_type=NetType.MultipleClassifier,
init_method=InitialMethod.MSRA,
optimizer_name=OptimizerName.SGD)

net = NeuralNet_4_2(params, "pic_dnn")

f1 = FcLayer_2_0(784, 128, params)
r1 = ActivationLayer(Relu())

f2 = FcLayer_2_0(f1.output_size, 64, params)
r2 = ActivationLayer(Relu())

f3 = FcLayer_2_0(f2.output_size, num_output, params)
s3 = ClassificationLayer(Softmax())

return net


### 18.2.3 用卷积神经网络解决问题⚓︎

def cnn_model():
num_output = 5
max_epoch = 50
batch_size = 16
learning_rate = 0.1
params = HyperParameters_4_2(
learning_rate, max_epoch, batch_size,
net_type=NetType.MultipleClassifier,
init_method=InitialMethod.MSRA,
optimizer_name=OptimizerName.SGD)

net = NeuralNet_4_2(params, "shape_cnn")

c1 = ConvLayer((1,28,28), (8,3,3), (1,1), params)
r1 = ActivationLayer(Relu())
p1 = PoolingLayer(c1.output_shape, (2,2), 2, PoolingTypes.MAX)

c2 = ConvLayer(p1.output_shape, (16,3,3), (1,0), params)
r2 = ActivationLayer(Relu())
p2 = PoolingLayer(c2.output_shape, (2,2), 2, PoolingTypes.MAX)

params.learning_rate = 0.1

f3 = FcLayer_2_0(p2.output_size, 32, params)
bn3 = BnLayer(f3.output_size)
r3 = ActivationLayer(Relu())

f4 = FcLayer_2_0(f3.output_size, num_output, params)
s4 = ClassificationLayer(Softmax())

return net


ID 类型 参数 输入尺寸 输出尺寸
1 卷积 8x3x3, S=1,P=1 1x28x28 8x28x28
2 激活 Relu 8x28x28 8x28x28
3 池化 2x2, S=2, Max 8x28x28 8x14x14
4 卷积 16x3x3, S=1 8x14x14 16x12x12
5 激活 Relu 16x12x12 16x12x12
6 池化 2x2, S=2, Max 16x6x6 16x6x6
7 全连接 32 576 32
8 归一化 32 32
9 激活 Relu 32 32
10 全连接 5 32 5
11 分类 Softmax 5 5

......
epoch=49, total_iteration=14099
loss_train=0.002093, accuracy_train=1.000000
loss_valid=0.163053, accuracy_valid=0.944000
time used: 259.32207012176514
testing...
0.935
0.96


### 18.2.4 形状分类可视化解释⚓︎

1 左侧边缘 0 1 0 1 1
2 大色块区域 0 1 1 1 1
3 左上侧边缘 0 1 1 0 1
4 45度短边 1 1 1 0 1
5 右侧边缘、上横边 0 0 0 1 1
6 左上、右上、右下 0 1 1 0 1
7 左边框和右下角 0 0 0 1 1
8 左上和右下，及背景 0 0 1 0 1

1. 比如第一个卷积核，其作用为判断是否有左侧边缘，那么第一行的数据为[0,1,0,1,1]，表示对直线和菱形来说，没有左侧边缘特征，而对于三角形、矩形、圆形来说，有左侧边缘特征。这样的话，就可以根据这个特征把5种形状分为两类：

2. A类有左侧边缘特征：三角形、矩形、圆形

3. B类无左侧边缘特征：直线、菱形

4. 再看第二个卷积核，是判断是否有大色块区域的，只有直线没有该特征，其它4种形状都有。那么看第1个特征的B类种，包括直线、菱形，则第2个特征就可以把直线和菱形分开了。

5. 然后我们只关注A类形状，看第三个卷积核，判断是否有左上侧边缘，对于三角形、矩形、圆形的取值为[1,0,1]，即矩形没有左上侧边缘，这样就可以把矩形从A类中分出来。

6. 对于三角形和圆形，卷积核5、7、8都可以给出不同的值，这就可以把二者分开了。

ch18, Level2

### 思考和练习⚓︎

1. 我们使用了3x3的卷积核，如果用5x5的卷积核，但是在其它参数不变的情况下，其效果会不会更好？
2. 可以建立一个数据集，只包括正圆、椭圆、正方形、矩形等四种形状，看看卷积神经网络是不是能分辨出来。