이제 데이터가 많아지니까 소스코드에 적기 어렵다. 데이터가 만개 정도 되면 코드 또한 정말 더러울 것이다. 그럴 때는 txt 파일에 적어서 가져오면 된다. numpy를 사용하면 이를 쉽게 할 수 있다.
xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)
x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]
# Make sure the shape and data are OK
print(x_data, "\nx_data shape:", x_data.shape)
print(y_data, "\ny_data shape:", y_data.shape)
np.loadtxt로 파일을 불러온 다음 파일 이름을 적고, delimiter , 로 나누고 dtype은 float형으로 준다는 것이다.
여기서 데이터는 2차원 배열이 된다. 이제 x, y데이터를 나누기 위해 슬라이싱을 한다. 파이썬의 강력한 기능 중의 하나가 바로 슬라이싱이다.
예를 들어 nums가 0부터 4까지의 array이고 배열의 순서는 0부터 시작하기 때문에 nums는 0부터 4까지의 순서를 가진다.
여기서 주의할 점은 -1인데 -1은 마지막부터 마지막 한 개를 빼고 가져온다. -2는 마지막 두 개를 빼고 가져오는 것이다.
슬라이싱은 매우 많이 사용하는 방법이다. sungkim교수님의 영상을 보면 numpy의 슬라이싱을 더 공부할 수 있는 웹사이트가 있다. 더 공부하고 싶은 사람은 https://slides.com/ 이 사이트를 참고하기 바란다.
그러면 위 코드에서 xdata는 xy [:, 0:-1]은 처음부터 마지막 1열을 빼고 가져오는 값이되고 ydata는 xy[:, [-1]]은 마지막 열을 가져오는 것이다. 그런 다음에는 이전과 똑같다.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis
hypothesis = tf.matmul(X, W) + b
# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)
xdata는 읽어 왔을 때 data의 개수에 맞게 3개 ydata는 1개 w도 3개로 들어왔다가 1개로 나가고 b는 나가는 값 y의 개수이다.
# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
for step in range(2001):
cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
feed_dict={X: x_data, Y: y_data})
if step % 10 == 0:
print(step, "Cost:", cost_val, "\nPrediction:\n", hy_val)
# Ask my score
print("Your score will be ", sess.run(hypothesis,
feed_dict={X: [[100, 70, 101]]}))
print("Other scores will be ", sess.run(hypothesis,
feed_dict={X: [[60, 70, 110], [90, 100, 80]]}))
이제 학습을 시켜주고 우리의 점수를 넣고 한번 학습시켜보자. 친구들의 점수도 물어볼 수도 있다.
Your score will be [[ 181.73277283]]
Other scores will be [[ 145.86265564]
[ 187.23129272]]
그럼 이렇게 점수를 예측하여 돌려주게 된다. 여기서 해본 것은 numpy를 이용해서 data를 가져온 다음 읽어드려 점수를 예측하는 모델을 만들어 본 것이다.
파일의 메모리가 굉장히 커서 한 번에 올려서 쓰기 힘들 때 사용하는 것이 바로 Queue Runners이다. 한 개의 파일이 아닌 여러 개의 파일에서 읽어드리면 그걸 계속 쌓아서 Reader로 읽어와 양식의 맞게 Decoder 한다. 이것을 다시 Queue에 쌓는다. 학습을 시킬 때 필요한 만큼 가져와서 학습을 시킨다. 조금씩 꺼내 쓰면 되는 것이다. 큰 data를 사용할 때 유용하게 사용할 수 있다. 아래 그림을 살펴보자.
첫 번째로 우리가 가지고 있는 파일이 몇 개인지를 알기 위해 파일의 이름을 정리해주고 shuffle을 해줄 것인지 안 해줄 것인지를 설정하고 queue의 이름을 정의해주면 된다. 두 번째는 읽어올 Reader을 정의해준다. TextLineReader()로 txt를 읽어오고 key와 value를 나누어서 읽는다고 정의해줄 수 있다. 세 번째는 value값을 어떻게 parsing 할 것인지 어떻게 이해할 것인지를 decode_csv로 읽어올 때 각각의 데이터 type을 정해줄 수 있다. float를 사용할 거기 때문에 실수로 표현해줬다.
이 값을 batch라는 것으로 읽어오게 된다. 일종의 펌프 역할이 돼서 읽어오는 것이다.
# collect batches of csv in.
train_x_batch, tarin_y_batch = \
tf.train.batch([xy[0:-1],xy[-1:]],batch_size=10)
sess = tf.Session()
...
# Start populating the filename queue.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for step in range(2001):
x_batch,ybatch = sess.run([train_x_batch, train_y_batch])
...
coord.request_stop()
coord.join(threads)
똑같이 xdata와 ydata를 입력해주고 batch_size로 한 번에 몇 개씩 가져올지를 정한다. 그다음은 세션을 생성하고 그다음 부분은 통상적으로 쓴다고 생각하면 된다. 그리고 for루프를 돌때 세션을 가지고 실행을 시키면 x와y의 batch데이터에 들어와 나중에 feed_dict를 사용해서 값을 넘겨주면 된다. 굉장히 복잡해보이지만 일반적으로 이렇게 하기때문에 하면된다.
공부한 사이트:https://www.youtube.com/watch?v=o2q4QNnoShY&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=10
'머신러닝 > 모두를 위한 딥러닝' 카테고리의 다른 글
Logistic Regression의 cost 함수 설명 (0) | 2019.05.21 |
---|---|
Logistic Classification의 가설 함수 정의 (0) | 2019.05.19 |
multi-variable linear regression을 TensorFlow에서 구현하기 (0) | 2019.05.16 |
multi-variable linear regression (0) | 2019.05.15 |
Linear Regression 의 cost 최소화의 TensorFlow 구현 (0) | 2019.05.14 |