2018년도에 Instance Segmentation 방법을 기반으로 조기 위암 영역을 검출하는 프로젝트를 진행했었다.

 

학습 데이터셋에 Annotation 작업이 필요했는데,

 

VGG Image Annotator를 활용했었다.

 

(현재는 Labelme를 활용하고 있음)

 

1.0.6 버전을 기준으로 사용방법을 정리해본다.

 

오랜만에 홈페이지 들어가서 찾아보니 버전업이 많이 됐다. -_-;

 

아마 많은 기능이 업데이트 됐으리라고 본다.

 

기본적인 구조는 비슷하기에 최신버전을 받아서 해도 무방할듯하다.


1. 다운로드 링크

  - http://www.robots.ox.ac.uk/~vgg/software/via/

  - 하단에 Downloads 링크가 있다.

  - 1.0.6 버전을 받아주자. via-1.0.6.zip

 

2. 압축을 풀고 via.html 실행 (google chrome 활용)

via.html 더블클릭

3. Image -> Load or Add Images 선택

Image탭에 Load or Add Images 선택

4. Annotation 하려는 이미지 열기

  - shift or ctrl 키를 이용하여 여러 장 선택 가능

Annotation하려는 이미지 선택

5. Region Shape에서 Polygon Region Shape 선택

Instance Segmentation을 위한 Polygon Annotation

6. 마우스 클릭을 통해 영역 분할

확대/축소(+,-) 버튼을 활용해서 디테일하게 작업하자

7. Region Attributes에 class 필드를 추가하고 class를 입력

Class 필드 추가 및 Polyp Class 입력

8. 하나의 이미지에 여러 class 가능

Adenoma Class 추가

9. 나머지 이미지들에 대해 동일한 방법을 통해 영역 분할 수행

다른 이미지에서의 Annotation

10. 불러온 모든 이미지에 대한 작업을 마치고 저장

  - Annotation -> Save as Json

Json 파일로 저장


엄청 쉽지만 많은 시간과 디테일이 요구된다.

 

Annotation은 정답에 해당되는 정보이기 때문에

 

수작업으로 정교하게 수행하는게 가장 좋지만,

 

비용이 많이 소요되기에 전략을 잘 세워야한다.

 

위의 의료영상같은 경우는 일반인이 Annotation 작업을 진행해도 문제가 될 소지가 있다.

 

전문가가 보는 시각과 다르기 때문이다.

 

그래서 의사가 Annotation을 정밀하게 하는게 맞지만

 

그렇게할 의사가 있을지... -_-;

 

해당 프로젝트는 전공의들이 진행했었는데 Annotation을 깍두기처럼 해놔서 (20각형 정도를 5각형으로..)

 

결과가 디테일하지 않았던 기억이 있다.

 

(위의 그림은 본인이 예시로 수행한 것임)

'머신러닝 > Annotation' 카테고리의 다른 글

Labelme  (0) 2020.08.31

Performance evaluation


training set으로 evaluation을 한다면 100% accuracy를 가지게 될 것입니다.


이는 공정하지 않습니다.


보통 data set의 70%정도를 training set으로 학습에 이용하고


나머지 30% 정도를 test set으로 설정하여 evaluation을 수행합니다.



Training, validation and test sets


learning rate와 regularization strength를 tuning할 필요성이 있습니다.


이럴 경우 위의 traning set을 완전한 training set과 validation set으로 다시 나눕니다.


완전한 training set을 가지고 model을 학습을 시키고


validation set을 가지고 learning rate와 regularization strength를 tuning하게 됩니다.


이후 tuning을 마친 model을 가지고 


test set에서 evaluation을 수행하게 됩니다.



Accuracy


test set의 실제값(lable)과 model이 예측한 값이 얼마나 일치하는지를 계산합니다.



출처


Learning rate


learning rate가 너무 크다면 overshooting이 일어날 수 있습니다.


