wst*_*str 5 python matplotlib neural-network
我试图可视化二维数据在通过神经网络各层时如何转换和“弯曲”。仿射变换和平移很容易,但可视化激活函数(例如 tanh 或逻辑函数)如何将 2D 空间弯曲成曲线网格则构成了更大的挑战。
为了明白我的意思,Chris Olah 在他的文章《神经网络、流形和拓扑》中正是这样做的。
你们有人知道该怎么做吗?
我最终得到了以下解决方案:
首先,我使用 NumPylinspace函数指定了一个常规的 2D 网格:
x_range = range(-5,6)
y_range = range(-5,6)
lines = np.empty((len(x_range)+len(y_range), 2, 100))
for i in x_range: # vertical lines
linspace_x = np.linspace(x_range[i], x_range[i], 100)
linspace_y = np.linspace(min(y_range), max(y_range), 100)
lines[i] = (linspace_x, linspace_y)
for i in y_range: # horizontal lines
linspace_x = np.linspace(min(x_range), max(x_range), 100)
linspace_y = np.linspace(y_range[i], y_range[i], 100)
lines[i+len(x_range)] = (linspace_x, linspace_y)
Run Code Online (Sandbox Code Playgroud)
然后,我在网格上执行任意仿射变换。(这模仿了神经网络中激活和权重之间的向量矩阵乘法。)
def affine(z):
z[:, 0] = z[:, 0] + z[:,1] * 0.3 # transforming the x coordinates
z[:, 1] = 0.5 * z[:, 1] - z[:, 0] * 0.8 # transforming the y coordinates
return z
transformed_lines = affine(lines)
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的一点是,使用构成网格中每条线的(现已转换的)坐标,我应用了非线性函数(在本例中为逻辑函数):
def sigmoid(z):
return 1.0/(1.0+np.exp(-z))
bent_lines = sigmoid(transformed_lines)
Run Code Online (Sandbox Code Playgroud)
使用 matplotlib 绘制新线:
plt.figure(figsize=(8,8))
plt.axis("off")
for line in bent_lines:
plt.plot(line[0], line[1], linewidth=0.5, color="k")
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果: