2015-11-11 17 views

Trả lời

5

Hãy xem shapes-and-shaping từ tài liệu TensorFlow. Nó mô tả các biến đổi hình dạng khác nhau có sẵn.

Chức năng phổ biến nhất có lẽ là tf.reshape, tương tự với số lượng tương đương. Nó cho phép bạn chỉ định bất kỳ hình dạng nào bạn muốn miễn là số phần tử vẫn giữ nguyên. Có một số ví dụ có sẵn trong tài liệu.

4

Documentation shows phương pháp định hình lại. Đó là:

  • reshape
  • bóp (loại bỏ kích thước của kích thước 1 từ hình dạng của một tensor)
  • expand_dims (thêm kích thước của kích thước 1)

cũng như loạt các phương pháp để có được shape, size, rank trong số tensor của bạn. Có lẽ là sử dụng nhiều nhất là reshape và đây là một ví dụ mã với một vài trường hợp cạnh (-1):

import tensorflow as tf 

v1 = tf.Variable([ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12] 
]) 
v2 = tf.reshape(v1, [2, 6]) 
v3 = tf.reshape(v1, [2, 2, -1]) 
v4 = tf.reshape(v1, [-1]) 
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1 
v6 = tf.reshape(v1, [1, 4, 1, 3, 1]) 
v6_shape = tf.shape(v6) 
v6_squeezed = tf.squeeze(v6) 
v6_squeezed_shape = tf.shape(v6_squeezed) 

init = tf.initialize_all_variables() 

sess = tf.Session() 
sess.run(init) 
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape]) 
# print all variables to see what is there 
print e # shape of v6 
print g # shape of v6_squeezed 
13

Lớp tf.Variable là cách khuyến khích để tạo ra các biến, nhưng nó hạn chế khả năng của bạn để thay đổi hình dạng của biến khi nó đã được tạo.

Nếu bạn cần thay đổi hình dạng của một biến, bạn có thể làm như sau (ví dụ cho một 32-bit floating point tensor):

var = tf.Variable(tf.placeholder(tf.float32)) 
# ... 
new_value = ... # Tensor or numpy array. 
change_shape_op = tf.assign(var, new_value, validate_shape=False) 
# ... 
sess.run(change_shape_op) # Changes the shape of `var` to new_value's shape. 

Lưu ý rằng tính năng này không có trong các API công cộng tài liệu , do đó, nó có thể thay đổi. Nếu bạn thấy mình cần sử dụng tính năng này, hãy cho chúng tôi biết và chúng tôi có thể điều tra một cách để hỗ trợ tính năng này trong tương lai.

+0

Vấn đề với cách tiếp cận này là 'var.shape' không được cập nhật cho phù hợp. Điều này vẫn tồn tại khi lưu trữ một trạm kiểm soát và do đó ngăn cản việc nạp điểm kiểm tra một lần nữa, vì hình dạng biến không phù hợp với hình dạng trọng lượng. Có cách nào để buộc 'var.shape' cập nhật không? Tôi có nên tạo một vấn đề GitHub không? –

+0

Tôi đã tìm thấy chuỗi này, thảo luận vấn đề: https://github.com/tensorflow/tensorflow/issues/10091#issuecomment-304301817 Tôi tự hỏi, nếu có cách để mở rộng trọng số của các mạng hiện có –

1
tf.Variable(tf.placeholder(tf.float32)) 

không hợp lệ tại tensorflow 1.2.1

trong vỏ python:

import tensorflow as tf 
tf.Variable(tf.placeholder(tf.float32)) 

Bạn sẽ nhận được:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32) 

Cập nhật: nếu bạn thêm validate_shape=False, có sẽ không có lỗi.

tf.Variable(tf.placeholder(tf.float32), validate_shape=False) 

nếu tf.py_func phù hợp với yêu cầu của bạn:

def init(): 
    return numpy.random.rand(2,3) 
a = tf.pyfun(init, [], tf.float32) 

Bạn có thể tạo biến mà có hình dạng bất kỳ bằng cách thông qua hàm init của riêng bạn.

Một cách khác:

var = tf.get_varible('my-name', initializer=init, shape=(1,1)) 

Bạn có thể vượt qua tf.constant hay bất kỳ chức năng init trả về mảng NumPy. Hình dạng được cung cấp sẽ không được xác thực. Hình dạng đầu ra là hình dạng dữ liệu thực của bạn.

Các vấn đề liên quan