深度学习-卷积神经网络基础2-43

1. 池化层

为什么要有池化层?
目标就是降采样subsample,shrink,减少计算负荷,内存使用,参数数量(也可防止过拟合)
正如卷积神经网络一样,在池化层中的每个神经元被连接到上面一层输出的神经元,只对应一小块感受野的区域。我们必须定义大小,步长,padding类型
池化神经元没有权重值,它只是聚合输入根据取最大或者是求均值
2*2的池化核,步长为2,没有填充,只有最大值往下传递,其他输入被丢弃掉了
长和宽两倍小,面积4倍小,丢掉75%的输入值
一般情况下,池化层工作于每一个独立的输入通道,所以输出的深度和输入的深度相同

在保留图片特征的前提下 压缩图片 降低数据量

2. CNN的一般架构

典型的CNN架构堆列一些卷积层
一般一个卷积层后跟ReLU层,然后是一个池化层,然后另一些个卷积层+ReLU层,然后另一个池化层,通过网络传递的图片越来越小,但是也越来越深,例如更多的特征图!
最后常规的前向反馈神经网络被添加,由一些全连接的层+ReLU层组成,最后是输出层预测,例如一个softmax层输出预测的类概率
一个常见的误区是使用卷积核过大,你可以使用和99的核同样效果的两个33的核,
好处是会有更少的参数需要被计算,还可以在中间多加一个非线性激活函数ReLU,来提供复杂程度

3. 经典的LeNet


4 代码

import numpy as np
from sklearn.datasets import load_sample_images
import tensorflow as tf
import matplotlib.pyplot as plt


# 加载数据集
# 输入图片通常是3D,[height, width, channels]
# mini-batch通常是4D,[mini-batch size, height, width, channels]
dataset = np.array(load_sample_images().images, dtype=np.float32)
# 数据集里面两张图片,一个中国庙宇,一个花
batch_size, height, width, channels = dataset.shape
print(batch_size, height, width, channels)

# plt.imshow(load_sample_images().images[0])  # 绘制第一个图
# plt.show()

# plt.imshow(load_sample_images().images[1])  # 绘制第二个图
# plt.show()

# 创建两个filters
# 高,宽,通道,卷积核
# 7, 7, channels, 2
filters_test = np.zeros(shape=(7, 7, channels, 2), dtype=np.float32)
filters_test[:, 3, :, 0] = 1  # 垂直
filters_test[3, :, :, 1] = 1  # 水平

# filter参数是一个filters的集合
X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
# strides=[1, 2, 2, 1] 中第一最后一个为1,中间对应sh和sw
convolution = tf.nn.conv2d(X, filter=filters_test, strides=[1, 1, 1, 1], padding='SAME')

with tf.Session() as sess:
    output = sess.run(convolution, feed_dict={X: dataset})
    print(output.shape)


plt.imshow(load_sample_images().images[0])  # 绘制第一个图
plt.show()

plt.imshow(output[0, :, :, 0])  # 绘制第一个图的第一个特征图
plt.show()

plt.imshow(output[0, :, :, 1])  # 绘制第一个图的第二个特征图
plt.show()

plt.imshow(load_sample_images().images[1])  # 绘制第二个图
plt.show()

plt.imshow(output[1, :, :, 0])  # 绘制第二个图的第一个特征图
plt.show()

plt.imshow(output[1, :, :, 1])  # 绘制第二个图的第二个特征图
plt.show()

5 代码2

import numpy as np
from sklearn.datasets import load_sample_images
import tensorflow as tf
import matplotlib.pyplot as plt


# 加载数据集
# 输入图片通常是3D,[height, width, channels]
# mini-batch通常是4D,[mini-batch size, height, width, channels]
dataset = np.array(load_sample_images().images, dtype=np.float32)
# 数据集里面两张图片,一个中国庙宇,一个花
batch_size, height, width, channels = dataset.shape
print(batch_size, height, width, channels)

# 创建输入和一个池化层
X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
# TensorFlow不支持池化多个实例,所以ksize的第一个batch size是1
# TensorFlow不支持池化同时发生的长宽高,所以必须有一个是1,这里channels就是depth维度为1
max_pool = tf.nn.max_pool(X, ksize=[1, 4, 4, 1], strides=[1, 4, 4, 1], padding='VALID')
# avg_pool()

with tf.Session() as sess:
    output = sess.run(max_pool, feed_dict={X: dataset})
    print(output.shape)

plt.imshow(dataset[0].astype(np.uint8))
plt.show()
plt.imshow(output[0].astype(np.uint8))  # 画输入的第一个图像
plt.show()

plt.imshow(dataset[1].astype(np.uint8))
plt.show()
plt.imshow(output[1].astype(np.uint8))  # 画输入的第二个图像
plt.show()

posted @ 2024-02-20 22:49  jack-chen666  阅读(5)  评论(0编辑  收藏  举报