2016-01-31 24 views
8

Tôi đang cố gắng tìm hiểu cách làm việc với các nhà văn tóm tắt lưu lượng bằng cách thực hiện theo hướng dẫn của mọt sách HowTo. Hướng dẫn đó thêm một bản tóm tắt vô hướng cho hàm mất. Tôi đã viết một chức năng mất mát trong một không bình thường bằng việc xây dựng một thuật ngữ quy tắc, và tôi nhận được ngoại lệ này:Tóm tắt các thẻ tóm tắt vô hướng lưu lượng truy cập tên ngoại lệ

W tensorflow/core/common_runtime/executor.cc:1027] 0x1e9ab70 Compute status: Invalid argument: tags and values not the same shape: [] != [1] 
    [[Node: ScalarSummary = ScalarSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](ScalarSummary/tags, loss)]] 

Chức năng mất mát và bổ sung thêm các bản tóm tắt giống như

loss = tf.add(modelError, regularizationTerm, name='loss') 
tf.scalar_summary(loss.op.name, loss) 

và nếu tôi xây dựng regularizationTerm như thế này

regularizationTerm = tf.Variable(tf.zeros([1], dtype=np.float32), name='regterm') 
regularizationTerm += tf.mul(2.0, regA) 
regularizationTerm += tf.mul(3.0, regB) 

là Rega và regB là tf.Variables xác định trước đó, tôi nhận được ngoại lệ, trong khi đó là tôi xây dựng nó lên như

regularizationTerm = tf.add(tf.mul(2.0, regA), tf.mul(3.0, regB), name='regterm') 

thì nó hoạt động. Vì vậy, tôi đoán tôi không đặt tên chính xác, khi tôi làm + = tôi tạo ra một tensor mới mà không được đặt tên? Nhưng tại sao tôi không thể thêm nó vào sự mất mát, và sau đó đặt tên cho sự mất mát? Đó là điều duy nhất tôi đang cố gắng tóm tắt?

Có điều gì đó như + = nơi tôi có thể đặt tên cho đầu ra hoặc giữ tên của tensor mà tôi đang sửa đổi không?

Trong trường hợp vấn đề có liên quan đến cái gì khác, đây là ví dụ đơn giản của tôi, nơi tôi đã xác định vấn đề:

import numpy as np 
import tensorflow as tf 

def main(): 
    x_input = tf.placeholder(tf.float32, shape=(None, 1)) 
    y_output = tf.placeholder(tf.float32, shape=(None, 1)) 

    hidden_weights = tf.Variable(tf.truncated_normal([1,10], stddev=0.1), name='weights') 
    output_weights = tf.Variable(tf.truncated_normal([10,1], stddev=0.1), name='output') 
    inference = tf.matmul(tf.matmul(x_input, hidden_weights), output_weights) 
    regA = tf.reduce_sum(tf.pow(hidden_weights, 2)) 
    regB = tf.reduce_sum(tf.pow(output_weights, 2)) 
    modelError = tf.reduce_mean(tf.pow(tf.sub(inference,y_output),2), name='model-error') 

    fail = True 
    if fail: 
     regularizationTerm = tf.Variable(tf.zeros([1], dtype=np.float32), name='regterm') 
     regularizationTerm += tf.mul(2.0, regA) 
     regularizationTerm += tf.mul(3.0, regB) 
    else: 
     regularizationTerm = tf.add(tf.mul(2.0, regA), tf.mul(3.0, regB), name='regterm') 

    loss = tf.add(modelError, regularizationTerm, name='loss') 
    tf.scalar_summary(loss.op.name, loss) 
    optimizer = tf.train.GradientDescentOptimizer(0.05) 
    global_step = tf.Variable(0, name='global_step', trainable=False) 
    train_op = optimizer.minimize(loss, global_step=global_step) 

    summary_op = tf.merge_all_summaries() 

    saver = tf.train.Saver() 

    sess = tf.Session() 
    init = tf.initialize_all_variables() 
    sess.run(init) 

    summary_writer = tf.train.SummaryWriter('train_dir', 
              graph_def=sess.graph_def) 

    feed_dict = {x_input:np.ones((30,1), dtype=np.float32), 
       y_output:np.ones((30,1), dtype=np.float32)} 

    for step in xrange(1000): 
     _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict) 
     if step % 100 == 0: 
      print("step=%d loss=%.2f" % (step, loss_value)) 
      summary_str = sess.run(summary_op, feed_dict=feed_dict) 
      summary_writer.add_summary(summary_str, step) 

if __name__ == '__main__': 
    main() 

Trả lời

20

TL; DR: Vấn đề là hình dạng của các lập luận để tf.scalar_summary(), không tên.

Tôi nghĩ vấn đề là một vấn đề liên quan đến hình dạng, bắt nguồn từ dòng này:

regularizationTerm = tf.Variable(tf.zeros([1], dtype=np.float32), name='regterm') 

này định nghĩa một biến có hình dạng là một vector có độ dài 1. tiếp theo += nhà khai thác (trong đó có cú pháp đường cho tf.add()) và tf.add() để tính loss sẽ tạo ra kết quả có dạng vectơ, bởi vì tf.add()broadcasts đối số vô hướng trở thành vectơ. Cuối cùng, tf.scalar_summary() hy vọng hai đối số của nó có cùng hình dạng — không giống như việc phát sóng add, tf.scalar_summary() không được cho phép về hình dạng của các yếu tố đầu vào. Đầu vào tags là một chuỗi vô hướng (tên của số loss op) trong khi đầu vào values là một vectơ có độ dài một (giá trị của loss tensor). Do đó bạn nhận được lỗi mà bạn đã báo cáo.

May mắn thay, giải pháp rất đơn giản! Hoặc xác định biến regularizationTerm như một vô hướng, như vậy:

# Note that `[]` is the scalar shape. 
regularizationTerm = tf.Variable(tf.zeros([], dtype=np.float32), name='regterm') 

... hoặc vượt qua một vector (có độ dài 1) của chuỗi để tf.scalar_summary():

# Wrap `loss.op.name` in a list to make it a vector. 
tf.scalar_summary([loss.op.name], loss) 
+0

Những cả làm việc! Tôi đã không nhận ra mối quan hệ hình dạng giữa các đối số scalar_summary, hoặc cú pháp để xác định một vô hướng, cảm ơn! – MrCartoonology

+0

Cảm ơn! Không nhận ra rằng '[]' và '[1]' khác nhau. Tôi tự hỏi tại sao nó làm hỏng tf ... – Pinocchio

0

Do đây là một vấn đề liên quan đến hình dạng của một tensor với kích thước của kích thước 1, bạn có thể thử sử dụng tf.squeeze mà cụ thể loại bỏ kích thước của kích thước 1 từ hình dạng của một tensor.

Trong trường hợp của bạn, bạn có thể thay thế

tf.scalar_summary(loss.op.name, loss)

với

tf.scalar_summary(loss.op.name, tf.squeeze(loss))