2017-11-07 3 views
-1

tf.dataset이 실제로 작동하므로 학습 속도를 2 배까지 높일 수있었습니다. 하지만 여전히 성능 문제가 있습니다. GPU의 사용률은 낮습니다 (여러 작업자와 tf.dataset 사용에도 불구하고). 내 사용 사례는 다음입니다 : 교육 사례TF Api Dataset : 초기화

  1. ~ 400, 각각 10 개 입력 채널을
  2. 작업은 ResNet50를 사용하여 분할은 (~ 5기가바이트을). 앞으로 - 뒤로 걸릴 ~ 0.15s. 배치 크기 = 32

  3. 데이터로드가 빠르다. ~ 0.06 초가 걸린다.

그러나 하나의 에포크 (32분의 400 ~ = 13 반복) 후, 데이터 로딩 ~ 3.5 초, 로더 같은 추천을 초기화 (이것은 모든 에폭 처리 이상이다). 이것은 매우 느리게 배웁니다.

내 질문은 : 각 에포크 후에 초기화를 제거하고 데이터를 지속적으로 공급할 수있는 옵션이 있습니까?

dataset.repeat(10)을 설정하려했지만 도움이되지 않습니다.

로딩 코드와 기차

은 여기에 있습니다 : https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3

이 모델은 영상 분할을위한 Ecnoder - 디코더 아이디어에 불과 ResNet 변환된다. 대부분의 코드는 https://github.com/argman/EAST에서 가져 왔지만 여기서는 로딩 속도가 매우 느리기 때문에 TfRecords로 변환하고 싶습니다.

+0

그것은 소스를 보지 않고 같은 질문에 대답하기 어렵다. 나는 최근에 데이터 세트를 가지고 놀았으며 dataset.repeat()가 매번 반복자를 다시 초기화하는 것보다는 이동하는 방법이라고 생각합니다. 그러나 당신은 pipeline에서 repeat()를하고있는 곳을 조심해야합니다. –

+0

답해 주셔서 감사합니다. 디버깅에 유용 할 수 있다면 몇 가지 코드를 추가했습니다. 현재이 문제를 해결할 방법이 있는지 확실하지 않습니다. – melgor89

+1

batch() 전에 repeat()를 이동하고 repeat()를 사용하여 수행하는 훈련의 수를 제어하기 때문에 초기화 가능한 시간 대신 하나의 시간 반복자를 사용할 수 있습니다. –

답변

0

나는 긴 초기화로 내 문제를 부분적으로 해결합니다. 나는 단지 파일을 작게 tfrecord 만든다. 내 기본 구현에서 원시 문자열을 이미지로 사용했습니다 (numpy 배열의 문자열). 새로운 'tfrecord'는 jpeg 또는 png을 사용하여 압축 된 이미지를 포함합니다. 덕분에 파일을 50 배 더 작게 만들어서 초기화 속도를 훨씬 빠르게 할 수 있습니다. 그러나 그것의 단점도 있습니다 : 당신의 이미지는 uini8 (jpeg) 또는 uint16 (png)이어야합니다. float의 경우에는 uint16을 사용할 수 있지만 정보가 손실됩니다.

에 NumPy와 배열을 인코딩하면 Tensorflow 자체를 사용할 수 있습니다 따끔 압축 :

encoded_jpeg = tf.image.encode_jpeg(tf.constant(img),format='rgb').eval(session=sess) 
encoded_png = tf.image.encode_png(tf.constant(png_image)).eval(session=sess)