learning rate가 너무 작다면 학습 시간이 오래 걸리며 local minimum에 빠질 수도 있습니다.


적당한 learning rate는 학습의 중요한 요소입니다.


cost function값을 관찰하면서 실험적으로 learning rate를 정할 수 있습니다.



Data(x) preprocessing for gradient descent


data(x)의 데이터들 사이의 값의 차이가 심한 경우 overshooting이 일어날 수 있습니다.


그렇기 때문에 data에 대해 normalize를 할 필요가 있습니다.


Standardization

여기서 뮤는 평균, 시그마는 분산을 나타냅니다.



Overfitting


학습 데이터에 과도하게 fitting된 경우


overfitting을 줄일 수 있는 방법

  • training data를 늘린다
  • feature의 수를 줄인다
  • regularization(일반화) 시킨다



Regularization


weight를 너무 큰 값으로 가지지 않게 합니다.


cost function 이후에 regularization term을 추가합니다.


여기서 W는 w의 벡터로 각각의 element에 제곱의 합의 값이 작아질 수 있도록 cost function을 만듭니다.


여기서 람다는 regularization strength로 상수입니다.


0으로 둔다면 regularization을 사용하지 않겠다 라는 의미이고


1로 둔다면 regularization을 중요하게 생각하겠다 라는 의미입니다.


0.001이면 크게 중요하게 생각하지 않겠다 라는 의미입니다.


사용자가 정의할 수 있습니다.



출처


binary classification을 이용하여 여러 개의 class를 판별합니다.


3개의 class를 판별하는 binary classifier가 있습니다.


이 부분을 matrix multiplication 성질을 이용하여 간결하게 바꿔줍니다.


예측값을 0~1로 표현해주는 sigmoid function이 보이지 않습니다.


softmax는 예측값을 0~1로 표현해주는것 뿐만 아니라


예측값들을 다 더했을 경우 합이 1이 되는 확률로 나타내줍니다.


확률로 나타난 값들을 'one-hot encoding'을 통해 0과 1로 표현해줍니다.


이로써 hypothesis는 완성됐습니다.


cost function은 cross-entropy라는 algorithm을 이용합니다.


여기서 L은 실제 lable, S는 예측값 입니다.

는 softmax로 인해 0~1사이의 값을 가지게 됩니다. 가 1에 가까울수록 -log함수로 인해 0에 가까워지게 됩니다. 가 0에 가까울수록 -log함수로 인해 값이 커지게 됩니다.


예측값과 실제 lable이 일치하는 경우 cost function 값이 낮아지게 되고,

예측값과 실제 label이 다른 경우 cost function 값이 높아지게 됩니다. 



Logistic cost VS cross entropy


이 둘은 실제로 같습니다.


x(예측값)는 S이고, y(실제 lable)는 L입니다.


logistic cost에서 y가 1인 경우 -log(H(x))가 되며,

 가 1인 경우 가 되므로 동일합니다.


여러 개의 training set이 있을 경우 아래와 같이 표현할 수 있습니다.


cost function

여기서 i는 training set을 나타냅니다.


이 cost or loss function을 최소화하는 값, w벡터를 찾아내면 됩니다.



cost function을 미분함으로써 update할 수 있습니다.



출처


cost function에서 global minimun을 찾고 local minimun에 빠지지 않기 위함입니다.


New cost function for logistic



sigmoid function의 exponential term을 log를 이용하여 상쇄합니다.


위의 cost function을 이용하면,


실제 lable이 y=1이고 예측값이 H(x)=1로 맞았을 경우, -log(1)로 cost function 값이 0이 됩니다.

실제 lable이 y=1이고 예측값이 H(x)=0으로 틀렸을 경우, -log(0)로 cost function 값이 커지게 됩니다.


실제 lable이 y=0이고 예측값이 H(x)=0으로 맞았을 경우, -log(1-0)로 cost function 값이 0이 됩니다.

