jjimini98 / CapstoneProject2

Capstone_Project2
0 stars 2 forks source link

2021-05-29 17:12:36.809578: W tensorflow/core/framework/allocator.cc:107] Allocation of 411041792 exceeds 10% of system memory. #33

Closed skdlfjl closed 3 years ago

skdlfjl commented 3 years ago

FCN.py의 main()함수 안에서 세션을 열고 sess.run(tf.global_variables_initializer())로 변수를 초기화 할 때 나오는 메세지입니다. 로그 레벨이 E가 아닌 W이기는 한데 찾아보니 GPU 메모리가 부족한거라고.. ㄱ-;; batch size를 줄여서 해보거나 network를 줄이거나 input size를 줄이거나 gpu를 바꿔야 한다고 합니다 (주워들은거라 정확하지 X)

@junepass6 혹시 지윤님도 이렇게 뜨나요?? 이 코드 이후에 바로 아래와 같은 사이즈 에러 뜹니다 ValueError: Cannot feed value of shape (2, 224, 224, 3) for Tensor 'annotation:0', which has shape '(?, 224, 224, 1)'

  print("확인용 1")
  # 변수들을 초기화하고 저장된 ckpt 파일이 있으면 저장된 파라미터를 불러옵니다.
  sess.run(tf.global_variables_initializer())
  print("확인용 2")
  ckpt = tf.train.get_checkpoint_state(FLAGS.logs_dir)
  # tf.flags.DEFINE_string("logs_dir", "logs/", "path to logs directory")
  print("확인용 3")
  print(ckpt)
  print(type(ckpt))
  print("확인용 4")

image

그리고 ckpt 값이 None으로 찍히네요.

tensorflow 로 학습시킨 딥러닝 모델을 저장하는 방법중 하나로 Checkpoint 을 이용하는 방법이 있다. Checkpoint 은 학습된 모델의 Variable 값을 저장하는 파일(.ckpt)이다. Checkpoint 파일을 저장하고 불러옴으로써 학습된 모델을 재사용하고, 지난 학습을 이어서 더 하고 하는 작업들이 가능해진다. 참고링크 : http://jaynewho.com/post/8

tf.train.get_checkpoint_state(saved_dir_path)를 이용해서 Checkpoint State Protocol Buffer 를 이용할 수 있습니다. Checkpoint State Protocol Buffer에는 두가지 정보가 담겨있음

  1. model_checkpoint_path : 가장 최근에 저장된 job.ckpt 파일의 path 정보
  2. all_model_checkpoint_paths : 최근에 저장된 job_i.ckpt 파일들의 path 정보 list
skdlfjl commented 3 years ago

@junepass6 아 그리고 지윤님 #29 의

ERROR_01 : Skipping 되는 문제 발생

까지만 해도 Epoch 1번 돌아간다고 하셨는데 혹시 해당 문제 해결한 뒤에도 (shape에러 나는 현 시점) Epoch 1번 돌아가나요??

junepass6 commented 3 years ago

@junepass6 아 그리고 지윤님 #29 의

ERROR_01 : Skipping 되는 문제 발생

까지만 해도 Epoch 1번 돌아간다고 하셨는데 혹시 해당 문제 해결한 뒤에도 (shape에러 나는 현 시점) Epoch 1번 돌아가나요??

지금은 안 돌아갑니다.ㅜ

junepass6 commented 3 years ago

print("확인용 1")

변수들을 초기화하고 저장된 ckpt 파일이 있으면 저장된 파라미터를 불러옵니다.

sess.run(tf.global_variables_initializer()) print("확인용 2") ckpt = tf.train.get_checkpoint_state(FLAGS.logs_dir)

tf.flags.DEFINE_string("logs_dir", "logs/", "path to logs directory")

print("확인용 3") print(ckpt) print(type(ckpt)) print("확인용 4")

제가 확인하려면 이 코드 어디에 작성해야하나요?

skdlfjl commented 3 years ago

제가 확인하려면 이 코드 어디에 작성해야하나요?

FCN.py의 main()함수 안에 있는

  sess.run(tf.global_variables_initializer())
  ckpt = tf.train.get_checkpoint_state(FLAGS.logs_dir)

이 코드 아래에 적어주심 됩니다

skdlfjl commented 3 years ago

ERROR_01 : Skipping 되는 문제 발생

까지만 해도 Epoch 1번 돌아간다고 하셨는데 혹시 해당 문제 해결한 뒤에도 (shape에러 나는 현 시점) Epoch 1번 돌아가나요??

지금은 안 돌아갑니다.ㅜ

train_images, train_annotations = train_dataset_reader.next_batch(FLAGS.batch_size)

batch_size는 FCN.py에서 tf.flags.DEFINE_integer("batch_size", "2", "batch size for training")로 정의해뒀습니다.

전에 Epoch가 한번 돌아갔던 이유는 단순히 데이터가 들어가지 않아서,

즉, 해당 함수의 self.images.shape[0]값이 0이었기 때문에 if self.batch_offset > self.images.shape[0]: 구문을 만족시켜서 돌아갔던 것으로 확인이 됩니다.

아래는 BatchDatsetReader.py의 next_batch(self, batch_size) 함수입니다. if문을 만족시켜야 Epochs completed가 출력됩니다.

    # batch_size만큼의 다음 배치를 가져옵니다.
    def next_batch(self, batch_size):
        start = self.batch_offset
        self.batch_offset += batch_size
        # 한 epoch의 배치가 끝난 경우 batch index를 처음으로 다시 설정합니다.
        print('----------------------------------------------------------------')
        #print(self.images)
        print(self.images.shape[0])
        if self.batch_offset > self.images.shape[0]:
            # 한 epoch이 끝났습니다.
            self.epochs_completed += 1
            print("****************** Epochs completed: " + str(self.epochs_completed) + "******************")
            # 데이터를 섞습니다.(Shuffle)
            perm = np.arange(self.images.shape[0])
            np.random.shuffle(perm)
            self.images = self.images[perm]
            self.annotations = self.annotations[perm]
            # 다음 epoch을 시작합니다.
            start = 0
            self.batch_offset = batch_size