연수기란 물을 연하게 한다고 해서 소프너(Softener)라고 합니다.

이온 교환 물 연화제는 부드러운 물을 생성합니다.

소금에 절인 물 연화제는 이온 교환 과정을 이용해 경수를 부드럽게 한다. 오직 이온 교환 과정만이 경수를 추출하는 광물질을 추출함으로써 진정한 물을 진정시킨다.

이온 교환 과정은 주로 미네랄 미네랄을 함유하고 있으며, 주로 칼슘과 마그네슘을 주성분으로 하고 있다. 교환은 미네랄이 자연적으로 이온화되어 있기 때문에 가능한 것으로 추정된다. 이온 교환 과정은 전하가 서로 밀어내는 것과 전하가 서로 끌어당긴다는 사실을 기반으로 합니다.

이온 교환 물 연화제는 고체 미네랄, 칼슘, 마그네슘을 함유한 부드러운 미네랄을 교환합니다. 부드러운 미네랄 알갱이에 함유되어 있어 표면에 축적되지 않고 표면에 축적됩니다.

이온 교환 작동 원리

세개의 미네랄(칼슘, 마그네슘, 나트륨)은 양이온이라 불리는 양이온을 가지고 있다. 이 교환은 적절한 압력 용기 안에 있는 인공 이온 교환 수지에 대한 경도 광물을 포함한 물을 통과하는 물을 통과한다. 대부분의 현대 유연제는 대부분의 현대 유연제로 구성된 합성 수지(알갱이)로 이루어져 있는데, 이것들은 모두 음전하를 띠고 있는 모조품들이다. 수지가 재생되는 상태에서, 이러한 음전하 입자들은 양이온 양이온 양이온을 양이온으로 함유하고 있다. 칼슘과 마그네슘은 수지 탱크를 통해 수지를 통과하는 수지와 접촉하면서 교환 부위에서 나트륨 이온을 분산시킨다. 이온 교환 과정에서 철과 망간과 같은 다른 강력하게 충전된 양이온은 칼슘과 마그네슘과 더불어 제거된다.

이온 교환은 다음 두가지 이유로 가능하다.

1. 모든 양이온은 양전하와 같은 힘을 가지고 있지 않다.

2. 수지는 양이온 양이온보다 더 강한 양이온, 칼슘, 마그네슘을 선호한다.

그 다음으로, 치환된 나트륨 양이온은 수지'베드'를 통과하여 연화제 출구를 통과하므로 연화제는 ' 부드러운 물'을 제공합니다. 또한 탄산 음료를 마시는 것을 보아라.

재충전

결국 모든 합성 수지 교환 사이트들은 칼슘과 마그네슘에 의해 점유되고 있으며, 더 이상 연화 교환이 이루어질 수 없다. 수지는 피곤하고 재생되어야 한다고 한다.

Softener의 수지는 묽은 용액(일반 소금)과 염수 5브라인으로 재 재생됩니다. 재생하는 동안 연화제 공급 물의 흐름이 정지됩니다.

소금물은 희석된 물의 개별적인 흐름과 혼합된 소금물 탱크에서 추출된다. 희석된 브라인 용액은 수지를 통과하며, 칼슘과 마그네슘 이온이 함유된 수지 비드에 접촉합니다. 비록 칼슘과 마그네슘이 나트륨보다 강하지만 농축된 소금물은 더 적은 수의 칼슘과 마그네슘 이온을 치환할 수 있는 더 적은 양의 나트륨 이온을 함유하고 있다. 칼슘과 마그네슘 이온이 교체되면 양이온 이온이 음극 사이트에 끌린다. 결국, 사이트들은 나트륨 이온에 의해 흡수되고, 수지는 재생되고 다음 연화(서비스)사이클을 위해 준비된다고 알려져 있다.


Deep MNIST for Experts (전문가를위한 딥 MNIST)

TensorFlow는 대규모 수치 계산을 수행하는 강력한 라이브러리입니다. 탁월한 과제 중 하나는 심 신경 네트워크를 구현하고 교육하는 것입니다. 이 튜토리얼에서 우리는 TensorFlow 모델의 기본 빌딩 블록을 배우면서 깊은 컨볼 루션 MNIST 분류자를 생성합니다.

이 소개는 신경망과 MNIST 데이터 세트에 익숙하다고 가정합니다. 그들과 배경이 없다면, 초보자를위한 소개를 확인하십시오. 시작하기 전에 반드시 TensorFlow를 설치하십시오.


About this tutorial