실제 lable이 y=0이고 예측값이 H(x)=1로 틀렸을 경우, -log(1-1)로 cost function 값이 커지게 됩니다.


y=1인 경우와 y=0인 경우의 if condition을 위의 수식을 이용하여 상쇄합니다.


y=1인 경우,

두 번째 term이 없어집니다.


y=0인 경우,

첫 번째 term이 없어집니다.



Minimize cost - Gradient decent algorithm


cost function의 기울기(미분)을 구해서 W를 update합니다.

는 learning rate입니다.



출처


Binary Classification or 0, 1 encoding


Spam Detection: Spam(0) or Ham(1)

Facebook feed: show(0) or hide(1)

Credit Card Faudulent Transaction detection: legitimate(0) or fraud(1)

Radiology: Malignant(0) or Benign tumor(1)

Finance: sell(0) or buy(1)


linear regression을 0과 1사이로 표현


logistic function or sigmoid function


z값이 커지면 g(z)값은 1에 가까워지고,

z값이 작아지면 g(z)값은 0에 가까워집니다.


Linear regression Hypothesis

H(X)=WX에서

logsistic function 추가


z=WX

H(X)=g(z)


Logistic Hypothesis


Transpose는 자료 행렬 형태에 따라 쓰입니다.



출처


tf.contrib.learn


tf.contrib.learn은 다음을 포함하여 머신러닝의 메커니즘을 단순화하는 상위 레벨의 TensorFlow 라이브러리입니다.

  • running training loops
  • running evaluation loops
  • managing data sets
  • managing feeding

tf.contrib.learn은 많은 일반 모델을 정의합니다. 



Basic usage


tf.contrib.learn을 사용하면 linear regression 프로그램이 얼마나 단순해지는지 알 수 있습니다.

import tensorflow as tf
# NumPy is often used to load, manipulate and preprocess data.
import numpy as np

# Declare list of features. We only have one real-valued feature. There are many
# other types of columns that are more complicated and useful.
features
= [tf.contrib.layers.real_valued_column("x", dimension=1)]

# An estimator is the front end to invoke training (fitting) and evaluation
# (inference). There are many predefined types like linear regression,
# logistic regression, linear classification, logistic classification, and
# many neural network classifiers and regressors. The following code
# provides an estimator that does linear regression.
estimator
= tf.contrib.learn.LinearRegressor(feature_columns=features)

# TensorFlow provides many helper methods to read and set up data sets.
# Here we use `numpy_input_fn`. We have to tell the function how many batches
# of data (num_epochs) we want and how big each batch should be.
x
= np.array([1., 2., 3., 4.])
y
= np.array([0., -1., -2., -3.])
input_fn
= tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4,
                                              num_epochs
=1000)

# We can invoke 1000 training steps by invoking the `fit` method and passing the
# training data set.
estimator
.fit(input_fn=input_fn, steps=1000)

# Here we evaluate how well our model did. In a real example, we would want
# to use a separate validation and testing data set to avoid overfitting.
estimator
.evaluate(input_fn=input_fn)

실행 결과는 다음과 같습니다. 

    {'global_step': 1000, 'loss': 1.9650059e-11}



A custom model


tf.contrib.learn은 미리 정의된 모델들만 제공하지 않습니다. TensorFlow에 내장되어 있지 않은 커스텀 모델을 만들 수 있습니다. tf.contrib.learn의 data set, feeding, training 등 높은 수준의 추상화는 유지할 수 있습니다. 설명을 위해, 낮은 수준은 TensorFlow API를 이용하여 linear regression에 대한 equivalent 모델을 구현하는 방법을 나타냅니다.


tf.contrib.leanr을 이용하여 커스텀 모델을 정의하기 위해, tf.contrib.learn.Estimator를 사용해야 합니다. tf.contrib.learn.LinearRegressor는 tf.contrib.learn.Estimator의 서브 클래스입니다. Estimator를 sub-classing하는 대신에 Estimator에 model_fn 함수를 제공합니다. tf.contrib.learn은 prediction, training step, loss를 evaluate할 수 있는 방법을 알려줍니다. 코드는 다음과 같습니다. 

