2015-11-24 1 views
2

Итак, у меня есть этот замечательный код, который выходит с точностью до 93% от его прогнозов. Мне интересно, как это сделать сейчас, - это взять подготовленную программу, заставить ее посмотреть фактические данные теста без ответа на нее и занять ее, независимо от точности. Вот код, который у меня есть, который прогнозирует с точностью до 93%.Как использовать TensorFlow для добавления Predicted Value в пустой столбец в CSV-файле?

import tensorflow as tf 
import numpy as np 
from numpy import genfromtxt 
import sklearn 

# Convert to one hot 
def convertOneHot(data): 
    y=np.array([int(i[0]) for i in data]) 
    y_onehot=[0]*len(y) 
    for i,j in enumerate(y): 
     y_onehot[i]=[0]*(y.max() + 1) 
     y_onehot[i][j]=1 
    return (y,y_onehot) 

data = genfromtxt('cs-training.csv',delimiter=',') # Training data 
test_data = genfromtxt('cs-test.csv',delimiter=',') # Test data 

x_train=np.array([ i[1::] for i in data]) 
y_train,y_train_onehot = convertOneHot(data) 

x_test=np.array([ i[1::] for i in test_data]) 
y_test,y_test_onehot = convertOneHot(test_data) 

A=data.shape[1]-1 # Number of features, Note first is y 
B=len(y_train_onehot[0]) 
tf_in = tf.placeholder("float", [None, A]) # Features 
tf_weight = tf.Variable(tf.zeros([A,B])) 
tf_bias = tf.Variable(tf.zeros([B])) 
tf_softmax = tf.nn.softmax(tf.matmul(tf_in,tf_weight) + tf_bias) 

# Training via backpropagation 
tf_softmax_correct = tf.placeholder("float", [None,B]) 
tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax)) 

# Train using tf.train.GradientDescentOptimizer 
tf_train_step = tf.train.GradientDescentOptimizer(0.01).minimize(tf_cross_entropy) 

# Add accuracy checking nodes 
tf_correct_prediction = tf.equal(tf.argmax(tf_softmax,1), tf.argmax(tf_softmax_correct,1)) 
tf_accuracy = tf.reduce_mean(tf.cast(tf_correct_prediction, "float")) 

saver = tf.train.Saver([tf_weight,tf_bias]) 

# Initialize and run 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

print("...") 
# Run the training 
for i in range(100): 
    sess.run(tf_train_step, feed_dict={tf_in: x_train, tf_softmax_correct: y_train_onehot}) 

#Print accuracy 
    result = sess.run(tf_accuracy, feed_dict={tf_in: x_test, tf_softmax_correct: y_test_onehot}) 
print result 

Теперь у меня есть фактическая испытательная установка cs-test-actual.csv где первый столбец полностью пуст, и мне нужно, чтобы заполнить его с предсказанным 1 или 0. Как я могу идти о том, что делать?

ответ

3

Программа, как представляется, не сохраняет подготовленную сессию. Я думаю, вы хотите сделать это в два этапа.

  1. Поезд и сохранить сессию
  2. Восстановление сохранить сеанс и запустить тестовые данные через него.

Шаг 1:

#!/usr/bin/env python 

import tensorflow as tf 
import numpy as np 
from numpy import genfromtxt 
import sklearn 

# Convert to one hot 
def convertOneHot(data): 
    y=np.array([int(i[0]) for i in data]) 
    y_onehot=[0]*len(y) 
    for i,j in enumerate(y): 
     y_onehot[i]=[0]*(y.max() + 1) 
     y_onehot[i][j]=1 
    return (y,y_onehot) 

# Build Example Data is CSV format, but use Iris data 
from sklearn import datasets 
from sklearn.model_selection import train_test_split 
def buildDataFromIris(): 
    iris = datasets.load_iris() 
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.33, random_state=42) 
    f=open('cs-training.csv','w') 
    for i,j in enumerate(X_train): 
     k=np.append(np.array(y_train[i]),j ) 
     f.write(",".join([str(s) for s in k]) + '\n') 
    f.close() 
    f=open('cs-test.csv','w') 
    for i,j in enumerate(X_test): 
     k=np.append(np.array(y_test[i]),j ) 
     f.write(",".join([str(s) for s in k]) + '\n') 
    f.close() 

# Recreate logging and save dir 
# Seems the tensorflow won't always overwrite 
import shutil, os, sys 
TMPDir='./tensorTMP' 
try: 
    shutil.rmtree(TMPDir) 
except: 
    print "Tmp Dir did not exist...that's okay" 
os.mkdir(TMPDir, 0755) 



# Populate the data 
buildDataFromIris() 

data = genfromtxt('cs-training.csv',delimiter=',') # Training data 
test_data = genfromtxt('cs-test.csv',delimiter=',') # Test data 

x_train=np.array([ i[1::] for i in data]) 
y_train,y_train_onehot = convertOneHot(data) 

