以下のような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 = 10 # 学習ステップ数 LEN_SEQ = 99 # 系列長 N_NODES = 64 # ノード数 N_DATA = 10 # 各クラスの学習用データ数 N_TEST = 10 # テスト用データ数 BATCH_SIZE = 2 # バッチサイズ #データの準備 def get_mist1_data(): with open("ファイル名") as fp: reader1 = csv.reader(fp) data1 = [ e for e in reader1 ] data1 = np.array(data1).reshape(-1) data1 = data1.reshape(-1,100) x1 = data1[:,:99] t1 = data1[:,99].reshape(-1) return x1 , t1 def get_mist2_data(): with open("ファイル名") as fp: reader2 = csv.reader(fp) data2 = [ e for e in reader2 ] data2 = np.array(data2).reshape(-1) data2 = data2.reshape(-1,100) x2 = data2[:,:99] t2 = data2[:,99].reshape(-1) return x2 , t2 x_train, t_train = get_mist1_data() #学習用データセット x_test, t_test = get_mist2_data() #テスト用データセット # モデルの構築 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()
発生したエラー
以下のようなエラーが発生して困っています。
次元数が合っていないということだと思いますが、解決法がわからないので教えていただけますでしょうか。
cannot feed value of shape (2,99) for tensor 'placeholder:0', which has shape '(?, 99, 1)'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。