import numpy as np
import tensorflow as tf
# Declare list of features, we only have one real-valued feature
def model(features, labels, mode):
 
# Build a linear model and predict values
  W
= tf.get_variable("W", [1], dtype=tf.float64)
  b
= tf.get_variable("b", [1], dtype=tf.float64)
  y
= W*features['x'] + b
 
# Loss sub-graph
  loss
= tf.reduce_sum(tf.square(y - labels))
 
# Training sub-graph
  global_step
= tf.train.get_global_step()
  optimizer
= tf.train.GradientDescentOptimizer(0.01)
  train
= tf.group(optimizer.minimize(loss),
                   tf
.assign_add(global_step, 1))
 
# ModelFnOps connects subgraphs we built to the
 
# appropriate functionality.
 
return tf.contrib.learn.ModelFnOps(
      mode
=mode, predictions=y,
      loss
= loss,
      train_op
=train)

estimator
= tf.contrib.learn.Estimator(model_fn=model)
# define our data set
x
=np.array([1., 2., 3., 4.])
y
=np.array([0., -1., -2., -3.])
input_fn
= tf.contrib.learn.io.numpy_input_fn({"x": x}, y, 4, num_epochs=1000)

# train
estimator
.fit(input_fn=input_fn, steps=1000)
# evaluate our model
print(estimator.evaluate(input_fn=input_fn, steps=10))

결과는 다음과 같습니다.

{'loss': 5.9819476e-11, 'global_step': 1000}

커스텀 모델 함수의 내용이 낮은 수준 API의 수동 모델 training loop와 얼마나 유사한지 주목하세요.



출처


'머신러닝 > TensorFlow' 카테고리의 다른 글

tf.train API  (0) 2017.03.07
TensorFlow Core tutorial  (0) 2017.02.28
설치하기  (2) 2017.02.21
TensorFlow란?  (0) 2017.02.21

tf.train API


머신러닝의 자세한 이론적 내용은 이 튜토리얼의 범위를 벗어납니다. 그러나 TensorFlow는 loss function을 최소화하기 위해 각 variable을 천천히 변경하는 optimizer를 제공합니다. 가장 간단한 optimizer는 gradient desent 방법입니다. 해당 variable에 대한 loss의 derivative의 magnitude에 따라 각 variable을 수정합니다. 일반적으로 수동으로 symbolic derivative를 계산하는 것은 지루하고 오류가 발생하기 쉽습니다. 결과적으로, TensorFlow는 tf.gradients 함수를 사용하여 model의 description만 제공된 derivative를 자동으로 생성할 수 있습니다. 단순화를 위해 일반적으로 optimizer를 수행합니다. 

optimizer = tf.train.GradientDescentOptimizer(0.01)
train
= optimizer.minimize(loss)
sess.run(init) # reset values to incorrect defaults.
for i in range(1000):
  sess
.run(train, {x:[1,2,3,4], y:[0,-1,-2,-3]})

print(sess.run([W, b]))

최종 model 매개변수가 생성됩니다.

[array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]

이제 실제 머신러닝을 해봤습니다. 이런 간단한 linear regression을 수행한다면 TensorFlow 핵심 코드가 많이 필요하지는 않지만, 좀 더 복잡한 model과  data를 입력하는 method는 더 많은 코드가 필요합니다. 따라서 TensorFlow는 일반적인 패턴, 구조 및 기능에 대해 더 높은 level의 추상화를 제공합니다. 우리는 다음 section에서 이러한 추상화를 사용하는 방법을 배웁니다.


complete program


완성된 training 가능한 linear regression model은 다음과 같습니다.

import numpy as np
import tensorflow as tf

