我们可以使用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://zxbcw.cn/post/189350/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)