2017-10-22 9 views
1

複数のcsvファイルから入力として13個のフィーチャーを一度に1つずつ取り出し、各繰り返し後に精度を測定するニューラルネットワークを作成しようとしています。ここに私のコードスニペットは、次のとおりです。ロットとラベルは同じサイズでなければなりません

import tensorflow as tf 
import numpy as np 
from tensorflow.contrib.layers import fully_connected 
import os 
import pandas as pd 
n_inputs = 13 
n_hidden1 = 30 
n_hidden2 = 10 
n_outputs = 2 
learning_rate = 0.01 
n_epochs = 40 
batch_size = 1 

patient_id = os.listdir('./subset_numerical') 
output = pd.read_csv('output.csv') 
sepsis_pat = output['output'].tolist() 

X = tf.placeholder(tf.float32, shape=[None, n_inputs], name="X") 
y = tf.placeholder(tf.int64, shape=[None], name="y") 

def data_processor(n): 
    id = pd.read_csv('./subset_numerical/'+patient_id[n]) 
    id_input = np.array([id['VALUE'].tolist()]) 
    for s in sepsis_pat: 
     if str(s) == str(patient_id[n].split('.')[0]): 
      a = 1 
    try: 
     if a == 1: 
      a = 0 
      return [id_input, np.array([1])] 
    except: 
     return [id_input, np.array([0])] 

def test_set(): 
    id_combined = [] 
    out = [] 
    for p in range(300, len(patient_id)): 
     try: 
      id1 = pd.read_csv('./subset_numerical/' + patient_id[p]) 
      id_input1 = np.array(id1['VALUE'].tolist()) 
      id_combined.append(id_input1) 
      for s in sepsis_pat: 
       if str(s) == str(patient_id[p].split('.')[0]): 
        a = 1 
      try: 
       if a == 1: 
        a = 0 
        out.append([1, 0]) 
      except: 
       out.append([0, 1]) 
     except: 
      pass 
    return [np.array(id_combined), np.array(out)] 

# Declaration of hidden layers and calculation of loss goes here 
# Construction phase begins 
with tf.name_scope("dnn"): 
    hidden1 = fully_connected(X, n_hidden1, scope="hidden1") 
    hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2") 
    logits = fully_connected(hidden2, n_outputs, scope="outputs", activation_fn=None) # We will apply softmax here later 

# Calculating loss 
with tf.name_scope("loss"): 
    xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) 
    loss = tf.reduce_mean(xentropy, name="loss") 

# Training with gradient descent optimizer 
with tf.name_scope("train"): 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
    training_op = optimizer.minimize(loss) 
# Measuring accuracy 
with tf.name_scope("eval"): 
    correct = tf.nn.in_top_k(logits, y, 1) 
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 
    accuracy_summary = tf.summary.scalar('accuracy', accuracy) 

# Variable initialization and saving model goes here 
# Construction is finished. Let's get this to work. 
with tf.Session() as sess: 
    init.run() 
    for epoch in range(n_epochs): 
     a = 0 
     for iteration in range(300 // batch_size): 
       X_batch, y_batch = data_processor(iteration) 
       sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) 
       acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch}) 
       X_test, y_test = test_set() 
       acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test}) 
       print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test) 
     save_path = saver.save(sess, "./my_model_final.ckpt") 

しかし、私はこのエラーでこだわっている:

logits and labels must be same size: logits_size=[1,2] labels_size=[1,1] 

エラーは、この行で発生するようです:

correct = tf.nn.in_top_k(logits, y, 1) 

私が間違って何をやっています?

+0

問題を説明する短いサンプルを作成してください。 –

+0

完全なエラーログを投稿できますか?私はあなたのコードのこの行 'xentropy = tf.nn.softmax_cross_entropy_with_logits(labels = y、logits = logits)'でエラーが起こっていると思います。 – user1190882

+0

あなたはここにそれを見つけることができます: https://pastebin.com/yNTqfjnj – tahsin314

答えて

0

提供あなたのエラーログに基づいて、問題はあなたのコード行である:

xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) 

は、それらの両方が同じ形状とdtypeを持っていることを確認してください。 形状は[batch_size, num_classes]dtypeの形式で、float16,float32またはfloat64である必要があります。詳細については、softmax_cross_entropy_with_logitsのドキュメントを参照してください。

0

あなたがn_outputs = 2を定義したのでyの形状がちょうど[?]ありながら、logitsの形状は、(?は、バッチサイズを意味する)[?, 2]です。ソフトマックス損失関数を適用するために、最後のFC層はフラットテンソルを返すべきであり、これはyと比較することができる。

解決策:セットn_outputs = 1

関連する問題