본문 바로가기
파이썬

파이썬 tensorflow에서 지정되지 않은 차원이있는 텐서

by º기록 2020. 11. 12.
반응형

나는 tensorflow를 가지고 놀면서 다음 코드에 문제가 발생했습니다.

def _init_parameters(self, input_data, labels):

    # the input shape is (batch_size, input_size)
    input_size = tf.shape(input_data)[1]

    # labels in one-hot format have shape (batch_size, num_classes)
    num_classes = tf.shape(labels)[1]

    stddev = 1.0 / tf.cast(input_size, tf.float32)

    w_shape = tf.pack([input_size, num_classes], 'w-shape')
    normal_dist = tf.truncated_normal(w_shape, stddev=stddev, name='normaldist')
    self.w = tf.Variable(normal_dist, name='weights')


이 스크립트를 호출하는 더 큰 스크립트에서 실행할 때 다음 오류가 발생합니다.

ValueError: initial_value must have a shape specified: Tensor("normaldist:0", shape=TensorShape([Dimension(None), Dimension(None)]), dtype=float32)

대화 형 셸에서 프로세스를 복제하려고했습니다. 실제로 normal_dist 의 크기는 지정되지 않았지만 제공된 값이 존재합니다.

In [70]: input_size.eval()
Out[70]: 4

In [71]: num_classes.eval()
Out[71]: 3

In [72]: w_shape.eval()
Out[72]: array([4, 3], dtype=int32)

In [73]: normal_dist.eval()
Out[73]: 
array([[-0.27035281, -0.223277  ,  0.14694688],
       [-0.16527176,  0.02180306,  0.00807841],
       [ 0.22624688,  0.36425814, -0.03099642],
       [ 0.25575709, -0.02765726, -0.26169327]], dtype=float32)

In [78]: normal_dist.get_shape()
Out[78]: TensorShape([Dimension(None), Dimension(None)])

이것은 이상합니다. Tensorflow는 벡터를 생성하지만 그 모양을 말할 수 없습니다. 내가 뭘 잘못하고 있니?

 

해결 방법

 


코드에서 normal_dist 에는 부분적으로 정의 된 정적 모양이 있습니다. w_shape 는 계산 된 값이기 때문입니다. (TensorFlow는 때때로 이러한 계산 된 값은 그래프 생성시,하지만 tf.pack 에서 멈 춥니 다.) 모양을 추론합니다. TensorShape ([Dimension (None), Dimension (None)]) , 이는 w_shape 가 길이가 2 인 벡터이므로 결과 normal_dist 가 2가되어야한다는 것을 알고 있기 때문에 "행과 열 수가 알 수없는 행렬"을 의미합니다. 차원.

이를 처리 할 수있는 두 가지 옵션이 있습니다. Ishamael이 제안한대로 정적 모양을 설정할 수 있지만이를 위해서는 그래프 생성시 모양을 알아야합니다. 예를 들어 다음이 작동 할 수 있습니다.

normal_dist.set_shape([input_data.get_shape()[1], labels.get_shape()[1]])


 

참조 페이지 https://stackoverflow.com/questions/34079787

 

 

반응형

댓글