以下のようなcsvファイルをもちいてRNNの作成を行っています。データは1セットあたり99の時系列データと1つのラベルのセットで10セットあります。(学習用データとテスト用データで10個ずつ計20個)
実現したいこと
99の時系列データの答えを1つのラベルとしてone-hot型で推定したいです。
実行したコード
# coding: utf-8 from __future__ import absolute_import from __future__ import division from __future__ import print_function import random import numpy as np import tensorflow as tf import csv from tensorflow.contrib import rnn # パラメーター N_CLASSES = 500 # クラス数 N_INPUTS = 1 # 1ステップに入力されるデータ数 N_STEPS = 20 # 学習ステップ数 LEN_SEQ = 99 # 系列長 N_NODES = 64 # ノード数 N_DATA = 10 # 各クラスの学習用データ数 N_TEST = 10 # テスト用データ数 BATCH_SIZE = 2 # バッチサイズ #データの準備 def get_data1(): with open("ファイル名") as fp: reader1 = csv.reader(fp) data1 = [ e for e in reader1 ] return data1 def get_data2(): with open("ファイル名") as fp: reader2 = csv.reader(fp) data2 = [ e for e in reader2 ] return data2 ・・・・・ def get__data20(): with open("ファイル名") as fp: reader20 = csv.reader(fp) data20 = [ e for e in reader20 ] return data20 def get_dataset1(): class_data1 = [get_data1(), get_data2()] ・・・・ class_data5 = [get_data9(), get_data10()] dataset1 = np.r_[class_data1, class_data2, class_data3, class_data4, class_data5] x1 = dataset1[:,:99] t1 = dataset1[:,99].reshape(-1) return x1, t1 def mist2_dataset(): class_data6 = [get_data11(), get_data12()] ・・・・ class_data10 = [get_data19(), get_data20()] dataset2 = np.r_[class_data6, class_data7, class_data8, class_data9, class_data10] x2 = dataset2[:,:99] t2 = dataset2[:,99].reshape(-1) return x2, t2 x_train, t_train = mist1_dataset() #学習用データセット x_test, t_test = mist2_dataset() #テスト用データセット # モデルの構築 x = tf.placeholder(tf.float32, [None, LEN_SEQ, N_INPUTS]) # 入力データ t = tf.placeholder(tf.int32, [None]) # 教師データ t_on_hot = tf.one_hot(t, depth=N_CLASSES, dtype=tf.float32) # 1-of-Kベクトル cell = rnn.BasicRNNCell(num_units=N_NODES, activation=tf.nn.tanh) # 中間層のセル # RNNに入力およびセル設定する outputs, states = tf.nn.dynamic_rnn(cell=cell, inputs=x, dtype=tf.float32, time_major=False) # [ミニバッチサイズ,系列長,出力数]→[系列長,ミニバッチサイズ,出力数] outputs = tf.transpose(outputs, perm=[1, 0, 2]) w = tf.Variable(tf.random_normal([N_NODES, N_CLASSES], stddev=0.01)) b = tf.Variable(tf.zeros([N_CLASSES])) logits = tf.matmul(outputs[-1], w) + b # 出力層 pred = tf.nn.softmax(logits) # ソフトマックス cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=t_on_hot, logits=logits) loss = tf.reduce_mean(cross_entropy) # 誤差関数 train_step = tf.train.AdamOptimizer().minimize(loss) # 学習アルゴリズム correct_prediction = tf.equal(tf.argmax(pred,1), tf.argmax(t_on_hot,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 精度 # 学習の実行 sess = tf.Session() sess.run(tf.global_variables_initializer()) i = 0 for _ in range(N_STEPS): cycle = int(N_DATA / BATCH_SIZE) begin = int(BATCH_SIZE * (i % cycle)) end = begin + BATCH_SIZE x_batch, t_batch = x_train[begin:end], t_train[begin:end] sess.run(train_step, feed_dict={x:x_batch, t:t_batch}) i += 1 if i % 2 == 0: loss_, acc_ = sess.run([loss, accuracy], feed_dict={x:x_batch,t:t_batch}) loss_test_, acc_test_ = sess.run([loss, accuracy], feed_dict={x:x_test,t:t_test}) print("[TRAIN] loss : %f, accuracy : %f" %(loss_, acc_)) print("[TEST loss : %f, accuracy : %f" %(loss_test_, acc_test_)) sess.close()
発生した問題
実行するとこのようになってしまいました。
[TRAIN] loss : 6.121445, accuracy : 0.000000 [TEST loss : 6.222018, accuracy : 0.000000 [TRAIN] loss : 6.161310, accuracy : 0.000000 [TEST loss : 6.225129, accuracy : 0.000000 [TRAIN] loss : 5.667954, accuracy : 0.500000 [TEST loss : 6.228346, accuracy : 0.000000 [TRAIN] loss : 5.720864, accuracy : 0.000000 [TEST loss : 6.232099, accuracy : 0.000000 [TRAIN] loss : 2.858102, accuracy : 0.000000 [TEST loss : 6.236712, accuracy : 0.000000 [TRAIN] loss : 5.295630, accuracy : 0.000000 [TEST loss : 6.242729, accuracy : 0.000000 [TRAIN] loss : 5.307451, accuracy : 0.000000 [TEST loss : 6.250314, accuracy : 0.000000 [TRAIN] loss : 4.823091, accuracy : 1.000000 [TEST loss : 6.259723, accuracy : 0.000000 [TRAIN] loss : 4.844704, accuracy : 0.000000 [TEST loss : 6.271129, accuracy : 0.000000 [TRAIN] loss : 2.439413, accuracy : 0.000000 [TEST loss : 6.284640, accuracy : 0.000000
おそらくone-hot型のところがうまくいっていないのかと思うのですが別で分類したい値を指定する必要がありますか?
回答2件
あなたの回答
tips
プレビュー