2017-06-03 3 views
0

次の関数で1つのホット表現を理解しようとしています。私は、この関数の各行を1行ずつ印刷しました。しかし、最後の行でインデックスが外れているというエラーが出ます。理由を理解できません。どうすればこの問題を解決できますか?他人のためにインデックスのエラーを表す1つのホット表現

def dense_to_one_hot(labels_dense, num_classes): 
    num_labels = labels_dense.shape[0] 
    index_offset = np.arange(num_labels) * num_classes 
    labels_one_hot = np.zeros((num_labels, num_classes)) 
    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 
    return labels_one_hot 

labels_dense = np.arange(475000) 
print labels_dense.shape 
num_classes=10 
num_labels = labels_dense.shape[0] 
print num_labels 
index_offset = np.arange(num_labels) * num_classes 
print index_offset 
print len(index_offset) 
print 'index offset is '+str(index_offset.shape) 
labels_one_hot = np.zeros((num_labels, num_classes)) 
print labels_one_hot.shape 
x= labels_dense.ravel() 
print x 
print x.shape 
plus= index_offset+x 
print plus 
print plus.shape 
labels_one_hot.flat[plus]=1 

答えて

0

、POは公式source codeをチェックアウトし、MNISTデータを扱うTensorflowから例に言及していました。

labels_denseは、それぞれがクラス識別子である要素を格納することになっているnumpy配列です(0は「0」とラベル付けされたイメージを表し、9は「9」とラベル付けされたイメージを表します)。独自のコードでは

In [20]: labels # same as labels_dense 
Out[20]: array([7, 2, 1, ..., 4, 5, 6], dtype=uint8) 

、あなたが正しいサイズでlabels_denseを生成しますが、間違った方法:ここで

は、デフォルトのテストデータラベルがどのように見えるかです

In [34]: labels_dense 
Out[34]: array([ 0, 1, 2, ..., 474997, 474998, 474999]) 

あなたが参照してください?私はあなたのコードがうまくいかなかったことを嬉しく思っています。そうでなければ、0.5M * 0.5M〜50Bの細胞を作るかもしれません...

残りのコードはかなり簡単ですが、どのようにlabels_one_hot.flat[index_offset + labels_dense.ravel()] = 1が動作するかを示す中間ステップ。また、475Kのレコードを使用する代わりに、3レコードを使用してそのアイデアを証明することをお勧めします。あなたがnumpyのか、一般的にも、Pythonの持つあなたの質問にラベルを付ける場合

In [35]: labels_dense = labels[:3] 
In [36]: labels_dense 
Out[36]: array([7, 2, 1], dtype=uint8) 
In [37]: num_classes = 10 
In [38]: num_labels = labels_dense.shape[0] 
In [39]: index_offset = np.arange(num_labels) * num_classes 
In [40]: index_offset 
Out[40]: array([ 0, 10, 20]) 
In [41]: labels_one_hot = np.zeros((num_labels, num_classes)) 
In [42]: labels_one_hot 
Out[42]: 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 
In [43]: index_offset + labels_dense.ravel() 
Out[43]: array([ 7, 12, 21]) 
In [44]: labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 
In [45]: labels_one_hot 
Out[45]: 
array([[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

また、この段階では、あなたのコードは、まったくTensorflowとは何の関係もありません、あなたはより速く、おそらくより良い助けを得るでしょう。

参考:flatravelarangezeros

+0

は、このような詳細な説明のためにありがとうございました。今では私のコードでエラーが発生しているので、私のアルゴリズムはトレーニングとテストの両方で効率が悪いです。あなたは、私がlabel_dense [0,1、... 474999]を、あなたが言及したラベルformateに変換する方法を説明してください。私のコードでは、1 uptil 24からのラベル付けを開始しますが、トレーニングセットとラベルの両方をシャッフルします。自分の行インデックスをsample.shape [0]としてシャッフルするので、エラーが発生します。 –

+0

@ R.ali、私はあなたが欲しいものを理解しているとは思わない。 "私は自分のlabel_denseをあなたが言及したラベル形式に変換することはできますか?"範囲内のiについて –

+0

行= sample.shape [0] ラベル= np.array([範囲のI 1(行)]) (1100): \t k4_label = I + 1 \t label_file = np.array (0)== label.shape [0] ラベル:np.append(ラベル、ラベルファイル、軸= 0) shuffled_sample.shape [0] = = shuffled_label.shape [0] –

関連する問題