튜토리얼은 따라 가겠는데... 전혀 감이 안잡힌다... 그래서 Get started 다음에 있는

프로그래머 가이드 부분에서부터 다시 시작하겠습니다.


Variables: Creation, Initialization, Saving, and Loading

변수 : 생성, 초기화, 저장 및로드

당신이 모델을 학습 할 때 보유 할 변수 및 업데이트 매개 변수를 사용합니다. 변수 텐서를 함유하는 버퍼 메모리에 있습니다.
명시 적으로 초기화해야하며 교육 도중 및 후에 디스크에 저장할 수 있습니다. 나중에 저장된 값을 복원하여 모델을 연습하거나 분석 할 수 있습니다.

이 문서는 다음 TensorFlow 클래스를 참조합니다. API에 대한 전체 설명은 참조 설명서 링크를 참조하십시오.

Creation (창조)

변수를 만들면 초기 값으로 Tensor를 Variable () 생성자에 전달합니다. TensorFlow는 상수 또는 임의 값에서 초기화에 자주 사용되는 텐서를 생성하는 연산 모음을 제공합니다.


이러한 모든 작업에는 텐서의 모양을 지정해야합니다. 그 모양은 자동으로 변수의 모양이됩니다.

변수는 일반적으로 고정 된 모양을 갖지만 TensorFlow는 변수를 변경하는 고급 메커니즘을 제공합니다.

# Create two variables.
weights
= tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name
="weights")
biases
= tf.Variable(tf.zeros([200]), name="biases")

tf.Variable ()을 호출하면 그래프에 몇 가지 연산이 추가됩니다.

  • 변수 값을 보유하는 변수 op.
  • 변수를 초기 값으로 설정하는 이니셜 라이저 op. 이것은 실제로 tf.assign op입니다.
  • 예제의 biases 변수에 대한 0과 같은 초기 값에 대한 연산도 그래프에 추가됩니다.

tf.Variable () 값에 의해 반환되는 값은 Python 클래스 tf.Variable의 인스턴스입니다.

Device placement

변수는 with tf.device (...) : 블록을 사용하여 특정 장치가 생성 될 때 특정 장치에 고정 될 수 있습니다.

# Pin a variable to CPU.
with tf.device("/cpu:0"):
  v
= tf.Variable(...)

# Pin a variable to GPU.
with tf.device("/gpu:0"):
  v
= tf.Variable(...)

# Pin a variable to a particular parameter server task.
with tf.device("/job:ps/task:7"):
  v
= tf.Variable(...)

NOTE 

tf.Variable.assign 및 tf.train.Optimizer의 매개 변수 업데이트 작업과 같은 변수를 변경하는 작업은 변수와 동일한 장치에서 실행해야합니다. 호환되지 않는 장치 배치 지시문은 이러한 작업을 생성 할 때 무시됩니다.

장치 배치는 복제 된 설정에서 실행할 때 특히 중요합니다. 복제 된 모델의 장치 구성을 단순화 할 수있는 장치 기능에 대한 자세한 내용은 tf.train.replica_device_setter 를 참조하십시오.

Initialization(초기화)

변수 이니셜 라이저(초기화)는 모델의 다른 작업을 실행하기 전에 명시 적으로 실행해야합니다. 가장 쉬운 방법은 모든 변수 이니셜 라이저(초기화)를 실행하는 op를 추가하고 모델을 사용하기 전에 해당 op를 실행하는 것입니다.


또는 체크 포인트 파일에서 변수 값을 복원 할 수도 있습니다 (아래 참조).


변수 이니셜 라이저를 실행할 op를 추가하려면 tf.global_variables_initializer ()를 사용하십시오. 모델을 완전히 구성하고 세션에서 시작한 후에 만 ​​op를 실행하십시오.

# Create two variables.
weights
= tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name
="weights")
biases
= tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op
= tf.global_variables_initializer()

# Later, when launching the model
with tf.Session() as sess:
 
# Run the init operation.
  sess
.run(init_op)
 
...
 
# Use the model
 
...

Initialization from another Variable (다른 변수로부터의 초기화)

때때로 다른 변수의 초기 값에서 변수를 초기화해야합니다. tf.global_variables_initializer ()가 추가 한 연산은 모든 변수를 병렬로 초기화하므로 필요할 때 조심해야합니다.

다른 변수의 값에서 새 변수를 초기화하려면 다른 변수의 initialized_value () 속성을 사용하십시오. 초기화 된 값을 새 변수의 초기 값으로 직접 사용할 수도 있고 다른 변수로 사용하여 새 변수의 값을 계산할 수도 있습니다.

# Create a variable with a random value.
weights
= tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name
="weights")
# Create another variable with the same value as 'weights'.
w2
= tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice
= tf.Variable(weights.initialized_value() * 2.0, name="w_twice")

Custom Initialization(사용자 정의 초기화)

편의 함수 tf.global_variables_initializer ()는 op를 추가하여 모델의 모든 변수를 초기화합니다. 변수의 명시적인 목록을 전달하여 tf.variables_initializer로 초기화 할 수도 있습니다. 변수가 초기화되었는지 확인하는 것을 포함하여 다른 옵션에 대해서는 변수 설명서( Variables Documentation)를 참조하십시오.

Saving and Restoring (저장 및 복원)

모델을 저장하고 복원하는 가장 쉬운 방법은 tf.train.Saver 객체를 사용하는 것입니다. 생성자는 그래프의 모든 변수 또는 지정된 목록의 그래프에 저장 및 복원 작업을 추가합니다. saver 객체는 이러한 ops를 실행하고 체크 포인트 파일에 대한 쓰기 또는 읽기 경로를 지정하는 메서드를 제공합니다.

그래프가없는 모델 체크 포인트를 복원하려면 먼저 메타 그래프 파일에서 그래프를 가져와야합니다 (일반적인 확장자는 .meta 임). 이것은 tf.train.import_meta_graph를 사용하여 수행됩니다.이 그래프는 복원을 수행 할 수있는 Saver를 반환합니다.

