tensor flow 에서 데 이 터 를 불 러 오 는 세 가지 방식 을 자세히 설명 합 니 다.

Tensorflow 데이터 읽 기 에는 세 가지 방법 이 있 습 니 다.
  • 사전 로드 된 데이터:사전 로드 데이터
  • Feeding:Python 에서 데 이 터 를 만 들 고 데 이 터 를 백 엔 드 에 먹 입 니 다
  • Reading from file:파일 에서 직접 읽 기
  • 이 세 가지 읽 기 방식 은 어떤 차이 가 있 습 니까?우 리 는 우선 TensorFlow(TF)가 어떻게 일 하 는 지 알 아야 한다.
    TF 의 핵심 은 C++로 작 성 된 것 으로,이러한 장점 은 빠르게 작 동 하 는 것 이 며,호출 이 원활 하지 않다 는 단점 이 있다.파 이 썬 은 정반 대 이기 때문에 두 언어의 장점 을 결합 시킨다.계산 과 관련 된 핵심 연산 자 와 실행 프레임 워 크 는 C++로 쓰 여 있 으 며,Python 에 API 를 제공 합 니 다.Python 은 이 API 를 호출 하여 훈련 모델(Graph)을 설계 하고 디자인 된 그래프 를 백 엔 드 에 실행 합 니 다.요컨대 Python 의 역할 은 Design 이 고 C++는 Run 이다.
    1.미리 불 러 온 데이터:
    
    import tensorflow as tf 
    #   Graph 
    x1 = tf.constant([2, 3, 4]) 
    x2 = tf.constant([4, 0, 1]) 
    y = tf.add(x1, x2) 
    #     session -->   y 
    with tf.Session() as sess: 
      print sess.run(y) 
    
    2.python 에서 데 이 터 를 만 들 고 백 엔 드 에 데 이 터 를 먹 입 니 다.
    
    import tensorflow as tf 
    #   Graph 
    x1 = tf.placeholder(tf.int16) 
    x2 = tf.placeholder(tf.int16) 
    y = tf.add(x1, x2) 
    #  Python     
    li1 = [2, 3, 4] 
    li2 = [4, 0, 1] 
    #     session -->     -->   y 
    with tf.Session() as sess: 
      print sess.run(y, feed_dict={x1: li1, x2: li2}) 
    
    설명:여기 서 x1,x2 는 자리 표시 자 일 뿐 구체 적 인 값 이 없습니다.그러면 실행 할 때 어디로 가 야 합 니까?이 럴 때 는 sess.run()의 feed 를 사용 해 야 합 니 다.dict 매개 변 수 는 Python 에서 발생 한 데 이 터 를 백 엔 드 에 먹이 고 y 를 계산 합 니 다.
    이 두 가지 방안 의 단점:
    1.미리 불 러 오기:데 이 터 를 그래프 에 직접 삽입 하고 그래프 를 Session 에 전송 하여 실행 합 니 다.데이터 양 이 비교적 많 을 때 그래프 의 전송 은 효율 적 인 문제 에 부 딪 힐 수 있다.
    2.자리 차지 문자 로 데 이 터 를 대체 하고 실행 할 때 데 이 터 를 채 웁 니 다.
    앞의 두 가지 방법 은 매우 편리 하지만 대형 데 이 터 를 만 났 을 때 매우 힘 들 고 Feeding 이 라 고 해도 중간 부분의 증가 도 적지 않 은 비용 이다.예 를 들 어 데이터 유형 전환 등 이다.가장 좋 은 방안 은 그래프 에서 파일 을 읽 는 방법 을 정의 하여 TF 가 스스로 파일 에서 데 이 터 를 읽 고 사용 가능 한 샘플 집합 으로 디 코딩 하 는 것 이다.
    3.파일 에서 읽 습 니 다.쉽게 말 하면 데이터 읽 기 모듈 의 그림 을 맞 추 는 것 입 니 다.

    1.데 이 터 를 준비 하고 세 개의 파일 을 구성 합 니 다.A.csv,B.csv,C.csv
    
    $ echo -e "Alpha1,A1
    Alpha2,A2
    Alpha3,A3" > A.csv $ echo -e "Bee1,B1
    Bee2,B2
    Bee3,B3" > B.csv $ echo -e "Sea1,C1
    Sea2,C2
    Sea3,C3" > C.csv
    2.단일 리더,단일 샘플
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    #              QueueRunner,        
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    #   Reader 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    #   Decoder 
    example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']]) 
    #example_batch, label_batch = tf.train.shuffle_batch([example,label], batch_size=1, capacity=200, min_after_dequeue=100, num_threads=2) 
    #   Graph 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() #       ,     
      threads = tf.train.start_queue_runners(coord=coord) #  QueueRunner,            。 
      for i in range(10): 
        print example.eval(),label.eval() 
      coord.request_stop() 
      coord.join(threads) 
    설명:여 기 는 tf.train.shuffle 을 사용 하지 않 았 습 니 다.batch,생 성 된 샘플 과 label 사이 에 대응 하지 못 하고 순서 가 어 지 럽 습 니 다.생 성 결 과 는 다음 과 같 습 니 다.
    Alpha1 A2
    Alpha3 B1
    Bee2 B3
    Sea1 C2
    Sea3 A1
    Alpha2 A3
    Bee1 B2
    Bee3 C1
    Sea2 C3
    Alpha1 A2
    솔 루 션:tf.train.shuffle 로batch,그러면 생 성 된 결과 가 대응 할 수 있 습 니 다.
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    #              QueueRunner,        
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    #   Reader 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    #   Decoder 
    example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']]) 
    example_batch, label_batch = tf.train.shuffle_batch([example,label], batch_size=1, capacity=200, min_after_dequeue=100, num_threads=2) 
    #   Graph 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() #       ,     
      threads = tf.train.start_queue_runners(coord=coord) #  QueueRunner,            。 
      for i in range(10): 
        e_val,l_val = sess.run([example_batch, label_batch]) 
        print e_val,l_val 
      coord.request_stop() 
      coord.join(threads) 
    
    3.단일 리더,여러 샘플,주로 tf.train.shufflebatch 구현 
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']]) 
    #   tf.train.batch()             QueueRunner。 
    #Decoder           ,     。 
    #         Reader,        ,              ,          。 
    example_batch, label_batch = tf.train.batch( 
       [example, label], batch_size=5) 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(coord=coord) 
      for i in range(10): 
        e_val,l_val = sess.run([example_batch,label_batch]) 
        print e_val,l_val 
      coord.request_stop() 
      coord.join(threads) 
    
    설명:아래 의 이런 표기 법,추출 한 batchsize 개 샘플,특징 과 label 사이 도 일치 하지 않 습 니 다.
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']]) 
    #   tf.train.batch()             QueueRunner。 
    #Decoder           ,     。 
    #         Reader,        ,              ,          。 
    example_batch, label_batch = tf.train.batch( 
       [example, label], batch_size=5) 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(coord=coord) 
      for i in range(10): 
        print example_batch.eval(), label_batch.eval() 
      coord.request_stop() 
      coord.join(threads) 
    
    설명:출력 결 과 는 다음 과 같 습 니 다.feature 와 label 사이 에 대응 하지 않 음 을 알 수 있 습 니 다.
    ['Alpha1' 'Alpha2' 'Alpha3' 'Bee1' 'Bee2'] ['B3' 'C1' 'C2' 'C3' 'A1']
    ['Alpha2' 'Alpha3' 'Bee1' 'Bee2' 'Bee3'] ['C1' 'C2' 'C3' 'A1' 'A2']
    ['Alpha3' 'Bee1' 'Bee2' 'Bee3' 'Sea1'] ['C2' 'C3' 'A1' 'A2' 'A3']
    4.여러 개의 reader,여러 개의 견본
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    record_defaults = [['null'], ['null']] 
    #        ,        reader   
    example_list = [tf.decode_csv(value, record_defaults=record_defaults) 
             for _ in range(2)] # Reader   2 
    #   tf.train.batch_join(),      reader,      。  Reader      。 
    example_batch, label_batch = tf.train.batch_join( 
       example_list, batch_size=5) 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(coord=coord) 
      for i in range(10): 
        e_val,l_val = sess.run([example_batch,label_batch]) 
        print e_val,l_val 
      coord.request_stop() 
      coord.join(threads) 
    
    tf.train.batch 와 tf.train.shufflebatch 함 수 는 단일 Reader 로 읽 지만 다 중 스 레 드 가 가능 합 니 다.tf.train.batch_join 과 tf.train.shufflebatch_join 은 다 중 Reader 읽 기 를 설정 할 수 있 습 니 다.모든 Reader 는 하나의 스 레 드 를 사용 합 니 다.두 가지 방법의 효율 에 대해 서 는 리더 만 있 을 때 두 개의 스 레 드 가 속도 의 한계 에 이 르 렀 다.리 더 를 많이 읽 었 을 때 리 더 는 2 개 로 한계 에 도달 했다.그래서 스 레 드 가 많 을 수록 빠 르 고 심지어 더 많은 스 레 드 가 오히려 효율 을 떨 어 뜨리 는 것 은 아니다.
    5.교체 제어,epoch 매개 변 수 를 설정 하고 우리 의 견본 이 훈련 할 때 몇 라운드 만 사용 할 수 있 는 지 지정 합 니 다.
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    filenames = ['A.csv', 'B.csv', 'C.csv'] 
    #num_epoch:       
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False,num_epochs=3) 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    record_defaults = [['null'], ['null']] 
    #        ,        reader   
    example_list = [tf.decode_csv(value, record_defaults=record_defaults) 
             for _ in range(2)] # Reader   2 
    #   tf.train.batch_join(),      reader,      。  Reader      。 
    example_batch, label_batch = tf.train.batch_join( 
       example_list, batch_size=1) 
    #        
    init_local_op = tf.initialize_local_variables() 
    with tf.Session() as sess: 
      sess.run(init_local_op) 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(coord=coord) 
      try: 
        while not coord.should_stop(): 
          e_val,l_val = sess.run([example_batch,label_batch]) 
          print e_val,l_val 
      except tf.errors.OutOfRangeError: 
          print('Epochs Complete!') 
      finally: 
          coord.request_stop() 
      coord.join(threads) 
      coord.request_stop() 
      coord.join(threads) 
    
    
    교체 제어 중 tf.initialize 추가 기억local_variables(),홈 페이지 튜 토리 얼 은 설명 되 지 않 았 지만 초기 화 되 지 않 으 면 실행 이 잘못 되 었 습 니 다.
    전통 적 인 기계 학습 에 있어 예 를 들 어 분류 문제,[x1 x2 x3]는 feature 이다.2 분류 문제 에 대해 label 은 one-hot 인 코딩 을 거 친 후에[0,1]또는[1,0]이 될 것 이다.일반적으로 csv 파일 에 데 이 터 를 구성 하 는 것 을 고려 합 니 다.한 줄 은 sample 을 대표 합 니 다.그리고 대기 열 방식 으로 데 이 터 를 읽 습 니 다.

    설명:이 데이터 에 대해 앞의 세 열 은 feature 를 대표 합 니 다.분류 문제 이기 때문에 뒤의 두 열 은 one-hot 인 코딩 을 통 해 얻 은 label 입 니 다.
    이 csv 파일 을 읽 기 위해 대기 열 을 사용 하 는 코드 는 다음 과 같 습 니 다.
    
    #-*- coding:utf-8 -*- 
    import tensorflow as tf 
    #              QueueRunner,        
    filenames = ['A.csv'] 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
    #   Reader 
    reader = tf.TextLineReader() 
    key, value = reader.read(filename_queue) 
    #   Decoder 
    record_defaults = [[1], [1], [1], [1], [1]] 
    col1, col2, col3, col4, col5 = tf.decode_csv(value,record_defaults=record_defaults) 
    features = tf.pack([col1, col2, col3]) 
    label = tf.pack([col4,col5]) 
    example_batch, label_batch = tf.train.shuffle_batch([features,label], batch_size=2, capacity=200, min_after_dequeue=100, num_threads=2) 
    #   Graph 
    with tf.Session() as sess: 
      coord = tf.train.Coordinator() #       ,     
      threads = tf.train.start_queue_runners(coord=coord) #  QueueRunner,            。 
      for i in range(10): 
        e_val,l_val = sess.run([example_batch, label_batch]) 
        print e_val,l_val 
      coord.request_stop() 
      coord.join(threads) 
    
    출력 결 과 는 다음 과 같 습 니 다.

    설명:
    
    record_defaults = [[1], [1], [1], [1], [1]]
    해 석 된 템 플 릿 을 대표 합 니 다.각 견본 은 5 열 이 있 고 데이터 에서 기본적으로','격 리 된 다음 에 해 석 된 기준 은[1]입 니 다.즉,각 열의 수 치 는 모두 정형 으로 해 석 됩 니 다.[1.0]부동 소수점 으로 해석 하고[null]string 형식 으로 해석 합 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기