gpt4 book ai didi

python - 如何可视化神经网络

转载 作者:IT老高 更新时间:2023-10-28 20:30:26 27 4
gpt4 key购买 nike

我想为神经网络绘制一张动态图,以观察学习过程中权重的变化和神经元的激活。如何在 Python 中模拟该过程?

更准确地说,如果网络形状是:[1000, 300, 50],然后我想画一个三层神经网络,分别包含 1000、300 和 50 个神经元。此外,我希望这张图片能反射(reflect)每个时期每一层神经元的饱和度。

我不知道该怎么做。有人能帮我解释一下吗?

最佳答案

我根据米洛的回答改编了一些部分

from matplotlib import pyplot
from math import cos, sin, atan


class Neuron():
def __init__(self, x, y):
self.x = x
self.y = y

def draw(self, neuron_radius):
circle = pyplot.Circle((self.x, self.y), radius=neuron_radius, fill=False)
pyplot.gca().add_patch(circle)


class Layer():
def __init__(self, network, number_of_neurons, number_of_neurons_in_widest_layer):
self.vertical_distance_between_layers = 6
self.horizontal_distance_between_neurons = 2
self.neuron_radius = 0.5
self.number_of_neurons_in_widest_layer = number_of_neurons_in_widest_layer
self.previous_layer = self.__get_previous_layer(network)
self.y = self.__calculate_layer_y_position()
self.neurons = self.__intialise_neurons(number_of_neurons)

def __intialise_neurons(self, number_of_neurons):
neurons = []
x = self.__calculate_left_margin_so_layer_is_centered(number_of_neurons)
for iteration in xrange(number_of_neurons):
neuron = Neuron(x, self.y)
neurons.append(neuron)
x += self.horizontal_distance_between_neurons
return neurons

def __calculate_left_margin_so_layer_is_centered(self, number_of_neurons):
return self.horizontal_distance_between_neurons * (self.number_of_neurons_in_widest_layer - number_of_neurons) / 2

def __calculate_layer_y_position(self):
if self.previous_layer:
return self.previous_layer.y + self.vertical_distance_between_layers
else:
return 0

def __get_previous_layer(self, network):
if len(network.layers) > 0:
return network.layers[-1]
else:
return None

def __line_between_two_neurons(self, neuron1, neuron2):
angle = atan((neuron2.x - neuron1.x) / float(neuron2.y - neuron1.y))
x_adjustment = self.neuron_radius * sin(angle)
y_adjustment = self.neuron_radius * cos(angle)
line = pyplot.Line2D((neuron1.x - x_adjustment, neuron2.x + x_adjustment), (neuron1.y - y_adjustment, neuron2.y + y_adjustment))
pyplot.gca().add_line(line)

def draw(self, layerType=0):
for neuron in self.neurons:
neuron.draw( self.neuron_radius )
if self.previous_layer:
for previous_layer_neuron in self.previous_layer.neurons:
self.__line_between_two_neurons(neuron, previous_layer_neuron)
# write Text
x_text = self.number_of_neurons_in_widest_layer * self.horizontal_distance_between_neurons
if layerType == 0:
pyplot.text(x_text, self.y, 'Input Layer', fontsize = 12)
elif layerType == -1:
pyplot.text(x_text, self.y, 'Output Layer', fontsize = 12)
else:
pyplot.text(x_text, self.y, 'Hidden Layer '+str(layerType), fontsize = 12)

class NeuralNetwork():
def __init__(self, number_of_neurons_in_widest_layer):
self.number_of_neurons_in_widest_layer = number_of_neurons_in_widest_layer
self.layers = []
self.layertype = 0

def add_layer(self, number_of_neurons ):
layer = Layer(self, number_of_neurons, self.number_of_neurons_in_widest_layer)
self.layers.append(layer)

def draw(self):
pyplot.figure()
for i in range( len(self.layers) ):
layer = self.layers[i]
if i == len(self.layers)-1:
i = -1
layer.draw( i )
pyplot.axis('scaled')
pyplot.axis('off')
pyplot.title( 'Neural Network architecture', fontsize=15 )
pyplot.show()

class DrawNN():
def __init__( self, neural_network ):
self.neural_network = neural_network

def draw( self ):
widest_layer = max( self.neural_network )
network = NeuralNetwork( widest_layer )
for l in self.neural_network:
network.add_layer(l)
network.draw()

现在图层也被标记了,轴被删除并且构建图更容易。只需通过以下方式完成:

network = DrawNN( [2,8,8,1] )
network.draw()

这里构造了一个具有以下结构的网络:

  • 输入层中有 2 个神经元
  • 第一个隐藏层中有 8 个神经元
  • 第二个隐藏层中有 8 个神经元
  • 输出层中的 1 个神经元 enter image description here

关于python - 如何可视化神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com