+meta 데이터 파일이 그래프라고 합니다.... 이제까지 pb가 그래프인줄 알고 있었는데... ㅎㅎㅎ 역시 기초가 탄탄해야 하는 것 같습니다.

Checkpoint Files

변수는 대개 변수 이름에서 텐서 값까지의 맵을 포함하는 바이너리 파일에 저장됩니다.

Saver 개체를 만들 때 검사 점 파일에서 변수의 이름을 선택적으로 선택할 수 있습니다. 기본적으로 각 변수에 대해 tf.Variable.name 속성 값을 사용합니다.

체크 포인트에있는 변수를 이해하려면 inspect_checkpoint 라이브러리, 특히 print_tensors_in_checkpoint_file 함수를 사용할 수 있습니다.

Saving Variables (변수 저장하기)

모델의 모든 변수를 관리하려면 tf.train.Saver ()를 사용하여 Saver를 작성하십시오.

# Create some variables.
v1
= tf.Variable(..., name="v1")
v2
= tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op
= tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver
= tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
  sess
.run(init_op)
 
# Do some work with the model.
 
..
 
# Save the variables to disk.
  save_path
= saver.save(sess, "/tmp/model.ckpt")
 
print("Model saved in file: %s" % save_path)

Restoring Variables(변수 복원)

동일한 Saver 개체가 변수를 복원하는 데 사용됩니다. 파일에서 변수를 복원 할 때는 미리 변수를 초기화 할 필요가 없습니다.

# Create some variables.
v1
= tf.Variable(..., name="v1")
v2
= tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver
= tf.train.Saver()

# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
 
# Restore variables from disk.
  saver
.restore(sess, "/tmp/model.ckpt")
 
print("Model restored.")
 
# Do some work with the model
 
...

Choosing which Variables to Save and Restore (저장 및 복원 할 변수 선택)

tf.train.Saver ()에 인수를 전달하지 않으면 세이버는 그래프의 모든 변수를 처리합니다. 이들 각각은 변수가 생성 될 때 전달 된 이름으로 저장됩니다.

검사 점 파일에서 변수의 이름을 명시 적으로 지정하는 것이 유용한 경우가 있습니다. 예를 들어 "weights"라는 이름의 변수를 가진 모델을 교육했을 수도 있습니다.이 변수의 값은 "params"라는 새 변수에 복원하려는 값입니다.

또한 모델에 사용되는 변수의 하위 집합 만 저장하거나 복원하는 것이 유용한 경우도 있습니다. 예를 들어 5 개의 레이어가있는 신경망을 훈련했을 수 있습니다. 이제 6 개의 레이어로 새 모델을 학습하고 이전에 학습 된 모델의 5 개 레이어에서 새 모델의 처음 5 개 레이어로 매개 변수를 복원 할 수 있습니다.

tf.train.Saver () 생성자에 파이썬 사전을 전달하여 저장할 이름과 변수를 쉽게 지정할 수 있습니다. keys는 사용할 이름이고, value는 관리 할 변수입니다.

Notes:

- 모델 변수의 여러 하위 집합을 저장하고 복원해야하는 경우 원하는만큼의 보호기 개체를 만들 수 있습니다. 동일한 변수가 여러 세이버 객체에 나열 될 수 있으며 세이버 restore () 메소드가 실행될 때만 해당 값이 변경됩니다.

- 세션 시작시 모델 변수의 하위 집합 만 복원하는 경우 다른 변수에 대해 초기화 연산을 실행해야합니다. 자세한 정보는  tf.variables_initializer를 참조하십시오.

# Create some variables.
v1
= tf.Variable(..., name="v1")
v2
= tf.Variable(..., name="v2")
...
# Add ops to save and restore only 'v2' using the name "my_v2"
saver
= tf.train.Saver({"my_v2": v2})
# Use the saver object normally after that.
...




나는 안드로이드에 @Override 의 목적을 알고 싶어요.

1.


자바 주석을 @Override. 다음과 같은 방법을 다치게 컴파일러는 슈퍼 클래스의 메소드를 오버라이드 (override) 지시합니다. 예를 들어, 당신은 Person 클래스를 구현 말한다.

public class Person {
   public final String firstName;
   public final String lastName;

   //some methods

   @Override public boolean equals(Object other) {
      ...
   }
}

Person 클래스() 메소드가 있습니다. equals 메소드는 이미 사람의 슈퍼 클래스 객체에 정의되어 있습니다.

따라서 equlas 구현 () 명 public ()을 재정의한다. 즉,  (사람)를 재정의합니다.


명시적으로 재정의하지 않고 메서드를 재정의하는 것이 합법적입니다. 

따라서 @Override의 주석이 무엇을 의미합니까?

실수로 다음과 같은 방식으로 재정의하려고 하면 어떻게 됩니까?

public boolean equals(Person other) {
   ...
}

위의 경우에는 버그가 있다. 당신은 동등하게 재정의하려 했지만 당신은 그렇지 않았다.

왜요? () 같은 등식은 매개 변수를 매개 변수로 얻고 당신의 equals()을 매개 변수로 얻는다.


컴파일러가 당신이 오버 라이드 하고 싶어 하는 것을 알지 못했기 때문에 컴파일러는 당신에게 그 버그에 대해 알려 주지 않을 것이다.


컴파일러가 알 수 있는 한, 당신은 실제로 과부하를 의미한다. 


하지만 재정의를 사용하려고 시도한 경우에는 다음과 같은 항목을 사용합니다.

@Override public boolean equals(Person other) {
   ...
}

이제 컴파일러는 오류가 있다는 것을 알고 있다. 너는 무시하고 싶었지만 그렇지 않았다. 

따라서@재정의 주석을 사용하는 이유는 방법을 명시적으로 선언하는 것입니다.