x_test=np.array([ i[1::] for i in test_data]) 
y_test,y_test_onehot = convertOneHot(test_data) 

A=data.shape[1]-1 # Number of features, Note first is y 
B=len(y_train_onehot[0]) 
tf_in = tf.placeholder("float", [None, A]) # Features 
tf_weight = tf.Variable(tf.zeros([A,B])) 
tf_bias = tf.Variable(tf.zeros([B])) 
tf_softmax = tf.nn.softmax(tf.matmul(tf_in,tf_weight) + tf_bias) 

# Training via backpropagation 
tf_softmax_correct = tf.placeholder("float", [None,B]) 
tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax)) 

# Train using tf.train.GradientDescentOptimizer 
tf_train_step = tf.train.GradientDescentOptimizer(0.01).minimize(tf_cross_entropy) 

# Add accuracy checking nodes 
tf_correct_prediction = tf.equal(tf.argmax(tf_softmax,1), tf.argmax(tf_softmax_correct,1)) 
tf_accuracy = tf.reduce_mean(tf.cast(tf_correct_prediction, "float")) 

saver = tf.train.Saver([tf_weight,tf_bias]) 

# Initialize and run 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

THRESHOLD = 0.98 
saved = False 
print("...") 
# Run the training 
for i in range(100): 
    sess.run(tf_train_step, feed_dict={tf_in: x_train, tf_softmax_correct: y_train_onehot}) 
    result = sess.run(tf_accuracy, feed_dict={tf_in: x_test, tf_softmax_correct: y_test_onehot}) 
    # If it's well trained on this iteration, save it. We just need one save. 
    if result > THRESHOLD and saved == False: 
     saved = True 
     print "saving result {}".format(result) 
     saver.save(sess,TMPDir +"/savedSess") 

Только изменения, внесенные генерировали с использованием выборочных данных Iris, устанавливая пороговое значение или доверительный интервал для сеанса. Если закончится это ПОРОГ, сохраните сеанс. После первого шага модель должна быть обучена и сохранена.

Шаг 2:

Восстановление сохраненной сессии, и запустить обучающие данные через него.

#!/usr/bin/env python 

import tensorflow as tf 
import numpy as np 
from numpy import genfromtxt 
import sklearn 

# Convert to one hot 
def convertOneHot(data): 
    y=np.array([int(i[0]) for i in data]) 
    y_onehot=[0]*len(y) 
    for i,j in enumerate(y): 
     y_onehot[i]=[0]*(y.max() + 1) 
     y_onehot[i][j]=1 
    return (y,y_onehot) 


data = genfromtxt('cs-training.csv',delimiter=',') # Training data 
test_data = genfromtxt('cs-test.csv',delimiter=',') # Test data 

x_train=np.array([ i[1::] for i in data]) 
y_train,y_train_onehot = convertOneHot(data) 

x_test=np.array([ i[1::] for i in test_data]) 
y_test,y_test_onehot = convertOneHot(test_data) 

A=data.shape[1]-1 # Number of features, Note first is y 
B=len(y_train_onehot[0]) 
tf_in = tf.placeholder("float", [None, A]) # Features 
tf_weight = tf.Variable(tf.zeros([A,B])) 
tf_bias = tf.Variable(tf.zeros([B])) 
tf_softmax = tf.nn.softmax(tf.matmul(tf_in,tf_weight) + tf_bias) 

# Training via backpropagation 
tf_softmax_correct = tf.placeholder("float", [None,B]) 
tf_cross_entropy = -tf.reduce_sum(tf_softmax_correct*tf.log(tf_softmax)) 

# Train using tf.train.GradientDescentOptimizer 
tf_train_step = tf.train.GradientDescentOptimizer(0.01).minimize(tf_cross_entropy) 

# Add accuracy checking nodes 
tf_correct_prediction = tf.equal(tf.argmax(tf_softmax,1), tf.argmax(tf_softmax_correct,1)) 
tf_accuracy = tf.reduce_mean(tf.cast(tf_correct_prediction, "float")) 

saver = tf.train.Saver([tf_weight,tf_bias]) 

# Initialize and run 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

TMPDir='./tensorTMP' 
saver.restore(sess, TMPDir + '/savedSess') 
ans = sess.run(tf_softmax, feed_dict={tf_in: x_test, tf_softmax_correct: y_test_onehot}) 

print ans 

Обратите внимание, ваш выход будет выглядеть следующим образом ...

[[ 6.17585704e-02 8.63590300e-01 7.46511072e-02] 
[ 9.98804331e-01 1.19561062e-03 3.8e-13] 
[ 1.52018686e-07 4.49650863e-04 9.99550164e-01] 
+0

Это работает на данных, предоставленных Iris sklearn, но он не работает для моего проекта. Он не возвращает ничего, кроме 'nan' для каждого места, где должна быть 1, 0 или даже вероятность (на что я надеюсь, что она вернется больше всего). – NickTheInventor

 Смежные вопросы

  • Нет связанных вопросов^_^