只需输入神经网络参数parameter(权重和系数)的结构体。
function plot_fully_connected_network(parameters)
layers = fieldnames(parameters); % 获取所有层的名字
numLayers = numel(layers);
% 确定每层的神经元数目并找到最大值
neuronsPerLayer = arrayfun(@(x) numel(parameters.(layers{x}).Bias), 1:numLayers);
maxNeurons = max(neuronsPerLayer);
% 确定输入层神经元的数量
inputNeurons = size(parameters.(layers{1}).Weights, 2);
figure;
hold on;
% 设置图形属性
xlim([0, numLayers + 2]);
ylim([0, maxNeurons + 1]);
xlabel(['Layer=' num2str(numLayers+1)]);
ylabel('Neurons');
% 绘制连接,如果权重不为零
for i = 1:numLayers
currYPos = (maxNeurons - neuronsPerLayer(i)) / 2 + 1 : (maxNeurons + neuronsPerLayer(i)) / 2;
if i == 1
prevYPos = (maxNeurons - inputNeurons) / 2 + 1 : (maxNeurons + inputNeurons) / 2;
weights = parameters.(layers{i}).Weights;
else
prevYPos = (maxNeurons - neuronsPerLayer(i-1)) / 2 + 1 : (maxNeurons + neuronsPerLayer(i-1)) / 2;
weights = parameters.(layers{i}).Weights;
end
for j = 1:numel(prevYPos)
for k = 1:numel(currYPos)
if weights(k, j) ~= 0 % 检查权重是否为零
% % 连接线随权重大小而改变粗细
% lineWidth = min(abs(weights(k, j)) * 5, 5);
% lineWidth = double(gather(extractdata(max(lineWidth, 0.1))));
% line([i, i+1], [prevYPos(j), currYPos(k)], 'Color', [0 0 0], 'LineWidth', lineWidth);
% 连接线全部一样粗细
line([i, i+1], [prevYPos(j), currYPos(k)], 'Color', [0 0 0]);
end
end
end
end
% 绘制神经元,确保垂直居中
for i = 0:numLayers
if i == 0
numNeurons = inputNeurons;
else
numNeurons = neuronsPerLayer(i);
end
% 计算垂直居中的位置
yPos = (maxNeurons - numNeurons) / 2 + 1 : (maxNeurons + numNeurons) / 2;
plot(i + 1, yPos, 'bo', 'MarkerSize', 20, 'MarkerFaceColor', 'r');
end
% 设置坐标轴标签
xticklabels = {'输入层'};
for i = 1:numLayers-1
xticklabels{end+1} = ['隐藏层' num2str(i)];
end
xticklabels{end+1} = '输出层';
set(gca, 'YDir', 'reverse')
set(gca, 'XTick', 1:(numLayers + 1), 'XTickLabel', xticklabels);
set(gca, 'YTick', []);
set(gca, 'XAxisLocation', 'origin', 'YAxisLocation', 'origin');
hold off;
end