2.

컴파일러가 super class에서 메서드를 재정의하도록 고안되었음을 컴파일러에게 알려 주는 자바 주석은 말할 것도 없다. 그것은 엄격히 필요하지는 않지만 컴파일 시 오류를 잡아내는 데 도움이 된다.


3.

@Override는 자바 스크립트입니다.

또한 슈퍼 클래스의 메소드 선언을 오버라이드 (override)하는 상처를 메소드 선언을 나타냅니다. 방법이 주석 형의 주석을 붙일 수 있지만, 슈퍼 클래스 메소드를 오버라이드 (override)하지 않는 경우, 컴파일러는 오류 메시지를 생성해야합니다.


Example:

class Parent{
    public void foo(){

    }
}

class Child extends Parent{
    //compile perfect !
    @override
    public void foo(){

    }
    //will show compile time error message here as it is not being overridden 
    @override
    public void foo(int i){

    }

}



출처 : https://stackoverflow.com/questions/4736212/meaning-of-android-override

이 게시글은 기계 학습과 기계 학습 모두에 새롭게 등장하는 독자를 위한 것입니다.


MNIST가 무엇인지 이미 알고 있다면 softmax( multinomial logistic)회귀이 무엇인지를 알 수 있으며, 이는 보다 빠른 속도의 자습서를 선호할 수 있습니다.


튜토리얼을 시작하기 전에 반드시 TensorFlow를 설치해야 합니다.


프로그래밍하는 법을 배울 때,"HelloWorld"는 "HelloWorld"를 인쇄하는 것과 같은 전통을 가지고 있습니다. 프로그래밍이 HelloWorld를 하는 것은 이번 튜토리얼과 같은 문맥입니다.


MNIST는 간단한 컴퓨터 비전 데이터 세트입니다. 이는 다음과 같이 손으로 작성한 숫자의 이미지로 구성됩니다.


또한 각 이미지에 대한 라벨이 포함되어 있으며, 각 이미지에 해당하는 숫자를 알려 줍니다.

 예를 들어 위 이미지의 레이블은 5,0,4,1입니다.


이 튜토리얼에서, 우리는 이미지를 관찰하고 그들이 어떤 숫자인지 예측할 수 있도록 모델을 훈련시킬 것입니다.

우리의 목표는 최첨단 성능을 발휘하는 정교한 모델을 훈련시키는 것이 아니라, 나중에 할 수 있도록 코드를 부여하는 것입니다!--하지만 발가락을 사용하여 발가락 부분을 찍는 것이 낫다. 

이와 같이 우리는 매우 단순한 모델로 시작할 것입니다. 바로 Softmax 회귀라는 회귀 모델입니다.


+ 즉, 나중에 훈련시킨 모델들을 가져오는 원리들을 파악 및 softmax 회귀 모델을 알아가는 부분인 것 같습니다.


이 튜토리얼의 실제 코드는 매우 짧으며, 모든 재미 있는 것들은 세줄로 되어 있습니다.하지만, 그것 이면의 아이디어들을 이해하는 것은 매우 중요하다.이것 때문에, 우리는 매우 신중하게 코드를 완성할 것입니다.


본 자습서는 mnist_softmax.py 라인 코드에서 발생하는 일련의 설명, 라인별로 설명합니다.


본 자습서는 다음을 비롯하여 몇가지 다른 방법으로 사용할 수 있습니다.

1) 각 줄의 설명을 통해 읽을 수 있는 대로 각 코드를 라인별로 구분하여 라인 업으로 복사하고 붙여 넣으십시오.

2) 설명서를 읽기 전에 전체 mnist_softmax.py Python 파일을 실행하고 이 자습서를 사용하여 명확하지 않은 코드를 이해할 수 있도록 합니다.


수행할 내용:

1)데이터 중복 제거 기술에 대한 자세한 내용 및 데이터 중복 제거 기술에 대해 알아보기.

2)이미지의 모든 픽셀을 보는 데 기반하여 자릿수를 인식하는 기능을 생성합니다.

3)TensorFlow를 사용하여 모델을 " 보기"로 인식하여 모델을 식별하고, 수천개의 예제를 실행할 수 있도록 합니다.

4)테스트 데이터를 통해 모델의 정확도를 점검하십시오.

The MNIST Data

MNIST 데이터는 Yann LeCun의 웹 사이트에서 호스팅 됩니다.

이 자습서에서 코드를 복사하고 붙여 넣는 경우, 여기서 데이터를 자동으로 다운로드하고 읽을 수 있는 코드 두줄로 시작하십시오.

from tensorflow.examples.tutorials.mnist import input_data
mnist
= input_data.read_data_sets("MNIST_data/", one_hot=True)

MNIST 데이터는 세 부분으로 나뉩니다. 즉, 교육 데이터의 55,000개의 데이터 포인트( mnist.train), 테스트 데이터의 10,000포인트( mnist.test), 검증 데이터의 5,000포인트( mnist.validation)등이 있습니다.

이 세분류는 매우 중요합니다. 우리가 배워야 할 것은 우리가 배우지 못한 것을 확실히 할 수 있는 별개의 데이터를 가지고 있다는 것입니다.


앞서 언급한 바와 같이, 모든 MNIST 데이터 포인트에는 두개의 파트가 있습니다. 즉, 손으로 작성한 숫자와 해당 라벨의 이미지입니다.

우리는 이미지"x"와 라벨"y"를 부를 것입니다. 교육 세트 및 테스트 세트에는 이미지 및 해당 라벨이 모두 포함되어 있습니다. 예를 들어 교육용 이미지는 mnist.train.images이며, 교육용 레이블은 mnist.train.labels.입니다.


각 이미지는 28픽셀 x28픽셀입니다. NAT은 다음과 같은 다양한 수치로 해석할 수 있습니다.