이 튜토리얼의 첫 번째 부분에서는 Tensorflow 모델의 기본 구현 인  mnist_softmax.py코드에서 어떤 일이 일어나는지 설명합니다. 두 번째 부분에서는 정확성을 높이는 몇 가지 방법을 보여줍니다.


이 튜토리얼의 각 코드 스 니펫을 복사하여 Python 환경에 붙여 넣거나, 완전히 구현 된 깊은 네트를 mnist_deep.py 에서 다운로드 할 수 있습니다.


이 튜토리얼에서 우리가 달성 할 수있는 것 :

-이미지의 모든 픽셀을 관찰하여 MNIST 숫자를 인식하는 모델 인 softmax 회귀 함수를 만듭니다.

-Tensorflow를 사용하여 수천 가지 사례를 "조사"하여 숫자를 인식하도록 모델을 교육합니다 (첫 번째 Tensorflow 세션을 실행하여 수행)

-테스트 데이터로 모델의 정확성을 확인하십시오.

-결과를 향상시키기 위해 다중 컨볼 루션 신경망을 구축, 훈련 및 테스트합니다.


Setup

모델을 만들기 전에 먼저 MNIST 데이터 세트를로드하고 TensorFlow 세션을 시작합니다.

MNIST 데이터로드

이 자습서의 코드를 복사하여 붙여 넣는 경우 다음 두 줄의 코드를 사용하여 데이터를 자동으로 다운로드하고 읽습니다.
from tensorflow.examples.tutorials.mnist import input_data
mnist
= input_data.read_data_sets('MNIST_data', one_hot=True)
여기서 mnist는 훈련, 검증 및 테스트 세트를 NumPy 배열로 저장하는 간단한 클래스입니다. 또한 아래에 사용할 데이터 minibatches를 반복하는 함수를 제공합니다.

TensorFlow InteractiveSession 시작

TensorFlow는 매우 효율적인 C ++ 백엔드를 사용하여 계산을 수행합니다. 이 백엔드에 대한 연결을 세션이라고합니다. TensorFlow 프로그램의 일반적인 사용법은 먼저 그래프를 만든 다음 세션에서 시작하는 것입니다.
여기서 우리는 편리한 InteractiveSession 클래스를 대신 사용합니다. TensorFlow는 코드 구조화 방법을보다 융통성있게 만듭니다. 그래프를 실행하는 계산 그래프를 작성하는 조작을 인터리브 할 수 있습니다. 이것은 IPython과 같은 대화식 환경에서 작업 할 때 특히 편리합니다. InteractiveSession을 사용하지 않는 경우, 세션을 시작하고 그래프를 시작하기 전에 전체 계산 그래프를 작성해야합니다.
import tensorflow as tf
sess
= tf.InteractiveSession()
계산 그래프

파이썬에서 효율적인 수치 계산을 수행하기 위해 일반적으로 다른 언어로 구현 된 매우 효율적인 코드를 사용하여 파이썬 외부의 행렬 곱셈과 같은 값 비싼 연산을 수행하는 NumPy와 같은 라이브러리를 사용합니다. 불행하게도, 모든 작업을 파이썬으로 다시 전환하면 많은 오버 헤드가 발생할 수 있습니다. 이 오버 헤드는 GPU에서 계산을 실행하거나 데이터를 전송하는 데 비용이 많이 드는 분산 된 방식으로 실행하려는 경우 특히 나쁩니다.

TensorFlow는 파이썬 밖에서도 힘든 작업을 수행하지만이 오버 헤드를 피하기 위해 한 걸음 더 나아갑니다. TensorFlow는 Python과 독립적으로 고가의 단일 연산을 실행하는 대신 Python 외부에서 실행되는 상호 작용하는 연산의 그래프를 설명합니다. 이 방법은 Theano 또는 Torch에서 사용되는 방법과 유사합니다.

따라서 파이썬 코드의 역할은이 외부 계산 그래프를 작성하고 계산 그래프의 어느 부분을 실행해야하는지 지시하는 것입니다. 자세한 내용은 TensorFlow 시작하기의 계산 그래프 섹션을 참조하십시오.

Softmax 회귀 모델 구축

이 섹션에서는 단일 선형 레이어가있는 softmax 회귀 모델을 작성합니다. 다음 섹션에서 우리는 이것을 다중 계층 콘볼 루션 네트워크가있는 softmax 회귀의 경우까지 확장 할 것입니다.

