2017-11-29 10 views
0

私はmatplotlibを使用して、さまざまな数のノードと隠れたレイヤーで自分のニューラルネットワークを実行した結果をプロットしようとしています。それを行う最善の方法はthis type of graph、私は示すことができる:PolyCollection 3Dグラフを使用した空のプロット

  • 精度(z軸)のニューロンの異なる数(y軸)上
  • は、隠された層(x軸)の数は、これらの傾向に影響を与える方法

私が前にリンクしたデモから、コードを修正して残念ながら、私はちょうど得ますan empty graph.私は個人的に非常に不足しているmatplotlibのドキュメントを見つけた、そしてチュートリアルはそれがどのように働いたのかについての記述を持っていませんでした。それ以前に3Dプロット。

には、以下の3次元プロットを構築すると懸念私のコードの一部です:

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強く型を指定する変数の標準的なPython 3の構文です。私はそれをしたので、私のリンターは私に叫びを止めるだろう。 'fig'という名前は、悪い変数名lmaoです。 – AdumbCopper

+0

@Dizietご回答いただきありがとうございます。それは非常に詳細で分かりやすく分かりやすいです。あなたは素晴らしいです! – AdumbCopper

答えて

0

コードには奇妙なことがいくつかあります。私はあなたの質問にリンクしてfrom the example codeを始めた。

あなたのコードを理解していれば、3つのレイヤーがあり、それぞれに5つのニューロンが含まれています。そしてあなたは15の精度値を持っているので、私はそれらが[5 x layer 1、5 x layer 2、5 x layer 3]として編成されていると仮定します。それが正しいならば、私はdim値(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))) 

は、あなたが探しているものはかなりではない、(私は赤いドットで隅の座標を強調しました)。

enter image description here

は何が欲しいのは0にダウンしたポリゴン(または任意の値bottom_val)です。だから我々はポイント、左端の1とポリゴンの右端の1に追加するコードを変更する必要があります。

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

お役に立てば幸いです。

関連する問題