우리는 이 배열을 28x28의 벡터의 벡터로 평평하게 만들 수 있다. 우리가 이미지들 사이에 일관성을 유지하는 한, 우리가 어떻게 배열할지는 중요하지 않습니다.

이러한 관점에서 볼 때, MNIST 이미지는 매우 풍부한 구조(경고:시각화 집약적 시각화)를 가진 벡터 기반 벡터 공간의 수많은 포인트일 뿐입니다.


평평한 데이터에서 이미지의 2D구조에 대한 정보가 삭제됩니다. 최고의 컴퓨터 비전 방법은 이 구조를 이용하는 거죠. 그리고 우리는 나중에 튜토리얼을 쓸 것입니다. 그러나 우리가 여기서 사용할 간단한 방법은 다음과 같습니다.


결과적으로 mnist.train.images는 55000( n-dimensional, 784, ])의 텐서이다. 첫번째 차원은 영상 목록에 있는 색인이며 두번째 차원은 각 영상의 각 픽셀에 대한 인덱스입니다.텐서( tensor)의 각 항목은 특정 영상의 특정 화소에 대해 0과 1사이의 화소 강도이다.

각 그림 MNIST의 각 이미지에는 해당 이미지에 그려진 숫자를 나타내는 0~9사이의 숫자가 있습니다.


본 자습서를 위해 저희는 라벨을 "one-hot 벡터"라고 부르고자 합니다. 벡터 기반 벡터는 대부분의 차원에서 0이며, 단일 차원의 1차원이다. 이 경우 n번째 숫자는 n번째 치수의 1개의 벡터로 표현됩니다.예를 들어, 3은[0,0,0,0,0,0,0,0,0,0]입니다. 결과적으로 mnist.train.labels는[ 55000,10]kg의 부동 소수 점 배열이다.

우리는 이제 실제로 모델을 만들 준비가 됐어요!


Softmax Regressions

파이썬을 사용하여 효율적인 숫자 계산을 하기 위해서, 우리는 보통 Python곱셈기와 같은 비싼 작업을 하는 NumPy 같은 라이버리을 사용한다. 다른 언어로 구현된 매우 효율적인 코드이다.

불행히도, 모든 운영 체제로 전환하는 데는 여전히 많은 오버 헤드가 존재할 수 있습니다.

이 오버 헤드는 특히 데이터 전송에 높은 비용이 들 수 있는 분산된 방식이나 분산된 방식으로 계산하려는 경우에 특히 나쁩니다.


TensorFlow는 또한 Python을 없애기 위해 많은 노력을 하지만, 이러한 오버 헤드를 피하기 위해 한 걸음 더 나아 간다.

Python은 파이썬을 사용하여 독립적으로 운영하는 것을 대신하는 대신에 파이선을 사용하여 운영되는 상호 작용 작업의 그래프에 대해 설명합니다.(이와 같은 접근 방식은 몇개의 기계 학습 라이브러리에서 볼 수 있습니다.)


TensorFlow를 사용하려면 먼저 가져와야 합니다.

import tensorflow as tf
import tensorflow as tf

우리는 상징적 변수를 조작하여 이러한 상호 작용 운영을 설명한다. 다음을 생성합니다.

x = tf.placeholder(tf.float32, [None, 784])

x는 특정한 가치가 아니다. 이것은 자리 표시자입니다. 우리가 계산대에서 계산할 때 우리가 입력할 가치가 있는 값입니다.

우리는 각각의 MNIST 이미지들을 784-dimensional 벡터로 바꿀 수 있는 숫자를 입력할 수 있기를 원합니다.

우리는 이것을 부동 소수 점 이하의 부동 소수 점 숫자의 2차원 텐서( 784)로 표현한다. (여기서는 치수가 어떤 길이라도 될 수 있음을 의미한다.)

우리는 또한 모델에 대한 체중(Weights)과 편견(Biases)이 필요합니다. 우리는 이것들을 추가 투입하는 것을 상상할 수 있지만, TensorFlow는 그것을 다루는 더 나은 방법을 가지고 있습니다. Variable

Variable는 상호 작용의 상호 작용에 대한 TensorFlow의 그래프에서 수정 가능한 수정 가능한 텐서이다.

그것은 계산에 의해 사용되고 심지어 수정될 수도 있다. 기계 학습 애플리케이션의 경우 일반적으로 모델 매개 변수는 변수 변수가 됩니다.

W = tf.Variable(tf.zeros([784, 10]))
b
= tf.Variable(tf.zeros([10]))

우리는 변수의 초기 값을 tf.Variable의 초기 값으로 줌으로써 이 변수를 생성합니다. 이 경우에는 W과 b을 tf.zeros 0으로 나눕니다.

우리는 W와 b를 배울 것이기 때문에, 그것들이 처음에는 그다지 중요하지 않다.


W는[ 784,10]의 형태를 가지고 있습니다. 왜냐하면 우리는 벡터의 벡터 벡터를 곱하기 위해 다른 등급의 벡터 벡터를 생성하기 위해 벡터 벡터를 곱하고 싶습니다.b는 출력에 추가할 수 있도록[10]의 모양을 가지고 있다.

이제 모델을 구현할 수 있습니다. 그것을 정의하는데 한줄만 걸려요!

y = tf.nn.softmax(tf.matmul(x, W) + b)

첫째로, 우리는 x, W, W의 표현으로 x를 곱합니다.

이것은 우리가 곱셈 부호를 가지고 있는 우리의 방정식으로, 우리가 여러개의 입력을 가진 2D텐서를 다루는 작은 속임수로 우리의 방정식에 넣은 것에서 힌트를 얻었다.

그리고 나서 우리는 b를 추가하고, 마침내 tf.nn.softmax.를 적용한다.

바로 그거에요. 몇번의 짧은 설치 후에 모델을 정의할 수 있는 선이 하나밖에 없었습니다.

그것은 TensorFlow가 특별히 쉽게 회귀할 수 있도록 설계되었기 때문이 아니다.