Placeholders
우리는 입력 이미지와 대상 출력 클래스에 대한 노드를 생성하여 계산 그래프를 작성하기 시작합니다.
+ 초급자 버전 및 기본 mnist 튜토리얼과 같은 방법으로 선언이 됩니다.
x = tf.placeholder(tf.float32, shape=[None, 784])
y_
= tf.placeholder(tf.float32, shape=[None, 10])
여기서 x와 y는 특정 값이 아닙니다. 오히려 각각은 자리 표시 자입니다. TensorFlow에 계산을 실행하도록 요청할 때 입력 할 값입니다.

입력 이미지 x는 2 차원 텐서 부동 소수점 수로 구성됩니다. 여기서 우리는 [없음, 784]의 모양을 할당합니다. 여기서 784는 단일 평평한 28x28 픽셀 MNIST 이미지의 차원이며, 없음은 배치 크기에 해당하는 첫 번째 차원이 모든 크기 일 수 있음을 나타냅니다. 목표 출력 클래스 y_는 또한 2d 텐서로 구성되며, 각 행은 해당 MNIST 이미지가 속하는 디지트 클래스 (0에서 9까지)를 나타내는 1 핫 10 차원 벡터입니다.

자리 표시 자에 대한 shape 인수는 선택 사항이지만 TensorFlow가 일치하지 않는 텐서 모양에서 발생하는 버그를 자동으로 잡을 수 있습니다.

Variables

이제 우리 모델에 대한 가중치 W와 편향치 b를 정의합니다. 우리는 이들을 추가 입력과 같이 취급한다고 상상할 수도 있지만 TensorFlow는이를 처리하는 더 좋은 방법을 가지고 있습니다 : 가변. 변수는 TensorFlow의 계산 그래프에있는 값입니다. 그것은 계산에 의해 사용되거나 심지어 수정 될 수 있습니다. 기계 학습 응용 프로그램에서 일반적으로 모델 매개 변수는 변수입니다.
W = tf.Variable(tf.zeros([784,10]))
b
= tf.Variable(tf.zeros([10]))
tf.Variable에 대한 호출에서 각 매개 변수의 초기 값을 전달합니다. 이 경우 W와 b를 0으로 채워진 텐서로 초기화합니다. W는 784x10 행렬 (784 개의 입력 피처와 10 개의 출력이 있기 때문에)이고 b는 10 개의 클래스가 있으므로 10 차원 벡터입니다.

변수는 세션 내에서 사용되기 전에 해당 세션을 사용하여 초기화되어야합니다. 이 단계는 이미 지정된 초기 값 (이 경우에는 0으로 가득 찬 텐서)을 취하여 각 변수에 할당합니다. 이 작업은 모든 변수에 대해 동시에 수행 할 수 있습니다.
sess.run(tf.global_variables_initializer())

Predicted Class and Loss Function

이제 회귀 모델을 구현할 수 있습니다. 한 줄만 필요합니다! 벡터화 된 입력 이미지 x에 가중치 행렬 W를 곱하고 바이어스 b를 더합니다.

y = tf.matmul(x,W) + b
손실 기능을 쉽게 지정할 수 있습니다. 손실은 단일 예에서 모델의 예측이 얼마나 나쁜지를 나타냅니다. 우리는 모든 예제를 통해 교육하면서이를 최소화하려고 노력합니다. 여기서 우리의 손실 함수는 목표와 모델의 예측에 적용되는 softmax 활성화 함수 간의 교차 엔트로피입니다. 초보자 가이드 에서처럼 안정된 공식을 사용합니다.
cross_entropy = tf.reduce_mean(
    tf
.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
tf.nn.softmax_cross_entropy_with_logits는 모델의 비표준 모델 예측에 softmax를 내부적으로 적용하고 모든 클래스에서 합계를 계산하며, tf.reduce_mean은 이러한 합계에 대한 평균을 취합니다.

Train the Model

이제 모델 및 교육 손실 기능을 정의 했으므로 TensorFlow를 사용하여 교육하는 것이 간단합니다. TensorFlow는 전체 계산 그래프를 알고 있으므로 자동 차별화를 사용하여 각 변수에 대한 손실 그라디언트를 찾을 수 있습니다. TensorFlow에는 다양한 내장 최적화 알고리즘이 있습니다. 이 예에서는 교차 엔트로피를 내리기 위해 steepest gradient descent를 단계 길이 0.5로 사용합니다.
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
TensorFlow가 실제로 한 줄에서 계산 한 것은 새로운 연산을 계산 그래프에 추가하는 것이 었습니다. 이러한 작업에는 그라디언트를 계산하고, 매개 변수 업데이트 단계를 계산하고, 매개 변수에 업데이트 단계를 적용하는 작업이 포함되었습니다.

반환 된 작업 train_step을 실행하면 그라데이션 강하 업데이트가 매개 변수에 적용됩니다. 따라서 train_step을 반복적으로 실행하여 모델 교육을 수행 할 수 있습니다.
for _ in range(1000):
  batch
= mnist.train.next_batch(100)
  train_step
.run(feed_dict={x: batch[0], y_: batch[1]})
각 교육 반복마다 100 개의 교육 사례를로드합니다. 그런 다음 feed_dict를 사용하여 place_holder x 및 y_를 학습 예제로 대체하여 train_step 연산을 실행합니다. feed_dict를 사용하여 계산 그래프에서 임의의 텐서를 대체 할 수 있습니다. 단지 자리 표시 자에만 국한되지 않습니다.

Evaluate the 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))
그건 우리에게 불공정 목록을 제공합니다. 어떤 부분이 올바른지 결정하기 위해 부동 소수점 수로 캐스팅 한 다음 평균을 취합니다. 예를 들어, [True, False, True, True]는 [1,0,1,1]이되어 0.75가됩니다.
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
마지막으로 테스트 데이터의 정확성을 평가할 수 있습니다. 이것은 약 92 % 정확해야합니다.
print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

