Cách drop 1 chiều của tensor trong tensorflow ?

tensorflow

#1

Xin chào mọi người, em đang có một tensor với shape (50, 100, 1, 512) em muốn drop chiều thứ 3 ra khỏi tensor để tensor mới của em có shape (50, 100, 512) và tất cả các axis khác đều không bị thay đổi gì.

Em đã thử dùng tf.slice kết hợp với tf.squeeze:

a = tf.slice(a, [50, 100, 1, 512], [50, 100, 1, 512])
b = tf.squeeze(a)

Cách trên có vẻ đúng khi em print ra shape của ab nhưng khi em thử eval thì luôn gặp lỗi này

tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected size[0] in [0, 0], but got 50
	 [[Node: Slice = Slice[Index=DT_INT32, T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](MaxPool_2, Slice/begin, Slice/size)]]

Em rất mong được mọi người giúp đỡ để có thể xử lý trường hợp này ạ. Em xin cám ơn


[09/22/2018 11:47] Hi mọi người, em đang gặp một chút vấn đề . . .
#2

Có nhiều cách để drop dim trong tensorflow. Ví dụ như:

a = a[:,:,0,:]

HOẶC

a = a[:,:,-1,:]

HOẶC

a = tf.reshape(a,[50,100,512])

Với cách của mình trong câu hỏi, mình đã sử dụng hàm tf.slice sai cách, sau đây là cách đúng:

a = tf.slice(a, [0, 0, 0, 0], [50, 100, 1, 512])
b = tf.squeeze(a)

#3

Nếu bạn dùng tf.squeeze(), có một tùy chọn là ‘axis’ giúp bạn lựa chọn được chiều mà muốn drop

tf.squeeze(    input,    axis=None,    name=None,    squeeze_dims=None)
  • axis : An optional list of ints . Defaults to [] . If specified, only squeezes the dimensions listed. The dimension index starts at 0. It is an error to squeeze a dimension that is not 1. Must be in the range [-rank(input), rank(input)) .

Trong trường hợp này, bạn sử dụng

b = tf.squeeze(a, axis=2) #b.shape => [50,100,512]

Bạn lưu ý khi sử dụng các hàm reshape vì nếu ko cẩn thận rất dễ gây sai lệch giá trị.