그것은 기계 학습 모델에서부터 물리학 시뮬레이션에 이르기까지 많은 숫자의 수치 연산을 묘사하는 매우 유연한 방법입니다.

그리고 일단 정의된 대로, 우리의 모델은 컴퓨터의 CPU, GPUs, 심지어는 심지어 전화기로도 작동할 수 있습니다!

Training

모델을 훈련시키기 위해서, 우리는 모델이 좋은 것이 무엇인지를 의미하는 것을 정의해야 합니다.

실제로, 기계 학습에서는 전형적으로 모델이 나쁘다는 것을 의미합니다.

우리는 이것을 원가 혹은 손실이라 부르며, 그것은 우리의 모델이 원하는 결과로부터 얼마나 멀리 떨어져 있는지를 나타냅니다.

우리는 에러를 최소화하려고 합니다. 에러 마진이 적을수록 우리의 모델은 더 좋습니다.

모델의 분실을 결정하기 위한 매우 일반적이고 매우 훌륭한 기능은 "cross-entropy"라고 불립니다.

정보 이론은 정보 이론에서 정보 압축 코드에 대해 생각하는 것에서 기인하지만, 도박에서부터 기계 학습에 이르기까지 많은 분야에서 중요한 아이디어가 된다. 다음과 같이 정의됩니다.


여기서 y는 예측 가능한 확률 분포이며 y ′는 실제 분포(자릿수 라벨을 사용한 one-hot 벡터)이다.

대략적으로, cross-entropy는 우리의 예측이 진실을 설명하는 데 얼마나 비효율적인지를 측정하고 있다.

cross-entropy에 대한 자세한 내용은 본 자습서의 범위를 벗어나지만 이해할 만한 가치가 충분히 있습니다.


cross-entropy를 구현하려면 먼저 새 자리 표시자를 추가하여 올바른 답을 입력해야 합니다.

y_ = tf.placeholder(tf.float32, [None, 10])

우리는 cross-entropy 기능을 구현할 수 있다. ylog(y):

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

첫째, tf.log는 y의 각 요소의 대수를 계산한다. 다음으로 y-y의 원소를 곱하고 y^y(y)와 같은 원소를 곱한다.