Build a Multilayer Convolutional Network

멀티 레이어 컨볼 루션 네트워크 구축


MNIST에서 92 % 정확도를 얻는 것은 좋지 않습니다. 그것은 거의 당황스럽게도 나빴습니다. 이 섹션에서는 아주 단순한 모델에서 중간 정도의 복잡한 것, 즉 작은 콘볼 루션 신경 네트워크로 점프 할 것입니다. 이것은 우리에게 99.2 %의 정확성을 줄 것입니다. 예술 수준은 아니지만 존경 할 만합니다.


무게 초기화


이 모델을 만들려면 많은 가중치와 편향을 만들어야합니다. 일반적으로 대칭 분리를 위해 소량의 잡음을 사용하여 가중치를 초기화하고 0 기울기를 방지해야합니다. 우리가 ReLU(ReLU) 뉴런을 사용하고 있기 때문에, "죽은 뉴런"을 피하기 위해 약간 긍정적 인 초기 바이어스로 초기화하는 것이 좋습니다. 모델을 빌드하는 동안이 작업을 반복적으로 수행하는 대신, 우리를 위해이 작업을 수행하는 두 가지 편리한 기능을 만들어 보겠습니다.

+여기서 ReLU가 나오는데 CNN 및 점점 들어갈 수록 많이 사용되는 용어입니다.

def weight_variable(shape):
  initial
= tf.truncated_normal(shape, stddev=0.1)
 
return tf.Variable(initial)

def bias_variable(shape):
  initial
= tf.constant(0.1, shape=shape)
 
return tf.Variable(initial)

회선 및 풀링


TensorFlow는 또한 컨볼 루션 및 풀링 작업에 많은 유연성을 제공합니다. 경계를 어떻게 처리할까요? 우리의 보폭은 무엇입니까? 이 예에서는 항상 바닐라 버전을 선택합니다. 우리의 컨볼 루션은 1의 보폭을 사용하며 출력이 입력과 동일한 크기가되도록 0으로 채워집니다. 우리의 풀링은 2x2 블록을 넘어서 평범한 오래된 최대 풀링입니다. 코드를보다 깨끗하게 유지하려면 이러한 연산을 함수로 추상화합시다.

def conv2d(x, W):
 
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
 
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides
=[1, 2, 2, 1], padding='SAME')

첫 번째 콘볼 루션 레이어


이제 첫 번째 레이어를 구현할 수 있습니다. 컨볼 루션 (convolution)과 최대 풀링 (max pooling)으로 구성됩니다. 컨볼 루션은 각 5x5 패치에 대해 32 개의 기능을 계산합니다. 그것의 체중 텐서는 [5, 5, 1, 32]의 모양을 가질 것입니다. 처음 두 차원은 패치 크기이고, 다음은 입력 채널 수이고, 마지막은 출력 채널 수입니다. 각 출력 채널에 대한 구성 요소가있는 바이어스 벡터도 갖게됩니다.

W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1
= bias_variable([32])

레이어를 적용하기 위해 먼저 x와 4d 텐서의 형태를 바꾸고 두 번째 및 세 번째 차원은 이미지 너비와 높이에 해당하고 최종 차원은 색상 채널 수에 해당합니다.

x_image = tf.reshape(x, [-1, 28, 28, 1])

우리는 x_image와 체중 텐서를 곱하고, 바이어스를 추가하고, ReLU 함수를 적용하고, 마지막으로 최대 풀을 적용합니다. max_pool_2x2 메소드는 이미지 크기를 14x14로 줄입니다.

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1
= max_pool_2x2(h_conv1)