# Model parameters
W
= tf.Variable([.3], tf.float32)
b
= tf.Variable([-.3], tf.float32)
# Model input and output
x
= tf.placeholder(tf.float32)
linear_model
= W * x + b
y
= tf.placeholder(tf.float32)
# loss
loss
= tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer
= tf.train.GradientDescentOptimizer(0.01)
train
= optimizer.minimize(loss)
# training data
x_train
= [1,2,3,4]
y_train
= [0,-1,-2,-3]
# training loop
init
= tf.global_variables_initializer()
sess
= tf.Session()
sess
.run(init) # reset values to wrong
for i in range(1000):
  sess
.run(train, {x:x_train, y:y_train})

# evaluate training accuracy
curr_W
, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

실행하면 다음과 같은 결과를 보여줍니다.

W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11

좀 더 복잡한 이 프로그램은 여전히 TensorBorad에서 시각화 할 수 있습니다.

TensorBoard final model visualization

출처





'머신러닝 > TensorFlow' 카테고리의 다른 글

tf.contrib.learn  (0) 2017.03.08
TensorFlow Core tutorial  (0) 2017.02.28
설치하기  (2) 2017.02.21
TensorFlow란?  (0) 2017.02.21

Tensors


TensorFlow에서 데이터의 중심 단위는 Tensor 입니다. Tensor는 다차원 배열의 primitive value 집합으로 구성됩니다. Tensor의 rank는 차원의 수를 의미합니다. 아래 예제가 있습니다.

3 # a rank 0 tensor; this is a scalar with shape []
[1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]

여기서 primitive value는 숫자나 문자열 같은 원시적인 값들을 의미합니다.


TensorFlow Core tutorial



Importing TensorFlow


TensorFlow 프로그램에 대한 표준 import 방법은 다음과 같습니다.

import tensorflow as tf

이렇게 하면 python에서 TensorFlow의 모든 class, method 및 symbol을 access 할 수 있습니다. as tf는 tensorflow라는 모듈 이름이 길기 때문에 tf로 사용하겠다는 의미입니다.


The Computational Graph


TensorFlow Core 프로그램은 두 개의 섹션으로 구성되어 있다고 할 수 있습니다.

  1. computational graph 빌드
  2. computational graph 실행

Computational graph는 일련의 TensorFlow 작업을 node graph로 배열한 것 입니다. 간단한 computational graph를 작성해 봅시다. 각 node는 0 이상의 tensor를 입력으로 받으며, 출력으로써 tensor를 생성합니다. constant는 node의 type중 하나 입니다. TensorFlow의 constant도 일반적인 constant와 마찬가지로 입력을 받지 않고 내부적으로 저장된 값을 출력합니다. 다음과 같이 두 개의 floating point형 tensor node1과 node2를 만들 수 있습니다.

node1 = tf.constant(3.0, tf.float32)
node2
= tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)

여기서 자료형을 명시하지 않으면 floating point형에 대해서 default값으로 float32 자료형이 설정되는 듯 합니다.

마지막 print 문의 결과는 다음과 같습니다.

Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
우리가 예상하기로는 3.0과 4.0의 출력 이였지만 결과는 그렇지 않습니다. node가 evaluate될 때 3.0, 4.0을 생성합니다. node를 실제로 evaluate할려면 session 내에서 computational graph를 실행해야 합니다. session은 TensorFlow runtime의 control과 state를 캡슐화 합니다.

다음 코드는 session 객체를 만든 다음 run method를 호출하여 node1과 node2를 계산할 수 있는 computational graph를 실행합니다.
session에서 computational graph는 다음과 같습니다.
sess = tf.Session()
print(sess.run([node1, node2]))

우리의 예상과 같이 3.0과 4.0을 볼 수 있습니다.

[3.0, 4.0]

tensor node를 operation과 결합하여 좀 더 복잡한 계산을 할 수 있습니다(operation 또한 node 입니다). 예를 들면, 두 개의 constant node를 add하고 다음과 같이 새로운 graph를 생성할 수 있습니다.