그런 다음 tf.reduce_sum는 reduction_indices=[1 매개 변수로 인해 y의 두번째 치수에 해당하는 요소를 추가합니다.

마지막으로, tf.reduce_mean는 배치의 모든 예제에 대한 평균을 계산합니다.


소스 코드에서는 이 공식을 사용하지 않습니다. 숫자가 불안정하기 때문입니다. 그 대신에 unnormalized(x, W)+b(x, W)에 softmax_cross_entropy_with_logits를 tf.nn.softmax_cross_entropy_with_logits에 적용한다.

이는 보다 수치적으로 안정적인 기능을 통해 내부적으로 softmax 활성화를 계산합니다. 코드를 사용하는 경우 대신 tf.nn.softmax_cross_entropy_with_logits를 사용하는 것을 고려해 보십시오.


이제 우리가 원하는 것이 무엇인지 알 수 있으므로, 우리가 그것을 하기 위해 TensorFlow를 훈련시키는 것은 매우 쉬워요.

왜냐하면 TensorFlow는 당신의 계산의 전체 그래프를 알고 있기 때문입니다. 자동화 알고리즘을 사용하여 변수가 손실되는 손실에 어떻게 영향을 미치는지 효율적으로 결정할 수 있습니다.

그런 다음 최적화 알고리즘을 적용하여 변수를 수정하고 손실을 줄일 수 있습니다.

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

이 경우에, 우리는 TensorFlow에게 0.5의 학습 속도로 구배 하강 알고리즘을 사용하여 cross_entropy를 최소화할 것을 요청한다.경사 하강은 간단한 절차입니다. 여기서 TensorFlow는 단순히 각 변수를 비용을 감소시키는 방향으로 조금씩 돌립니다. 하지만 TensorFlow는 여러가지 다른 최적화 알고리즘을 제공합니다. 만약 한개만 한다면 하나의 선을 조정하는 것만큼 간단합니다.


TensorFlow가 실제로 여기서 수행하는 것은 backpropagation와 경사도 하강을 구현하는 그래프에 새로운 연산을 추가하는 것입니다. 그런 다음, 단일 작업을 수행합니다. 단, 작동 시 기울기 하강 훈련을 수행하여 변수를 약간 수정하고 손실을 줄입니다.


이제 InteractiveSession에서 모델을 시작할 수 있습니다.

sess = tf.InteractiveSession()

먼저 생성한 변수를 초기화하기 위한 작업을 생성해야 합니다.

tf.global_variables_initializer().run()

훈련을 시작합시다--훈련 스텝은 1000번입니다!

for _ in range(1000):
  batch_xs
, batch_ys = mnist.train.next_batch(100)
  sess
.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

각 단계마다 100개의 무작위 데이터 포인트가 배치되어 있습니다. 교육 세트에서 백개의 랜덤 데이터 포인트를 얻을 수 있습니다. 우리는 배치 데이터에서 자리 표시자를 대체하기 위해 train_step 데이터를 실행한다.


무작위 데이터의 소량 배치를 확률적 훈련이라 부르며 이 경우 확률적 경사 하강 하강이다. 이상적으로는, 우리는 모든 훈련 과정을 위해 모든 데이터를 사용하고 싶습니다. 왜냐하면 우리는 우리가 해야 할 일을 더 잘 이해할 수 있기 때문입니다. 하지만 그것은 비쌉니다. 따라서, 우리는 매번마다 다른 하위 집합을 사용합니다. 이것을 하는 것은 싸고 이로운 점도 많다.

Evaluating Our Model

우리의 모델은 얼마나 잘 되나요?

글쎄요, 우선 정확한 라벨을 어디에 뒀는지 알아냅시다. tf.argmax는 어떤 축을 따라 가장 높은 진입률의 지수를 나타내는 매우 유용한 기능이다. 예를 들어, tf.argmax(y, 1)은 각 입력에 대해 가장 가능성이 높은 라벨이며, tf.argmax(y_, 1)은 정확한 라벨로 표시된다. 우리는 우리의 예측이 진실과 일치하는지를 확인하기 위해 tf.equal를 사용할 수 있다.

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

그것은 우리에게 booleans 리스트를 제공한다. 정확한 비율을 결정하기 위해, 우리는 부동 소수 점 숫자를 선택한 다음 평균을 취한다. 예를 들어,[True, False, True, True]는 0.75가 될[1,0,1,1]이 됩니다.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

마지막으로, 우리는 우리의 시험 데이타에 대한 정확성을 요구한다.

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

이는 약 92%여야 합니다.

good ? 어떤가요? 글쎄, 그렇진 않아. 사실, 그것은 꽤나 나빠요. 이것은 우리가 매우 단순한 모델을 사용하고 있기 때문입니다.

약간의 깊이를 가지고 있으면 97%까지 갈 수 있어요. 최고의 모델들은 99.7%이상의 정확도를 달성할 수 있습니다! ( 자세한 내용은 이 결과 목록을 참조하십시오.)


중요한 것은 우리가 이 모델에서 배운 것입니다. 그럼에도 불구하고, 만약 여러분이 이러한 결과에 대해 조금 더 우울하다면, 우리가 훨씬 더 잘하는 다음 튜토리얼을 통해 더 정교한 모델을 만드는 방법을 배워 보세요!



출처 : https://www.tensorflow.org/get_started/mnist/beginners


추후 다음 튜토리얼을 하기 전에 실제 돌린 장면을 포함해서 올리도록 하겠습니다.


Windows10에서 사용자 프로필 폴더의 이름을 변경하는 방법 (C:\Users\Username)


윈도우에서 사용자들이 종종 C : \ Users의 프로필 폴더 이름을 바꾸는 방법을 묻습니다.

혹은 회사에서 사원이 바뀌었을 떄, 계정은 바꾸어서 주었지만,

실제 C드라이브 사용자 폴더에는 기존 사용자의 이름이 적혀있는 경우가 있습니다.


How to rename the user account profile folder in Windows 10

이 방법은 Windows10(윈도우 10):홈, Pro또는 EnterpriseEdition과 연동되지만 시스템에 손상을 입힐 수 있습니다.

따라서, 이 방법을 시도하기 전에 전체 시스템 백업을 생성해야 합니다.


제가 해본 경험상... 바로가기 파일들 빼고는 정상작동 되었습니다... 


변경 방법을 알려드리겠습니다. 



1. 다른 관리자 계정이 있는지 확인하십시오. 이렇게 하지 않으면 관리자(administrator)라는 내장형 사용자를 임시로 활성화할 수 있습니다.


윈도우 키 -> cmd -> 명령프로토콜 (오른쪽 클릭) -> 해당 폴더 열기 ->

 명령 프로토콜 (오른쪽 클릭) -> 관리자 권한으로 실행



명령창에 아래 명령어 실행.

net user administrator /active:yes


영어 및 한국어가 아닌 버전의 Windows 10을 사용하는 경우 관리자 계정 이름이 달라집니다. 예를 들어 프랑스어 버전의 경우 기본 제공 관리 계정의 사용자 이름은 "Administradur"이며 스페인어 인 "Administrador"입니다. 따라서 정확한 사용자 이름을 지정해야합니다. 그렇지 않으면 "사용자 이름을 찾을 수 없습니다"라는 오류 메시지가 나타납니다! 올바른 사용자 이름을 찾으려면 명령 줄 창에서 net user를 입력하고 Enter 키를 누릅니다.


2. PC 사용자 로그아웃을 하거나 PC를 재부팅합니다.


3 다른 계정에 로그인: Administrator

별도의 비밀번호 없이 로그인이 됩니다.


4.사용자 폴더(기본 값으로 C:\Users)로 이동하여 사용자 폴더의 이름을 원하는 대로 변경합니다.



5. 레지스트리 편집기 시작:

(윈도우 키 + R ) -> regedit -> OK


HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\

방금 이름을 변경한 프로파일과 관련된 키를 찾은 다음 ProfileImagePath 값을 찾아 새 경로의 이름을 변경합니다.



6. 추가 단계. 경로를 프로파일로 변경 한 후에 오류가 발생하면 수행하십시오. 

레지스트리에서 '이전 계정 이름'을 검색하십시오. 이전 경로로 값을 찾으면 새로운 값으로 변경하십시오.

이전 경로가 포함 된 모든 항목을 수정할 때까지 레지스트리 편집기에서 "F3"키를 누르십시오.


7. 다시 원래의 계정으로 로그인해서 1번의 항목을 반복합니다.

net user administrator /active:no




참조 및 출처 

http://tunecomp.net/rename-user-profile-folder-in-windows-10-c-users/



Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.


Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.

요청에 의해 호출된 앱에서 다양한 섹션(탐색 드로어에 있는)을 선택할 때마다 다양한 종류의 Content URIs가 반환됩니다.

갤러리(앱)섹션의 선택 항목에서 얻을 수 있는 것은 다음과 같습니다.

Recents(또는 일반적으로 내 생각)에서는 다음과 같은 이점을 얻을 수 있습니다.

GoogleDrive에서 선택할 때는 다음과 같은 URI를 사용합니다.

또한 사진(앱)섹션에서 다음을 수행합니다(URL인코딩됨).





버튼 위치 내가 원하는 곳에 설정하기

처음 만들면 스튜디오 안에서는 정상작동하나, 핸드폰을 활용할 시 error문구와 함꼐 0,0으로 이동이 됩니다.

<Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="62dp"
        tools:layout_editor_absoluteY="310dp" />


이 구문을 

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.291" />

와 같이 설정하고, 디자인 부분에서 위치를 조절해준다면 원하는 위치에 배열할 수 있습니다.





Q

사람들이 'public static final String mystring = ~~~' 을 작성한 다음 많은 값을 사용하는 코드를 보았습니다.


왜 그들은 그것을해야하나요? 왜 그들은 그것을 사용하기 전에 최종 값으로 초기화해야합니까?

그 핵심 (public static final)의 의미를 이해합니다.

내가 이해하지 못하는 것은 상수가 

한 곳에서만 사용되고 같은 클래스에서만 사용 되더라도 사람들이 왜 그것을 사용하는지에 대한 것입니다. 

그것을 선언하는 이유는 무엇입니까? 왜 우리는 변수를 사용하지 않습니까?


A

final은 변수의 값이 변경되지 않음을 나타냅니다. 즉, 값을 선언 한 변수는 선언 된 후에 수정할 수 없습니다.


public final static String 을 사용하면 다음과 같은 String을 만들 수 있습니다.

1. 클래스 (static : 그것을 사용하는 데 필요한 인스턴스가 없음)에 속하며,

2. 클래스의 모든 인스턴스와 클래스를 사용하는 다른 객체에서 사용할 수있는
   String 상수를 정의하려는 경우와 같이 변경되지 않습니다 (final).


ex)