두 번째 컨벌루션 레이어


깊은 네트워크를 구축하기 위해이 유형의 여러 레이어를 쌓습니다. 두 번째 레이어에는 각 5x5 패치에 대해 64 개의 기능이 있습니다.

W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2
= bias_variable([64])

h_conv2
= tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2
= max_pool_2x2(h_conv2)

조밀하게 연결된 레이어


이미지 크기가 7x7로 축소되었으므로 전체 이미지에서 처리 할 수 ​​있도록 1024 개의 뉴런이있는 완전히 연결된 레이어를 추가합니다. 우리는 풀링 레이어에서 텐서를 벡터 묶음으로 변형하고, 가중치 행렬을 곱하고, 바이어스를 추가하고, ReLU를 적용합니다.

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1
= bias_variable([1024])

h_pool2_flat
= tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1
= tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

DropOut


초과 맞춤을 줄이기 위해 판독 레이어 앞에 드롭 아웃을 적용합니다. 우리는 드롭 아웃 중에 뉴런의 출력이 유지 될 확률에 대한 자리 표시자를 만듭니다. 이것은 우리가 훈련 중에 dropout을 켜고 시험하는 동안 turn off 할 수있게 해줍니다. TensorFlow의 tf.nn.dropout op는 마스킹 외에도 스케일링 뉴런 출력을 자동으로 처리하므로 드롭 아웃은 추가 스케일링 없이도 작동합니다 .

keep_prob = tf.placeholder(tf.float32)
h_fc1_drop
= tf.nn.dropout(h_fc1, keep_prob)

판독 레이어


마지막으로 위의 한 계층 softmax 회귀와 마찬가지로 계층을 추가합니다.


W_fc2 = weight_variable([1024, 10])
b_fc2
= bias_variable([10])

y_conv
= tf.matmul(h_fc1_drop, W_fc2) + b_fc2


차이점은 다음과 같습니다.


-가파른 그라데이션 하강 옵티 마이저를보다 정교한 ADAM 옵티 마이저로 대체 할 것입니다.

-feed_dict에 추가 매개 변수 keep_prob를 포함시켜 드롭 아웃 속도를 제어합니다.

-우리는 교육 과정에서 매 100 번째 반복에 로깅을 추가 할 것입니다.


또한 tf.InteractiveSession보다는 tf.Session을 사용할 것입니다. 이렇게하면 그래프를 만드는 과정 (모델 선택)과 그래프를 평가하는 과정 (모델 피팅)이 더 잘 분리됩니다. 일반적으로 더 깨끗한 코드를 만듭니다. tf.Session은 with 블록 내에서 만들어 지므로 블록이 종료되면 자동으로 삭제됩니다.


이 코드를 자유롭게 실행하십시오. 2 만 건의 교육 반복 작업을 수행하며 프로세서에 따라 다소 시간이 걸릴 수 있습니다 (최대 30 분 소요).

cross_entropy = tf.reduce_mean(
    tf
.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step
= tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction
= tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy
= tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
  sess
.run(tf.global_variables_initializer())
 
for i in range(20000):
    batch
= mnist.train.next_batch(50)
   
if i % 100 == 0:
      train_accuracy
= accuracy.eval(feed_dict={
          x
: batch[0], y_: batch[1], keep_prob: 1.0})
     
print('step %d, training accuracy %g' % (i, train_accuracy))
    train_step
.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

 
print('test accuracy %g' % accuracy.eval(feed_dict={
      x
: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

이 코드를 실행 한 후 최종 테스트 세트 정확도는 약 99.2 % 여야합니다.


우리는 TensorFlow를 사용하여 매우 정교한 심층 학습 모델을 빠르고 쉽게 작성, 교육 및 평가하는 방법을 배웠습니다.


1 :이 작은 컨볼 루션 네트워크의 경우 성능은 실제로 드롭 아웃 유무와 거의 동일합니다. 드롭 아웃은 종종 과잉을 줄이는 데 효과적이지만 매우 큰 신경 네트워크를 학습 할 때 가장 유용합니다.




+ Relu와 Dropout을 활용하여 심층 신경망을 연결하는 방법 및 히든레이어를 활용하여 서로 연결된 네트워크망을  구성하는 방법을 간단하게 나왔습니다. 추후의 CNN 을 참고하게 된다면 더 많은 레이어 구성 및 복잡하지만 단순하게 구성하는 방법의 튜토리얼이 나옵니다.


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







튜토리얼은 따라 가겠는데... 전혀 감이 안잡힌다... 그래서 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.
...




+ Recent posts