node3 = tf.add(node1, node2)
print("node3: ", node3)
print("sess.run(node3): ",sess.run(node3))

print 두 줄의 결과는 다음과 같습니다.

node3:  Tensor("Add_2:0", shape=(), dtype=float32)
sess
.run(node3):  7.0

첫 번째 print 결과는 node를 session 내에서 실행하지 않았기 때문에 tensor의 속성이 출력 되었습니다.

TensorFlow는 TensorBoard라고 불리는 utility를 제공합니다. 이는 computational graph를 그림으로 나타낼 수 있습니다. 다음은 TensorBoard가 graph를 시각화 하는 방법을 보여주는 스크린샷 입니다.

TensorBoard screenshot

placeholder는 외부 입력을 허용하도록 graph를 매개변수화 할 수 있습니다. placeholder는 값을 나중에 변경할 수 있습니다.

a = tf.placeholder(tf.float32)
b
= tf.placeholder(tf.float32)
adder_node
= a + b  # + provides a shortcut for tf.add(a, b)

두 개의 입력 매개변수(a와 b)를 정의하고 이들에 대한 연산을 정의합니다. feed_dict 매개변수를 사용하여 placeholder에 값을 입력할 수 있습니다. 

print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))

결과는 다음과 같습니다.

7.5
[ 3.  7.]

TensorBoard에서는 다음과 같이 표현됩니다.

TensorBoard screenshot

다른 operation을 추가하여 computational graph를 좀 더 복잡하게 만들 수 있습니다. 예를 들면,

add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, {a: 3, b:4.5}))

결과는 다음과 같습니다.

22.5

이 computational graph는 TensorBoard에서 다음과 같이 표현됩니다.

TensorBoard screenshot

머신러닝에서 우리는 일반적으로 위와 같은 임의의 입력을 받을 수 있는 model을 원할 것입니다. model을 학습 가능하게 만들려면 동일한 입력으로 새로운 출력을 얻기 위해 graph를 수정할 수 있어야 합니다. Variable을 사용하면 graph에 학습 가능한 매개변수를 추가할 수 있습니다. Variable은 타입과 초기값으로 구성됩니다.

W = tf.Variable([.3], tf.float32)
b
= tf.Variable([-.3], tf.float32)
x
= tf.placeholder(tf.float32)
linear_model
= W * x + b

여기서 [.3]은 0.3을 [-.3]은 -0.3을 의미합니다.

constant는 tf.constant를 호출할 때 초기화 되며 값은 절대로 변경될 수 없습니다. 이와 반대로, tf.Variable을 호출하면 variable이 초기화되지 않습니다. TensorFlow 프로그램의 모든 variable을 초기화하려면 다음과 같이 특별한 operation을 명시적으로 호출해야 합니다.

init = tf.global_variables_initializer()
sess
.run(init)

여기서 init은 모든 global variable을 초기화하고 있습니다. sess.run을 호출하기 전까지는 variable은 초기화되지 않습니다. x는 placeholder이므로, 다음과 같이 x의 여러 값에 대해 linear_model을 동시에 evaluate할 수 있습니다.

print(sess.run(linear_model, {x:[1,2,3,4]}))

결과는 다음과 같습니다.

[ 0.          0.30000001  0.60000002  0.90000004]

우리는 model을 만들었지만 이 model이 얼마나 좋은지는 알 수 없습니다. training data에 대해 model을 evaluate해야 합니다. 이는 목표 값을 제공하기 위해 y placeholder가 필요하며, loss function을 추가해야 합니다. 여기서 y는 training data set을 의미합니다. loss function은 cost function과 같은 의미입니다.


loss function은 제공된 data로부터 현재 model이 얼마나 떨어져 있는지를 측정합니다. 표준 loss model인 linear regression을 사용합니다. linear regression은 현재 model과 제공된 data 사이의 delta 제곱을 더해서 계산합니다. linear_model - y는 각 요소가 error delta인 vector를 만듭니다. tf.square를 호출하여 error를 제곱합니다. 그런 다음 모든 제곱 error를 합산하여 단일 scalar를 만듭니다. 이 과정은 tf.reduce_sum을 사용하여 계산할 수 있습니다. training data와 설계한 linear_model과의 차이의 제곱의 합을 계산합니다.

