我们可以使用tf.shape()获取某张量的形状张量。
1
2
3
4
5
6
|
import tensorflow as tf
x = tf.reshape(tf. range ( 1000 ), [ 10 , 10 , 10 ])
sess = tf.Session()
sess.run(tf.shape(x))
Out[ 1 ]: array([ 10 , 10 , 10 ])
|
我们可以使用tf.shape()在计算图中确定改变张量的形状。
1
2
3
4
5
6
|
high = tf.shape(x)[ 0 ] / / 2
width = tf.shape(x)[ 1 ] * 2
x_reshape = tf.reshape(x, [high, width, - 1 ])
sess.run(tf.shape(x_reshape))
Out: array([ 5 , 20 , 10 ])
|
我们可以使用tf.shape_n()在计算图中得到若干个张量的形状。
1
2
3
4
|
y = tf.reshape(tf. range ( 504 ), [ 7 , 8 , 9 ])
sess.run(tf.shape_n([x, y]))
Out: [array([ 10 , 10 , 10 ]), array([ 7 , 8 , 9 ])]
|
我们可以使用tf.size()获取张量的元素个数。
sess.run([tf.size(x), tf.size(y)])
Out: [1000, 504]
tensor.get_shape()或者tensor.shape是无法在计算图中用于确定张量的形状。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
In [ 20 ]: x.get_shape()
Out[ 20 ]: TensorShape([Dimension( 10 ), Dimension( 10 ), Dimension( 10 )])
In [ 21 ]: x.get_shape()[ 0 ]
Out[ 21 ]: Dimension( 10 )
In [ 22 ]: type (x.get_shape()[ 0 ])
Out[ 22 ]: tensorflow.python.framework.tensor_shape.Dimension
In [ 23 ]: x.get_shape()
Out[ 23 ]: TensorShape([Dimension( 10 ), Dimension( 10 ), Dimension( 10 )])
In [ 24 ]: sess.run(x.get_shape())
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeError Traceback (most recent call last)
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in __init__( self , fetches, contraction_fn)
299 self ._unique_fetches.append(ops.get_default_graph().as_graph_element(
- - > 300 fetch, allow_tensor = True , allow_operation = True ))
301 except TypeError as e:
~\Anaconda3\lib\site - packages\tensorflow\python\framework\ops.py in as_graph_element( self , obj, allow_tensor, allow_operation)
3477 with self ._lock:
- > 3478 return self ._as_graph_element_locked(obj, allow_tensor, allow_operation)
3479
~\Anaconda3\lib\site - packages\tensorflow\python\framework\ops.py in _as_graph_element_locked( self , obj, allow_tensor, allow_operation)
3566 raise TypeError( "Can not convert a %s into a %s." % ( type (obj).__name__,
- > 3567 types_str))
3568
TypeError: Can not convert a TensorShapeV1 into a Tensor or Operation.
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython - input - 24 - de007c69e003> in <module>
- - - - > 1 sess.run(x.get_shape())
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in run( self , fetches, feed_dict, options, run_metadata)
927 try :
928 result = self ._run( None , fetches, feed_dict, options_ptr,
- - > 929 run_metadata_ptr)
930 if run_metadata:
931 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in _run( self , handle, fetches, feed_dict, options, run_metadata)
1135 # Create a fetch handler to take care of the structure of fetches.
1136 fetch_handler = _FetchHandler(
- > 1137 self ._graph, fetches, feed_dict_tensor, feed_handles = feed_handles)
1138
1139 # Run request and get response.
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in __init__( self , graph, fetches, feeds, feed_handles)
469 """
470 with graph.as_default():
- - > 471 self ._fetch_mapper = _FetchMapper.for_fetch(fetches)
472 self ._fetches = []
473 self ._targets = []
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in for_fetch(fetch)
269 if isinstance (fetch, tensor_type):
270 fetches, contraction_fn = fetch_fn(fetch)
- - > 271 return _ElementFetchMapper(fetches, contraction_fn)
272 # Did not find anything.
273 raise TypeError( 'Fetch argument %r has invalid type %r' % (fetch,
~\Anaconda3\lib\site - packages\tensorflow\python\client\session.py in __init__( self , fetches, contraction_fn)
302 raise TypeError( 'Fetch argument %r has invalid type %r, '
303 'must be a string or Tensor. (%s)' %
- - > 304 (fetch, type (fetch), str (e)))
305 except ValueError as e:
306 raise ValueError( 'Fetch argument %r cannot be interpreted as a '
TypeError: Fetch argument TensorShape([Dimension( 10 ), Dimension( 10 ), Dimension( 10 )]) has invalid type < class 'tensorflow.python.framework.tensor_shape.TensorShapeV1' >, must be a string or Tensor. (Can not convert a TensorShapeV1 into a Tensor or Operation.)
|
我们可以使用tf.rank()来确定张量的秩。tf.rank()会返回一个代表张量秩的张量,可直接在计算图中使用。
1
2
3
4
5
|
In [ 25 ]: tf.rank(x)
Out[ 25 ]: <tf.Tensor 'Rank:0' shape = () dtype = int32>
In [ 26 ]: sess.run(tf.rank(x))
Out[ 26 ]: 3
|
补充知识:tensorflow循环改变tensor的值
使用tf.concat()实现4维tensor的循环赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
alist = [[[[ 1 , 1 , 1 ],[ 2 , 2 , 2 ],[ 3 , 3 , 3 ]],[[ 4 , 4 , 4 ],[ 5 , 5 , 5 ],[ 6 , 6 , 6 ]]],[[[ 7 , 7 , 7 ],[ 8 , 8 , 8 ],[ 9 , 9 , 9 ]],[[ 10 , 10 , 10 ],[ 11 , 11 , 11 ],[ 12 , 12 , 12 ]]]] #2,2,3,3-n,c,h,w
kenel = (np.asarray(alist) * 2 ).tolist()
print (kenel)
inputs = tf.constant(alist,dtype = tf.float32)
kenel = tf.constant(kenel,dtype = tf.float32)
inputs = tf.transpose(inputs,[ 0 , 2 , 3 , 1 ]) #n,h,w,c
kenel = tf.transpose(kenel,[ 0 , 2 , 3 , 1 ]) #n,h,w,c
uints = inputs.get_shape()
h = int (uints[ 1 ])
w = int (uints[ 2 ])
encoder_output = []
for b in range ( int (uints[ 0 ])):
encoder_output_c = []
for c in range ( int (uints[ - 1 ])):
one_channel_in = inputs[b, :, :, c]
one_channel_in = tf.reshape(one_channel_in, [ 1 , h, w, 1 ])
one_channel_kernel = kenel[b, :, :, c]
one_channel_kernel = tf.reshape(one_channel_kernel, [h, w, 1 , 1 ])
encoder_output_cc = tf.nn.conv2d( input = one_channel_in, filter = one_channel_kernel, strides = [ 1 , 1 , 1 , 1 ], padding = "SAME" )
if c = = 0 :
encoder_output_c = encoder_output_cc
else :
encoder_output_c = tf.concat([encoder_output_c,encoder_output_cc],axis = 3 )
if b = = 0 :
encoder_output = encoder_output_c
else :
encoder_output = tf.concat([encoder_output, encoder_output_c], axis = 0 )
with tf.Session() as sess:
print (sess.run(tf.transpose(encoder_output,[ 0 , 3 , 1 , 2 ])))
print (encoder_output.get_shape())
|
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[[[[ 32. 48. 32. ]
[ 56. 84. 56. ]
[ 32. 48. 32. ]]
[[ 200. 300. 200. ]
[ 308. 462. 308. ]
[ 200. 300. 200. ]]]
[[[ 512. 768. 512. ]
[ 776. 1164. 776. ]
[ 512. 768. 512. ]]
[[ 968. 1452. 968. ]
[ 1460. 2190. 1460. ]
[ 968. 1452. 968. ]]]]
( 2 , 3 , 3 , 2 )
|
以上这篇TensorFlow中如何确定张量的形状实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/chr1991/article/details/93786790