文章目录
1.CNN解决了什么问题?




2.CNN基本原理


1)卷积层
卷积层的前向传播以及计算公式

图片:7*7*3
通道:3个输入通道
卷积核




输出通道高度:(5 - 3 + 2) / 2 + 1 = 3
输出通道宽度:(5 - 3 + 2 ) / 2 + 1 = 3
2)tf自带的2D卷积层




3)动手实现卷积层
Numpy版本
import numpy as np
def conv_numpy(x,w,b,pad,strides):
# x表示输入张量,w表示卷积核,b表示偏置,pad表示填充,strides表示步长
out = None
N,H.W,C = x.shape
F,HH,WW,C = w.shape
X = np.pad(x,((0,0),(pad,pad),(pad,pad),(0,0)),'constant')
# 计算输出张量的高度与宽度
Hn = 1 + int((H + 2 * pad - HH) / strides[0])
Wn = 1 + int((W + 2 * pad - WW) / strides[1])
out = np.zeros((N,Hn,Wn,F))
for n in range(N):
for m in range(F):
for i in range(Hn):
for j in range(Wn):
data = X[n,i * strides[0] : i * strides[0] + HH,j * strides[1] : j * strides[1] + WW, :].reshape(1,-1) # 行
filt = w[m].reshape(-1,1) # 列
out[n,i,j,m] = data.dot(filt) + b(m)
return out
tf2.0版本
def corr2d(x,w,b,pad,strides):
# x表示输入张量,w表示卷积核,b表示偏置,pad表示填充,strides表示步长
out = None
N,H.W,C = tf.shape(x)
F,HH,WW,C = tf.shape(w)
X = tf.pad(x,((0,0),(pad,pad),(pad,pad),(0,0)),'constant')
# 计算输出张量的高度与宽度
Hn = 1 + int((H + 2 * pad - HH) / strides[0])
Wn = 1 + int((W + 2 * pad - WW) / strides[1])
Y = tf.Variable(tf.zeros((N,Hn,Wn,F),dtype = tf.float32))
for m in range(F):
for i in range(Hn):
for j in range(Wn):
data = X[:,i * strides[0] : i * 1 + HH,j * strides[1] : j * 1 + WW, :]
filt = w[m,:,:,:]
Y[:,i,j,m].assign(tf.reducr_sum(tf.multiply(data,filt),axis=(1,2,3)) + b[m])
return Y
4)池化层




5)动手实现池化层
tf自带的MaxPool2D


Numpy版本池化层
def max_pool_forward_native(x,pool_size=(2,2),strides=(1,1)):
N,H,W,C = x.shape
h_p,w_p = pool_size
h_s,w_s = strides
Hn = 1 + int((H - h_p) / h_s)
Wn = 1 + ins((W - w_p) / w_s)
out = np.zeros((N,Hn,Wn,C))
for i in range(Hn):
for j in range(Wn):
out[:,i,j,:] = np.max(x[:.i*h_s : i*h_s+h_p, j*w_s: j*w_s+w_p,:],axis=(1,2))
return out
tf版本池化层
def pool2d(X, pool_size=(2,2),strides=(1,1)):
N,H,W,C = tf.shape(X)
p_h,p_w = pool_size
s_h,s_w = strides
Y = tf.zeros((N,(H - p_h + 1) // s_h, (W - p_w + 1)// s_w ,C))
Y = tf.Variable(Y)
for i in tf.range(tf.shape(Y)[1]):
for j on tf.range(tf.shape(Y)[2]):
Y[:,i,j,:].assign(tf.math.reduce_max(X[:,i*s_h : i*s_h+p_h, j*s_w : j*s_w+p_w,:],axis=(1,2),keepdims=Flase))
return Y
6)全连接层

3.常用CNN架构




4.CNN有哪些实际应用






5.总结

本文介绍了卷积神经网络(CNN)的基本原理,包括卷积层、池化层和全连接层的详细讲解,探讨了CNN在深度学习中解决的问题,并通过TensorFlow展示了2D卷积和池化的实现。此外,还涵盖了常见的CNN架构及其广泛应用。

被折叠的 条评论
为什么被折叠?