public final static String MY_CONSTANT = "SomeValue";

// ... 다른 코드에서 다른 객체에 상수를 사용합니다.
if (input.equals(MyClass.MY_CONSTANT)

비슷하게

public static final int ERROR_CODE = 127;


즉,

final을 사용할 필요는 없지만 프로그램 실행 중에 실수로 변경되는 상수를 유지하고 변수가

상수라는 표시기로 사용됩니다.


final 상수가 현재 클래스 및 또는 한 곳에서만 사용되는 경우에도 모든 상수를 최종으로 선언하는 것이 좋습니다.

final : 코드의 수명이 다할 때까지 상수가 여러 곳에서 사용될 수 있습니다.

또한 final을 사용하면 구현시 일부 최적화를 수행 할 수 있습니다.




+ 다른 답변 해석

static 이란 클래스를 인스턴스화하거나 객체를 사용하지 않고도 사용할 수 있습니다.

final은 문자열 상수를 만드는데 사용되는 키워드입니다. 해당 문자열의 값은 변경할 수 없습니다.

 아래 예를보세요.

  public class StringTest { 
           static final String str = "Hello"; 
  public static void main(String args[]) { 
           // str = "world"; // 주석을 해제하면 에러가 발생할 것입니다.
           System.out.println(str); // called without the help of an object                       
           System.out.println(StringTest.str);// called with class name  
             } 
         } 


Traceback (most recent call last):

  File "binfilemaking.py", line 5, in <module>

    import matplotlib.pyplot as plt

  File "/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 115, in <module>

    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()

  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup

    globals(),locals(),[backend_name],0)

  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_tkagg.py", line 6, in <module>

    from six.moves import tkinter as Tk

  File "/home/testguest/.local/lib/python2.7/site-packages/six.py", line 203, in load_module

    mod = mod._resolve()

  File "/home/testguest/.local/lib/python2.7/site-packages/six.py", line 115, in _resolve

    return _import_module(self.mod)

  File "/home/testguest/.local/lib/python2.7/site-packages/six.py", line 82, in _import_module

    __import__(name)

  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 42, in <module>

    raise ImportError, str(msg) + ', please install the python-tk package'

ImportError: No module named _tkinter, please install the python-tk package


라는 에러가 발생하였습니다. 이제 해결하는 방법을 알아보겠습니다.


시스템에서 제공하는 Python과 함께 사용하기 위해 로컬에서 Tkinter를 설치하는 것은 그리 쉽지 않습니다.


소스에서 빌드 할 수도 있지만, 이것은 가장 좋은 아이디어는 아닙니다.

일반적으로 실행중인 바이너리 패키지 기반 배포판에서....


apt-get python-tk 를 컴퓨터에 설치하는 것이 더 안전합니다. (Ubuntu와 같은 데비안에서 파생 된 배포판에서 작동하며 다른 배포판의 패키지 관리자 및 패키지 목록을 참조하십시오.)

그러면 리눅스에서

sudo apt-get install python-tk

를 입력합니다.

그러면 설치 진행 Y를 하시면 해결됩니다.


'Computer_IT > Python' 카테고리의 다른 글

Python Requests 설치하기 및 크롤링(scraping) 예제  (0) 2017.05.12

+ 지난 텐서플로우 게시글에 이어서 튜토리얼 2를 진행하겠습니다.

+ 적힌 부분이 추가설명 및 의견입니다.. ㅎㅎ


  기계 학습에 대한 자세한 내용은이 튜토리얼의 범위를 벗어난다. 

그러나 TensorFlow는 손실 함수를 최소화하기 위해 각 변수를 천천히 변경하는 옵티 마이저를 제공합니다.

 가장 간단한 옵티 마이저는 그래디언트 디센트입니다. 

해당 변수에 대한 손실 파생의 크기에 따라 각 변수를 수정합니다. 일반적으로 심볼릭 파생물을 수동으로 계산하는 것은 지루하고 오류가 발생하기 쉽습니다. 

결과적으로 TensorFlow는 tf.gradients 함수를 사용하여 모델 설명 만 제공된 파생물을 자동으로 생성 할 수 있습니다. 단순화를 위해 일반적으로 옵티마이 저가이를 수행합니다. 


+ 마땅한 번역할 단어가 안떠올라서 마지막 구글 번역을 돌렸더니 단어가 이상하네요 추가적으로 예제 코드를 보면서 설명하겠습니다.


예를 들어,


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]))



이제 실제 기계 학습을했습니다!

+ 이번 코드는 GradientDescentOptimizer 0.01비율로 손실을 최소화 시키고 선형 모델인 

