2017-08-11 37 views
0

我已經在自定義圖像數據上實現了autoencoder以進行手語識別。現在我想將輸出圖層的張量對象保存爲一個numpy數組。我嘗試了Session.run(張量)和tensor.eval()。這是我的代碼。如何將張量對象保存到一個numpy數組?

#define model 
x= tf.placeholder(tf.float32,[None,784]) 
y_=tf.placeholder(tf.float32,[None,6]) 
k=190 
l=180 
m=150 
n=130 
o=100 
num_of_epoch=10 
w1=tf.Variable(tf.truncated_normal([784,k],stddev=0.1)) 
b1=tf.Variable(tf.zeros([k])) 
w2=tf.Variable(tf.truncated_normal([k,l],stddev=0.1)) 
b2=tf.Variable(tf.zeros([l])) 
w3=tf.Variable(tf.truncated_normal([l,m],stddev=0.1)) 
b3=tf.Variable(tf.zeros([m])) 
w4=tf.Variable(tf.truncated_normal([m,n],stddev=0.1)) 
b4=tf.Variable(tf.zeros([n])) 
w5=tf.Variable(tf.truncated_normal([n,o],stddev=0.1)) 
b5=tf.Variable(tf.zeros([o])) 
w6=tf.Variable(tf.truncated_normal([o,6],stddev=0.1)) 
b6=tf.Variable(tf.zeros([6])) 
y1=tf.nn.relu(tf.matmul(x,w1)+b1) 
y2=tf.nn.relu(tf.matmul(y1,w2)+b2) 
y3=tf.nn.relu(tf.matmul(y2,w3)+b3) 
y4=tf.nn.relu(tf.matmul(y3,w4)+b4) 
y5=tf.nn.relu(tf.matmul(y4,w5)+b5) 
y=tf.nn.softmax(tf.matmul(y5,w6)+b6) 
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y), 
reduction_indices=[1])) 
train_step=tf.train.GradientDescentOptimizer(0.03).minimize(cross_entropy) 
init=tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init) 
    for i in range(num_of_epoch):  
     train_data = {x:x_train,y_:y_train} 
     sess.run(train_step,feed_dict=train_data) 
    currect_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) 
    accuracy=tf.reduce_mean(tf.cast(currect_prediction,tf.float32)) 
    sess.run(accuracy,feed_dict={x:x_train,y_:y_train}) 
    currect_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) 
    accuracy=tf.reduce_mean(tf.cast(currect_prediction,tf.float32)) 
    sess.run(accuracy,feed_dict= {x:x_test,y_:y_test}) 
    y_p = tf.argmax(y, 1).eval() #this line shows me the error 
    print(y_p) 

我得到下面的錯誤。我該如何解決這個錯誤並將張量數據保存到numpy數組中?

