利用numpypytorch矩阵也可matplotlib 实现对 完整的深度学习运算过程的进行可视化分析。
由于深度学习运算过程涉及到很多不同的操作,下面只以一个简单的前向传播过程为例进行可视化分析。
假设有一个三层神经网络,输入数据为 $x$,第一层神经元个数为 $h_1$,第二层神经元个数为 $h_2$,输出层神经元个数为 $y$。其中,输入层到第一层的权重矩阵为 $W_1$,偏置向量为 $b_1$,第一层到第二层的权重矩阵为 $W_2$,偏置向量为 $b_2$,第二层到输出层的权重矩阵为 $W_3$,偏置向量为 $b_3$。
前向传播过程可以表示为如下公式:
$$ z_1 = W_1 x + b_1 $$ $$ a_1 = \sigma(z_1) $$ $$ z_2 = W_2 a_1 + b_2 $$ $$ a_2 = \sigma(z_2) $$ $$ z_3 = W_3 a_2 + b_3 $$ $$ y = \sigma(z_3) $$
其中,$\sigma$ 表示激活函数。
下面通过 numpy 和 matplotlib 实现对该过程的可视化分析。
首先,导入需要的库:
import numpy as np
import matplotlib.pyplot as plt
定义激活函数 sigmoid:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
设置网络参数:
x = np.array([1, 2, 3]) # 输入数据
h1 = 4 # 第一层神经元个数
h2 = 3 # 第二层神经元个数
y = 2 # 输出层神经元个数
W1 = np.random.randn(h1, x.shape[0]) # 输入层到第一层的权重矩阵
b1 = np.random.randn(h1) # 第一层偏置向量
W2 = np.random.randn(h2, h1) # 第一层到第二层的权重矩阵
b2 = np.random.randn(h2) # 第二层偏置向量
W3 = np.random.randn(y, h2) # 第二层到输出层的权重矩阵
b3 = np.random.randn(y) # 输出层偏置向量
进行前向传播过程:
z1 = np.dot(W1, x) + b1 # 第一层输入
a1 = sigmoid(z1) # 第一层输出
z2 = np.dot(W2, a1) + b2 # 第二层输入
a2 = sigmoid(z2) # 第二层输出
z3 = np.dot(W3, a2) + b3 # 输出层输入
y_pred = sigmoid(z3) # 输出层输出
将前向传播过程进行可视化分析:
# 输入层到第一层
fig, axs = plt.subplots(nrows=h1, ncols=x.shape[0], figsize=(x.shape[0], h1))
for i in range(h1):
for j in range(x.shape[0]):
axs[i, j].bar(0, x[j], width=0.5, color='b')
axs[i, j].bar(1, W1[i, j], width=0.5, color='r')
axs[i, j].set_xticks([0, 1])
axs[i, j].set_xticklabels(['x'+str(j+1), 'w'+str(i+1)+str(j+1)])
axs[i, j].set_ylim([-2, 2])
axs[i, j].set_yticks([])
plt.subplots_adjust(hspace=0.5)
# 第一层到第二层
fig, axs = plt.subplots(nrows=h2, ncols=h1, figsize=(h1, h2))
for i in range(h2):
for j in range(h1):
axs[i, j].bar(0, a1[j], width=0.5, color='b')
axs[i, j].bar(1, W2[i, j], width=0.5, color='r')
axs[i, j].set_xticks([0, 1])
axs[i, j].set_xticklabels(['a1'+str(j+1), 'w'+str(i+1)+str(j+1)])
axs[i, j].set_ylim([-2, 2])
axs[i, j].set_yticks([])
plt.subplots_adjust(hspace=0.5)
# 第二层到输出层
fig, axs = plt.subplots(nrows=y, ncols=h2, figsize=(h2, y))
for i in range(y):
for j in range(h2):
axs[i, j].bar(0, a2[j], width=0.5, color='b')
axs[i, j].bar(1, W3[i, j], width=0.5, color='r')
axs[i, j].set_xticks([0, 1])
axs[i, j].set_xticklabels(['a2'+str(j+1), 'w'+str(i+1)+str(j+1)])
axs[i, j].set_ylim([-2, 2])
axs[i, j].set_yticks([])
plt.subplots_adjust(hspace=0.5)
# 输出层
fig, axs = plt.subplots(nrows=y, ncols=2, figsize=(2, y))
for i in range(y):
axs[i, 0].bar(0, z3[i], width=0.5, color='b')
axs[i, 0].set_xticks([0])
axs[i, 0].set_xticklabels(['z3'+str(i+1)])
axs[i, 0].set_ylim([-2, 2])
axs[i, 0].set_yticks([])
axs[i, 1].bar(0, y_pred[i], width=0.5, color='b')
axs[i, 1].set_xticks([0])
axs[i, 1].set_xticklabels(['y_pred'+str(i+1)])
axs[i, 1].set_ylim([-2, 2])
axs[i, 1].set_yticks([])
plt.subplots_adjust(hspace=0.5)
运行代码,得到可视化结果:
![可视化结果](https://i.loli.net/2021/09/13/ODvKx9bRt3aZ1y5.png
原文地址: https://www.cveoy.top/t/topic/hhy2 著作权归作者所有。请勿转载和采集!