質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

TensorFlowでの訓練データについて(自然言語処理)

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 6,563

hiroto0227

score 12

Neural networkで何か作ってみたいと思い、チュートリアルを参考にして、自分で実装しようと思いました。
チュートリアルと同じことをやっても嫌だなと思ったので固有抽出表現というラベル付けの識別を自分で実装しています。チュートリアルと変わることは、入力するデータ型とくらいです。

チュートリアルでは入力は手書き文字の28x28の画像ベクトルでした。今回はそれが各単語をword2vecにより単語をベクトル化した300次元のベクトルとしました。ラベルに関してはラベル名をid化した18この数字です。

import tensorflow as tf
import numpy as np

batch_size = 100 # バッチの数
#それぞれのtensorを作成する
x = tf.placeholder(tf.float32, [None,len(Xvec[0])])
W = tf.Variable(tf.zeros([len(Xvec[0]),len(set(label))]))
b = tf.Variable(tf.zeros([len(set(label))]))

#モデルの作成
y = tf.nn.softmax(tf.matmul(x, W) + b)
#正解を入れるための箱を宣言
y_ = tf.placeholder(tf.float32, [None,len(set(Y))])
#学習の方法を交差エントロピーの減少と設定。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#学習方法を勾配降下法と設定
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

#sessionを起動
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

#batchごとに学習開始
for i in range(0, len(Xvec), batch_size):
    x_batch = Xvec[i:i+batch_size]
    y_batch = label[i:i+batch_size]
→    sess.run(train_step, feed_dict={x: x_batch, y_: y_batch})
#ここで下エラーが出る
#ValueError: setting an array element with a sequence.


調べたところnumpyのところでエラーが出てると書いてありました。
データ型がおかしいのかと思い、調べましたがXvecもlabelもどちらもfloat32になっていました。
他に考えられる原因はfeed.dictで与える型がfloat32ではダメなのかと思いました。
また、x_batchの中身が配列になっているのもダメなのではないかと思います。

いろいろ考えたら頭の中がぐちゃぐちゃしてしまいました。解決策がございましたらお願いいたします。

データについて参考となりそうなものを載せておきます。

> Xvec.dtype
dtype('O')
> Xvec[0].dtype
dtype('float32')
>len(Xvec)
16015
>label.dtype
dtype('float32')
>Xvec.shape
(16009,)
>Xvec[0]
array([ -2.01150000e-01,   1.67799994e-01,  -1.45109996e-01,
        -1.99019998e-01,   2.93040007e-01,   2.08790004e-01,
         3.25360000e-01,              ...             -4.27370012e-01, 
           -9.79190022e-02,   2.06489995e-01], dtype=float32)
>label
array([  1.,   9.,   9., ...,  16.,  16.,  16.], dtype=float32)

長くなりましたが、よろしくお願いいたします。
他にも必要なデータがございましたら、いってください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

TensorFlowはほとんど初心者ですが、MNISTチュートリアルを確認したところ
labelshapeが気になります。(1-ホットベクトルになっていない)

つまりlabel

[  1.,   9.,   9., ...,  16.,  16.,  16.]


ではなく、以下のような形になっていないといけないのではないでしょうか?

[[ 1.  0.  0. ...,  0.  0.  0.] # 1番目のみ1
 [ 0.  0.  0. ...,  1.  0.  0.] # 9番目のみ1
 [ 0.  0.  0. ...,  1.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  1.  0.]]

ちなみにMNISTチュートリアルで利用されているデータ内容の確認結果は以下のようになっています。

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 確認表示
print("image:shape=%s)"%(repr(mnist.train.images.shape)))
print(mnist.train.images)
print("label:shape=%s)"%(repr(mnist.train.labels.shape)))
print(mnist.train.labels)

上記の結果

image:shape=(55000, 784))
[[ 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.]
 [ 0.  0.  0. ...,  0.  0.  0.]]
label:shape=(55000, 10))
[[ 0.  0.  0. ...,  1.  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.  1.  0.]]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/29 11:36

    まさにおっしゃる通りでした!
    データのshapeが正しくなかったです。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる