ETC/머신러닝, 딥러닝 실습

3-3. Loading Data from File (파일데이터 읽어오기)

개발자킹콩 2020. 10. 31. 02:41

모두를 위한 머신러닝 / 딥러닝 강의: hunkim.github.io/ml/

 

 

목차

1. 파일에서 원하는 데이터 읽어오기

2. Queue Runners : 데이터가 너무 클때


 

1. 파일에서 원하는 데이터 읽어오기

 

 

 

해당 파일은 .csv 파일이며 흔히 알고 있는 .excel과 유사한 파일이라고 생각할 수 있다.

CSV(Comma-separated values)은 File Format이며, 콤마를 기준으로 데이터를 구분하는 파일이다.

 

그렇다면 이 csv파일은 어떻게 읽어오는가?

numpy에 존재하는 loadtxt를 이용하면 손쉽게 파일을 Read 할 수 있다.

여기서 데이터의 구분은 ', '콤마로 하고 데이터의 타입은 실수32비트로 설정하였다.

여기서 모든 데이터는 같은 데이터 타입을 갖는다.

 

 

 

 

 

해당 슬라이싱 연산은 어떤 것을 의미할까??

 

데이터의 경우 이차원 배열이 대부분을 차지한다. (excel과 csv는 이차원 데이터의 대표적 예시이다)

이제 이러한 이차원 배열의 데이터를 조작할 때, 원하는 데이터를 뽑아올 때 편리하도록

콤마를 기준으로 앞쪽데이터는 Row를 의미하고, 뒤쪽데이터는 Column을 의미한다.

 

 

 

그렇다면 해당 x_data와 y_data는 무엇을 의미할까?

x_data : 모든 행에 대하여, 첫행부터 마지막행 전까지의 데이터를 의미한다.

y_data : 모든 행에 대하여, 마지막 행만을 의미한다. 

 

해당 데이터들과 몇가지를 test로 데이터를 뽑아보자

 

 

 

 


 

 

 

 

해당 코드를 종합적으로 해석해보겠다.

  • 우선 데이터가 저장되어있는 .csv파일에서 데이터를 읽어들인다.
  • 변수에 대한 값들의 인스턴스들은 x_data로 담고, 출력에 해당하는 데이터는 y_data에 담는다.
  • 출력하여 해당 데이터의 형식과 구조, 갯수를 알아낸다.
  • 이제 만들어질 모델에 대한 X, Y를 설정하는데 shape의 경우 [A, B] 형태로 구성된다.
  • A는 인스턴스(데이터묶음)의 갯수, B는 변수의 갯수를 의미한다. None을 갯수제한이 없음을 의미한다.
  • shape는 총 데이터의 묶음(인스턴스)의 갯수는 제한이 없고 X는 3개의 변수로 이루어져있고 Y는 출력으로서 1개의 변수로 이루어져 있음을 의미한다.
  • Weight는 변수로 random한 숫자로 지정하는데 3행 1열인 tensor(벡터데이터)로 구성되고 Bias는 상수항을 의미한다.
  • 이제 행렬곱셈을 하여 hypothesis(가설, 직선)을 정의하고 cost를 정의하고 이를 Gradient Descent Algorithm을 통해 최소화된 cost를 찾도록 하는 dataflow graph를 완성하였고, 이제 실행을 하면 최소의 cost를 찾아 나설 것이다.
  • tf.Session().run(tf.global_variables_initializer())로 부터 Variable를 초기화 해주고 반복하여 sess.run을 하게 된다.
  • 이때, train에 학습할 데이터는 feed_dict={  } 형태로 X와 Y에 들어갈 데이터를 명시해준다.
  • 각각의 step에서 cost와 hypothesis를 출력해준다.
  • 마지막으로 feed_dict을 설정하여 원하는 데이터를 예측하고 이를 출력하며 프로그램이 종료된다.

 

 

 

 


 

2. Queue Runners : 데이터가 너무 클때

 

존재하는 모든 것은 메인메모리에 존재하는 것이다. 이는 프로그램이 프로세서(CPU)에 의해 실행되면 프로세스가 되는 것인데 이때 실행중이나 실행을 대기하고 있거나 Inputdata를 기다리는 프로그램의 경우 메인메모리에 올라가있다. 즉, 파일을 읽게 되어 해당 데이터를 프로그램에서 load하게 되면 해당 데이터는 메인메모리에 올라가게 된다.

이때, 파일이 굉장히 커서 메인메모리에 한번에 올릴 수 없는(load될 수 없는) 경우 메모리가 부족하다가 할텐데 Tensorflow에서는 이를 방지하여 Queue Runners라는 시스템을 만들어 두었다.

 

 

 

기본적으로 하나의 파일이 아닌 여러파일에서 데이터를 읽어오면 Queue에다가 쌓게되고 Reader과 연결하고 데이터를 읽은다음 데이터의 양식에 맞게 Decoder(콤마로 구분하는 것처럼)를 하게된다.

그후, 읽어온 데이터를 Queue에 쌓고 한번에 모든 데이터가 필요한 것이 아니기 때문에 필요한 만큼만 들고와서 학습을 시키고 꺼내쓰는 구조이다.

 

 

 

 

복잡해 보이지만 손쉽게 사용할 수 있도록 tensorflow에서 제공하기에 다음과 같이 3가지 step으로 사용하면 된다.

 

  1. 갖고있는 여러 개의 파일들을 List로 만들어준다. 이때 파일의 random하게 섞을지, 이름은 어떻게 할지 다양하게 설정가능하다.
  2. 이때 저장된 파일들을 읽어올 Reader을 설정하는데 (BinaryReader, TextLineReader 등) 여러 Reader들이 준비하고 있으니 어떤 Reader로 읽게 할지 결정하고 설정만 하면 된다.
  3. Value를 읽어왔는데 " 값을 어떻게 parsing(분석, 이해)를 할 것인가? " 에 대한 부분이다. 위에는 데이터들이 어떤 데이터 타입인지 설정한 것이다.

 

 

 

 

그 후에는 run으로 실행하게 된다.

 

 

우리가 이 값을 tf.train.batch로 데이터를 읽어오게 된다. (Queue에서 데이터 읽어오기)

읽어올 데이터 x_data, y_data를 설정하고, 한번에 읽어올 데이터의 size를 설정한다.

 

빨간색 표시한 부분들을 통상적으로 사용하는 것이고, 이제 tf.Session().run(train)을 하게 되면 학습이 이루어 진다.