y = tf.placeholder(tf.float32)
squared_deltas
= tf.square(linear_model - y)
loss
= tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))

loss 값은 다음과 같습니다.

23.66

W와 b의 값을 -1에서 1의 값으로 재할당하여 수동으로 향상시킬 수 있습니다. variable은 tf.Variable을 사용하여 제공된 값으로 초기화 되지만, tf.assign operation을 사용하여 변경할 수 있습니다. 예를 들면, W=-1, b=1은 우리 model에 대한 최적의 매개변수 입니다. 이에 따라 W와 b를 변경할 수 있습니다.

fixW = tf.assign(W, [-1.])
fixb
= tf.assign(b, [1.])
sess
.run([fixW, fixb])
print(sess.run(loss, {x:[1,2,3,4], y:[0,-1,-2,-3]}))

마지막 print는 loss가 0임을 보여줍니다.

0.0

우리는 W와 b의 "완벽한" 값을 추측하고 적용하였습니다. 그러나 머신러닝의 요점은 올바른 model의 매개변수를 자동으로 찾는 것 입니다. 다음 섹션에서 이를 수행하는 방법을 보여줍니다.


여기까지 실행 결과 입니다.



소스 코드도 첨부하였습니다.

PythonApplication1.py



출처


'머신러닝 > TensorFlow' 카테고리의 다른 글

tf.contrib.learn  (0) 2017.03.08
tf.train API  (0) 2017.03.07
설치하기  (2) 2017.02.21
TensorFlow란?  (0) 2017.02.21

TensorFlow는 여러 OS를 지원하며 Windows를 공식 지원합니다.


본인은 Windows 10에 설치하였으며,


공식 홈페이지의 설치 가이드를 참고하였습니다.



설치할 TensorFlow를 결정


CPU 혹은 GPU 지원 TensorFlow를 선택해야 합니다.

    • CPU support only. NVIDIA GPU가 없다거나 GPU가 없는 노트북 등의 경우에는 이 버젼으로 설치해야 합니다. 이 버젼이 설치하기 쉽다고 합니다(5~10분 정도 소요). 때문에 NVIDIA GPU가 있더라도 이 버젼으로 설치를 권장하고 있습니다.
    • GPU support. TensorFlow 프로그램은 일반적으로 CPU보다 GPU에서 더 빠르게 수행됩니다. 때문에 GPU 조건을 만족하고 성능이 중요한 프로그램을 실행해야할 경우는 이 버젼으로 설치해야 합니다.


GPU support 요구사항


GPU 지원 TensorFlow를 설치하는 경우 관련 NVIDIA 소프트웨어가 설치되어야 합니다.

    • CUDA® Toolkit 8.0. https://developer.nvidia.com/cuda-downloads에서 Windows 10 버젼으로 다운로드하여 설치하였습니다. local 설치 파일의 경우 용량이 꽤 됩니다(1.3GB). 본인의 Windows 버젼에 따라 다운로드하여 설치하시길 바랍니다. 설치 후 CUDA가 설치되는 경로를 알아둬야 합니다. cuDNN 설치시 필요하기 때문입니다. 본인의 경우는 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 입니다.
    • cuDNN v5.1. https://developer.nvidia.com/cudnn 에서 cuDNN v5.1 for Windows 10을 다운로드 하였습니다. NVIDIA 계정으로 로그인해야 다운 받을 수 있습니다. 계정 가입은 간단한 설문과 이메일 인증을 통해 이루어집니다. 다운로드 받은 파일의 압축을 풀면 cuda 라는 폴더가 있습니다. cuda 폴더 내부에는 bin, include, lib 폴더가 존재합니다. 이 세개의 폴더를 CUDA가 설치된 경로의 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 에 복사하여 덮어쓰면 됩니다.
    • GPU card가 CUDA Compute Capability 3.0 혹은 그 이상을 만족해야 합니다. https://developer.nvidia.com/cuda-gpus 여기서 리스트를 확인할 수 있습니다. 일반적으로 GeForce 제품을 사용하므로 관련 리스트를 확인하시면 됩니다. 본인의 GPU는 GTX 1050이며 Compute Capability 6.1이므로 요구사항에 만족하는 것을 알 수 있습니다.

