2017-11-29 2 views
0

나는 matplotlib를 사용하여 다양한 수의 노드와 숨겨진 레이어로 신경 네트워크를 실행 한 결과를 플롯하려고하는데, 가장 좋은 방법은 this type of graph을 복제하는 것이고, 그래서 내가 보여줄 수 :PolyCollection 3D 그래프가있는 빈 플롯

  • 정확도 (Z 축) 뉴런의 다른 번호 (y 축)을 통해
  • 숨겨진 층 (x 축)의 수는 이러한 추세에 미치는 영향

전에 링크 된 데모에서 코드를 수정하여 불행히도, 성취하려고 시도했다. 그리고 불행하게도, 나는 단지 얻는다. an empty graph. 나는 개인적으로 matplotlib의 문서가 매우 부족하다는 것을 알았고, 튜토리얼은 그것이 어떻게 작동했는지에 대한 설명을 가지고 있지 않았다. 전에 그것으로 3D 음모.

다음 차원 플롯 구축에 관심을 내 코드의 일부입니다

verts = [] 
for i in range(len(z_axis_values)): 
    ys = [0] + y_axis_values + [0] 
    verts.append(list(zip(x_axis_values, ys))) 

# Create a 3D plot 
fig: Axes3D = plt.figure().add_subplot(111, projection='3d') 
poly = PolyCollection(verts=verts, facecolors=[cc(color_options[i]) for i in range(len(x_axis_values))]) 
poly.set_alpha(0.7) 

# Build the image 
fig.add_collection3d(poly, zs=z_axis_values, zdir='y') 
fig.set_xlabel(x_label) 
fig.set_xlim3d(min(x_axis_values), max(x_axis_values)) 
fig.set_ylabel(z_label) 
fig.set_ylim3d(min(y_axis_values), max(y_axis_values)) 
fig.set_zlabel("Accuracy") 
fig.set_zlim3d(min(z_axis_values), 100) 
fig.set_label("Accuracy over {} and {} in {}".format(x_label, z_label, data_set)) 
plt.savefig("plot_{}_{}_{}.png".format(data_set, x_label.replace(' ', ''), z_label.replace(' ', '')), 
      bbox_inches='tight') 
plt.show() 

를 그리고이 작동하지 않는 이유를 이해하는 데 도움이된다면, 나는 세부 데이터가 예에서 사용 된 것입니다 I 그것을 테스트 봤는데 :

>>> x_axis_values  # Number of neurons 
[2, 10, 20, 50, 100] 
>>> y_axis_values  # Number of hidden layers 
[2, 3, 5] 
>>> z_axis_values  # Accuracies of all the runs of the neural net, testing each possible number of hidden layers on each possible number of neurons 
[94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 57.89473684210527, 92.10526315789474, 92.10526315789474, 57.89473684210527, 94.73684210526315, 94.73684210526315, 94.73684210526315] 

을 나는이 문제를 알아 내려고 노력에 도움이 될 수있는 정보를 누락하는 경우 알려 주시기 바랍니다.

+2

'fig : Axes3D = plt.figure(). add_subplot (111, projection = '3d')'줄을 어디에서 찾을 수 있었습니까? 이것은 매우 이상한 문법입니다. 여러분이'fig'라고 부르는'Axes3D' 객체를 만들고 있는데, 이것은 혼란스러워 보입니다. –

+0

@Diziet 강력하게 타이핑하는 변수를위한 표준 파이썬 3 구문입니다. 나는 그것을하기 위해 나의 린터가 나를 비명 지르기를 멈추게하려고했다. 이름'무화과'에 관해서는, 그것은 단지 나쁜 변수 이름 lmao입니다. – AdumbCopper

+0

@Diziet 귀하의 답변에 감사드립니다. 그것은 매우 상세하고 이해하기 쉽습니다. 너 멋지다! – AdumbCopper

답변

0

코드에 이상한 점이 있습니다. 나는 당신의 질문에 연결된 from the example code을 다시 시작했다.

코드를 이해했다면 3 개의 레이어가 있고 각각 5 개의 뉴런이 있습니다. 그리고 당신은 15 개의 정확도 값을 가지고 있습니다. 그래서 나는 그것들이 [5 x 레이어 1, 5 x 레이어 2, 5 x 레이어 3]으로 구성되어 있다고 가정합니다. 그것이 맞다면, 나는 희미한 (3,5) 값을 갖도록 Z- 값을 재구성 할 것입니다. 그래서 그것들을 반복하는 것이 더 쉽습니다.

z_axis_values = np.array(z_axis_values).reshape((len(y_axis_values),len(x_axis_values))) 

그런 다음 다각형 정점을 만들어야합니다. 이것은과 같이 매우 쉽게 할 수있다 :

우리에게 다음과 같은 모양이 다각형을 제공
verts = [] 
for z in z_axis_values: 
    verts.append(list(zip(x_axis_values, z))) 

은 당신이 찾고있는 것을 확실히 아니다 (I는 빨간색 점이있는 모서리의 좌표를 강조했습니다).

enter image description here

은 당신이 원하는 것은 0으로 내려갑니다 다각형 (또는 임의의 값 bottom_val)입니다. 당신이 바로 다각형을 일단

verts = [] 
for z in z_axis_values: 
    verts.append(list(zip(
     [x_axis_values[0]]+x_axis_values+[x_axis_values[-1]], 
     [bottom_val]+z.tolist()+[bottom_val]))) 

enter image description here

, 당신은 단지에있다 : 그래서 우리는 점에 왼쪽 가장자리에 하나 다각형의 오른쪽 가장자리 중 하나를 추가하는 코드를 수정해야 예제에서 나머지 코드를 적용합니다.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import PolyCollection 
import matplotlib.pyplot as plt 
from matplotlib import colors as mcolors 
import numpy as np 

x_axis_values = [2, 10, 20, 50, 100] 
y_axis_values = [2, 3, 5] 
z_axis_values = [94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 57.89473684210527, 92.10526315789474, 92.10526315789474, 57.89473684210527, 94.73684210526315, 94.73684210526315, 94.73684210526315] 
z_axis_values = np.array(z_axis_values).reshape((len(y_axis_values),len(x_axis_values))) 

#bottom_val = min(z_axis_values.flatten()) 
bottom_val = 50 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

def cc(arg): 
    return mcolors.to_rgba(arg, alpha=0.6) 

verts = [] 
for z in z_axis_values: 
    verts.append(list(zip([x_axis_values[0]]+x_axis_values+[x_axis_values[-1]], [bottom_val]+z.tolist()+[bottom_val]))) 


poly = PolyCollection(verts, facecolors=[cc('r'), cc('g'), cc('b')]) 
poly.set_alpha(0.7) 
ax.add_collection3d(poly, zs=y_axis_values, zdir='y') 

ax.set_xlabel('Neurons') 
ax.set_xlim3d(min(x_axis_values), max(x_axis_values)) 

ax.set_ylabel('Hidden Layers') 
ax.set_ylim3d(min(y_axis_values), max(y_axis_values)) 

ax.set_zlabel('Accuracy') 
ax.set_zlim3d(bottom_val, 100) 

plt.show() 

enter image description here

희망하는 데 도움이.