+ y = Wx+b 에서 x값과 y값을 주어졌을 때, W와, b의 값을 1000번의 학습된 결과를 통해 

+ 값을 표현한 것입니다.


 이 간단한 선형 회귀를 수행하더라도 TensorFlow 핵심 코드가 많이 필요하지는 않지만 모델에 데이터를 입력하는 더 복잡한 모델과 메서드는 더 많은 코드가 필요합니다.

 따라서 TensorFlow는 일반적인 패턴, 구조 및 기능에 대해 더 높은 수준의 추상화를 제공합니다. 

우리는 이어서 이러한 추상화를 사용하는 방법을 배웁니다.


완료된 프로그램 

완성 된 훈련 가능한 선형 회귀 모델은 다음과 같습니다.


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))



+ 이 코드의 함수를 시각화 해서 본다면

TensorBoard final model visualization



tf.contrib.learn


tf.contrib.learn은 다음을 포함하여 기계 학습의 메커니즘을 단순화하는 상위 TensorFlow 라이브러리입니다.

-실행중인 학습 루프

-평가 루프 실행

-데이터 세트 관리

-수유 관리

tf.contrib.learn은 많은 공통 모델을 정의합니다.


기본 사용법

tf.contrib.learn을 사용하면 선형 회귀 프로그램이 얼마나 단순 해지는 지 주목하십시오


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.
print(estimator.evaluate(input_fn=input_fn))



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

+ 위 처럼 결과가 나올 것입니다.



커스텀 모델


tf.contrib.learn은 사용자를 미리 정의 된 모델로 잠그지 않습니다. 

TensorFlow에 내장되어 있지 않은 커스텀 모델을 만들고 싶다고 가정 해 보겠습니다. 

tf.contrib.learn의 데이터 세트, 수유, 교육 등의 높은 수준의 추상화는 여전히 유지할 수 있습니다. 

설명을 위해, 우리는보다 낮은 수준의 TensorFlow API에 대한 지식을 사용하여 LinearRegressor에 대한 자체 등가 모델을 구현하는 방법을 보여줍니다.


tf.contrib.learn과 작동하는 사용자 정의 모델을 정의하려면 tf.contrib.learn.Estimator를 사용해야합니다. tf.contrib.learn.LinearRegressor는 실제로 tf.contrib.learn.Estimator의 하위 클래스입니다. 

Estimator를 하위 분류하는 대신 Estimator에게 예측, 교육 단계 및 손실을 평가할 수있는 방법을 

tf.contrib.learn에게 알려주는 model_fn 함수를 제공하기 만하면됩니다. 코드는 다음과 같습니다.


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))




커스텀 모델 () 함수의 내용이 저수준 API의 수동 모델 트레이닝 루프와 얼마나 흡사한지 주목하십시오.



다음 단계


이제 TensorFlow의 기본 지식을 습득했습니다. 우리는 더 많은 것을 배우기 위해 여러분이 볼 수있는 튜토리얼을 몇 가지 더 가지고 있습니다. 초보자의 경우 초보자 인 경우 MNIST를 참조하십시오. 그렇지 않은 경우 전문가를위한 Deep MNIST를 참조하십시오


+ 다음 튜토리얼은 손글씨 인식을 하는 것입니다.

+ 이번 튜토리얼에서는 API에서 얼만큼 잘 제공해주는지 알려주는 것 같았습니다.

+ 다음 튜토리얼 부터는 점점 머신러닝과 관련하여 인곤지능과 가까워질 것 입니다. 

+ 다 같이 힘내봅시다.








[MYSQL] SELECT 한 내용 INSERT 시키는 방법

Select 한 내용을 그대로 Insert 시키는 방법과 약간 응용하는 법을 소개합니다. 처음에는 저도 방법이 정확히 떠오르지 않아 구글링을 했지만 간단명료하게 나와있는 글이 없어 시간을 좀 뺐겼던 기억이 납니다.

1. select 한 내용의 전체 컬럼 Insert

당연한 이야기지만 select하는 테이블과 insert할 테이블의 컬럼은 일치해야 합니다.

 

2. 원하는 컬럼만 select 해서 Insert

PRIMARY키가 있어 1번의 방법으로 INSERT가 안되는 경우 PRIMARY키를 제외한 컬럼을 직접 선택해서 INSERT하는 방법입니다.


++

위의 글을 참조한 이유는 잘 동작하던 쿼리문이

UID를 추가한 이후 

Column count doesn't match value count at row 1 의 에러 문구가 나왔었다.

실제 소스를 보면서 설명하겠습니다.


insert into HPG

select system, cbroff, consl from CNS

where system = system ; 


일 경우 에러가 없던 문구에서

Column (UID)를 추가하였습니다. 했더니 에러 문구가 위의 msgbox로 출력되었습니다.


즉 From table과 Insert Table의 컬럼 수가 일치하지 않다는 것으로 판단됩니다.


따라서, UID는 자동 증가이기 때문에


insert into HPG(system, cbroff, consl)

select system, cbroff, consl from CNS

where system = system ;


를 추가 함으로 써 에러를 수정할 수 있었습니다.

'Computer_IT > MySQL' 카테고리의 다른 글

[DB] 인덱스 란? / 인덱스 유,무 의 차이점  (0) 2017.05.24

리눅스 CMOS -- 시간 확인


 CMOS 시간 확인 

# clock -r    


시스템 시간 확인 

# date        


# date +%Y-%m-%d

2011-11-23


CMOS -- 시간 설정

 시스템시간을 CMOS시간으로 설정 

# clock -w   

 CMOS시간을 시스템시간으로 설정 

# clock -s    


리눅스 -- 시간 동기화


리눅스 시스템 시간 동기화 

# rdate -s time.bora.net  


시간 확인 

# date                          


 CMOS 시간에 적용 

# clock -w                   


+ Recent posts