상기 소프트웨어에 대해 이전 버젼이 설치된 경우는 지정된 버젼으로 업그레이드를 해야 합니다.



TensorFlow 설치 방법 결정


TensorFlow를 설치하는 매커니즘을 선택해야 합니다.

    • "native" pip
    • Anaconda

Native pip는 가상 환경을 이용하지 않고 시스템에 TensorFlow를 직접 설치합니다. Native pip를 설치하면 어떤 디렉토리에서도 TensorFlow 프로그램을 실행할 수 있습니다.


Anaconda는 가상 환경을 이용합니다. 

Anaconda는 Continuum Analytics라는 곳에서 만든 Python 배포판으로, 여러가지 패키지(수학, 과학 등)를 포함하고 있습니다. 가상 환경을 이용하기 때문에 다른 패키지끼리의 충돌이나 다른 버전으로 인한 충돌을 막아준다고 합니다.

NOTE: TensorFlow는 anaconda 패키지를 테스트하거나 유지 관리하지 않습니다. Anaconda에 의해 발생되는 문제 등은 책임질 수 없다는 의미 같습니다. 


많은 사용자들이 Windows 환경에서 anaconda를 이용하여 TensorFlow를 설치하는 것으로 보입니다. 본인은 native pip으로 설치를 진행하겠습니다.



native pip로 설치하기


Python 3.5.x 버전을 설치해야 합니다.

TensorFlow는 Windows 환경에서 오직 3.5.x 버젼의 python만을 지원합니다. 


TensorFlow를 설치하려면 터미널을 실행해야 합니다. 터미널에서 아래와 같은 명령을 실행해야 합니다. Python을 설치하실때 Add Pyhon 3.5 to PATH를 체크하셔야 터미널에서 pip3 명령을 수행할 수 있습니다. TensorFlow CPU 전용 버전을 설치하려면 아래와 같이 명령을 입력해야 합니다.

C:\> pip3 install --upgrade tensorflow

GPU 버젼을 설치하려면 아래와 같은 명령을 입력해야 합니다.

C:\> pip3 install --upgrade tensorflow-gpu

본인은 GPU 버젼으로 설치하였습니다.



TensorFlow가 성공적으로 설치되었다면 위와 같은 화면이 나와야 합니다.


설치확인


TensorFlow가 제대로 설치되었는지 유효성을 검사할 수 있습니다.


1. 터미널을 실행합니다.

2. Anaconda를 통해 설치한 경우 Anaconda 환경을 활성화합니다.

3. 터미널에서 Python을 실행합니다.

  1. C:> python 

4. Python shell에서 다음을 입력합니다.

  1. >>> import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello))

Python 프로그램이 아래와 같은 output을 출력한다면 성공적으로 설치된 것입니다. 

Hello, TensorFlow!


아래와 같이 오류가 발생한다면 MSVCP140.DLL 파일이 없기 때문입니다.

    • No module named "_pywrap_tensorflow"

    • DLL load failed.

Visual C++ 2015 redistributable 을 설치해주셔야 합니다.




출처


'머신러닝 > TensorFlow' 카테고리의 다른 글

tf.contrib.learn  (0) 2017.03.08
tf.train API  (0) 2017.03.07
TensorFlow Core tutorial  (0) 2017.02.28
TensorFlow란?  (0) 2017.02.21

+ Recent posts