Traceback (most recent call last): 
File "<ipython-input-45-5e38490a3e8e>", line 1, in <module> 
runfile('C:/Users/RIFAT/PycharmProjects/tensorflow_autoencoder 
/autoencoderreconstruction.py', 
wdir='C:/Users/RIFAT/PycharmProjects/tensorflow_autoencoder') 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils 
\site\sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils 
\site\sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "C:/Users/RIFAT/PycharmProjects/tensorflow_autoencoder 
/autoencoderreconstruction.py", line 112, in <module> 
y_p = tf.argmax(y, 1).eval() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\framework\ops.py", line 606, in eval 
return _eval_using_default_session(self, feed_dict, self.graph, session) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\framework\ops.py", line 3928, in _eval_using_default_session 
return session.run(tensors, feed_dict) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python\client 
\session.py", line 789, in run 
run_metadata_ptr) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python\client 
\session.py", line 997, in _run 
feed_dict_string, options, run_metadata) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python\client 
\session.py", line 1132, in _do_run 
target_list, options, run_metadata) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python\client 
\session.py", line 1152, in _do_call 
raise type(e)(node_def, op, message) 
InvalidArgumentError: Shape [-1,784] has negative dimensions 
[[Node: Placeholder_62 = Placeholder[dtype=DT_FLOAT, shape=[?,784], 
_device="/job:localhost/replica:0/task:0/cpu:0"]()]] 
Caused by op 'Placeholder_62', defined at: 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils\ipython 
\start_kernel.py", line 231, in <module> 
main() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils\ipython 
\start_kernel.py", line 227, in main 
kernel.start() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel\kernelapp.py", 
line 477, in start 
ioloop.IOLoop.instance().start() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\zmq\eventloop 
\ioloop.py", line 177, in start 
super(ZMQIOLoop, self).start() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tornado\ioloop.py", line 
888, in start 
handler_func(fd_obj, events) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tornad 
\stack_context.py", line 277, in null_wrapper 
return fn(*args, **kwargs) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\zmq\eventloop 
\zmqstream.py", line 440, in _handle_events 
self._handle_recv() 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\zmq\eventloop 
\zmqstream.py", line 472, in _handle_recv 
self._run_callback(callback, msg) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\zmq\eventloop 
\zmqstream.py", line 414, in _run_callback 
callback(*args, **kwargs) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tornado 
\stack_context.py", line 277, in null_wrapper 
return fn(*args, **kwargs) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel 
\kernelbase.py", line 283, in dispatcher 
return self.dispatch_shell(stream, msg) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel 
\kernelbase.py", line 235, in dispatch_shell 
handler(stream, idents, msg) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel 
\kernelbase.py", line 399, in execute_request 
user_expressions, allow_stdin) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel\ipkernel.py", 
line 196, in do_execute 
res = shell.run_cell(code, store_history=store_history, silent=silent) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\ipykernel\zmqshell.py", 
line 533, in run_cell 
return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\IPython 
\core\interactiveshell.py", line 2717, in run_cell 
interactivity=interactivity, compiler=compiler, result=result) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\IPython 
\core\interactiveshell.py", line 2827, in run_ast_nodes 
if self.run_code(code, result): 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\IPython 
\core\interactiveshell.py", line 2881, in run_code 
exec(code_obj, self.user_global_ns, self.user_ns) 
File "<ipython-input-45-5e38490a3e8e>", line 1, in <module> 
runfile('C:/Users/RIFAT/PycharmProjects/tensorflow_autoencoder 
/autoencoderreconstruction.py', wdir='C:/Users/RIFAT/PycharmProjects 
/tensorflow_autoencoder') 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils 
\site\sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\spyder\utils 
\site\sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "C:/Users/RIFAT/PycharmProjects/tensorflow_autoencoder 
/autoencoderreconstruction.py", line 62, in <module> 
x= tf.placeholder(tf.float32,[None,784]) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\ops\array_ops.py", line 1530, in placeholder 
return gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\ops\gen_array_ops.py", line 1954, in _placeholder 
name=name) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\framework\op_def_library.py", line 767, in apply_op 
op_def=op_def) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\framework\ops.py", line 2506, in create_op 
original_op=self._default_original_op, op_def=op_def) 
File "C:\Users\RIFAT\Anaconda3\lib\site-packages\tensorflow\python 
\framework\ops.py", line 1269, in __init__ 
self._traceback = _extract_stack() 
InvalidArgumentError (see above for traceback): Shape [-1,784] has 
negative dimensions 
[[Node: Placeholder_62 = Placeholder[dtype=DT_FLOAT, shape=[?,784], 
_device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

回答

0

您的問題不是100%清楚。但是,您看到的錯誤是由於您嘗試運行圖表時未使用Feed代碼而導致的。要查看預測的輸出(即與argmax(Y,1)存在)你只需運行:

y_p = sess.run(tf.argmax(y, 1), feed_dict=train_data) 
print(y_p) 

但是,這將使你的實際預測值(在火車上的數據,因爲這是爲了獲得測試數據,只需在test_data中輸入)。要獲得概率你會拉Ÿ沒有argmax:

y_p = sess.run(y, feed_dict=train_data) 
print(y_p) 
+0

非常感謝。這解決了我的問題。 – Rifat

2

這是因爲y是圖中的張量,而不是一個變量。當你在一個變量上運行.eval()時,它給出了該變量在該會話中保留的當前值,但是如果在張量上運行.eval()而不是tf.argmax(y, 1).eval(),那麼張量流將圖運行到該節點以獲取該值的值節點。因爲在你的情況下,它運行圖時沒有得到佔位符xy_的值,它會給出錯誤。解決此錯誤的一種方法是通過將佔位符的值在eval電話這樣的:

tf.argmax(y, 1).eval(feed_dict= {x:x_test,y_:y_test})

但是,更優選的方式是給你的會話的上下文的eval呼叫在這種情況下,它會返回張量的值。例如:

tf.argmax(y, 1).eval(session = sess)

相關問題