나는 90 년대에 신경 네트워크 소프트웨어를 쓰는 훌륭한 재미를 가지고 있었고, TensorFlow를 사용하여 일부를 만들고 싶었습니다.

Google의 Machine Intelligence Framework는 지금 새로운 섹스입니다. 그리고 Tensorflow가 라스베리 PI에서 설치할 때, 그것은 매우 쉽게 일하게됩니다. 짧은 시간에 나는 바이너리에서 계산하는 신경망을 만들었습니다. 그래서 나는 지금까지 배운 것에 가질 것이라고 생각했습니다. 바라건대 이것은 이것을 시도하기를 원하는 다른 사람을 쉽게하거나 신경망에 대한 통찰력을 원하는 사람을 쉽게 할 수 있습니다.

Tensorflow 란 무엇입니까?

TensorFlow 웹 사이트를 인용하려면 TensorFlow는 “데이터 흐름 그래프를 사용하여 숫자 계산을위한 오픈 소스 소프트웨어 라이브러리”입니다. 우리는 “데이터 흐름 그래프”가 무엇을 의미합니까? 글쎄, 그게 정말 놀라운 부분이야. 그러나 우리가 대답하기 전에 간단한 신경망의 구조에 대해 조금 이야기해야합니다.

바이너리 카운터 신경망
신경망의 기본 사항

간단한 신경 네트워크에는 입력이 진행되는 일부 입력 장치가 있습니다. 또한 사용자의 관점에서 문자 그대로 숨겨져 있기 때문에 숨겨진 단위를 가지고 있습니다. 그리고 결과를 얻는 출력 단위가 있습니다. 옆면에서 숨겨진 및 출력 단위에서 방출되는 값을 제어하는 ​​데 도움이되는 바이어스 단위도 있습니다. 이러한 모든 장치를 모두 연결하는 것은 단지 숫자 인 무의가 무리이며, 이는 각각 2 개의 단위와 관련이 있습니다.

우리 가이 신경망으로 인한 지능이 모든 가중치에 값을 할당하는 방법입니다. 그것이 신경망을 훈련시키는 것입니다.이 가중치에 적합한 값을 찾습니다. 일단 훈련을 받으면 입력 단위를 각각 이진 자리 숫자로 설정하고, Tensorflow는 사이의 모든 것과 함께 모든 것을 수행하고 출력 단위가 바이너리 숫자가 0, 0 및 각각 1. 당신이 놓친 경우, 바이너리 000 이후의 다음 숫자가 001 이었음을 알았습니다. 010을 뱉어 야해야합니다. “셀 수있는 방법을 알고 있습니다.

행렬이있는 이진 카운터 신경망
“실행”의 한 단계는 각 가중치의 값을 입력 단위의 값으로 곱한 다음 결과를 관련 숨겨진 단위에 저장하는 것입니다.

우리는 단위와 가중치를 배열로 다시 그릴 수 있거나 파이썬에서 목록이라고합니다. 수학 관점에서, 그들은 행렬입니다. 우리는 다이어그램에서 그 부분 만 다시 그릴 것입니다. 입력 매트릭스에 체중 매트릭스를 곱하면 5 개의 요소 숨겨진 매트릭스 / 목록 / 배열이 생성되는 간단한 매트릭스 곱셈이 포함됩니다.

매트릭스에서 텐서까지

Tensorflow에서 해당 목록을 Tensors라고합니다. 매트릭스 곱셈 단계는 작업을 수행하거나 프로그래머를 사용하는 영업이며 Tensorflow 문서를 읽는 것을 계획하는 경우 익숙해 져야합니다. 그것을 더욱 차지하고, 신경 네트워크 전체는 텐서 컬렉션과 OPS를 운영하는 픽업입니다. 그들은 모두 그래프를 구성합니다.

바이너리 카운터 전체 그래프
Layer1 확장

여기에 Tensorboard의 스냅 샷, 그래프를 시각화하기위한 도구뿐만 아니라 훈련 중 텐서 값을 검사하는 도구입니다. 텐서는 선이며 줄에 쓰여진 텐서의 치수입니다. 텐서를 연결하는 것은 두 번째 스냅 샷에서 Layer1에 대해 수행 한 것처럼 더 자세한 내용을 확장하기 위해 확장하려면 더 많은 정보를 두 번 클릭 할 수 있습니다.

맨 아래에서 x는 입력 텐텐수의 값을 제공 할 수있는 자리 표시 자 POP에 대해 제공 한 이름입니다. 올라가고 왼쪽에서 왼쪽으로가는 줄은 입력 텐서입니다. 그 라인을 계속 따라 가면 Matmul OP는 그 입력 텐서와 Matmul OP로 이어지는 다른 라인 인 텐서가있는 매트릭스 곱셈을 찾을 수 있습니다. 그 텐서는 가중치를 나타냅니다.

이 모든 것이 당신에게 그래프와 그것의 텐서와 작전이 무엇인지에 대한 느낌을주는 것이 었습니다. Tensorflow가 “데이터 흐름 그래프를 사용하여 수치 계산을위한 소프트웨어 라이브러리”가 의미하는 것에 대한 더 나은 아이디어를 제공합니다. 그러나 왜 우리 가이 그래프를 만들고 싶습니까?

그래프를 만드는 이유는 무엇입니까?

현재 안정적인 API는 해석 된 언어 인 Python 용입니다. 신경망은 집중적이고 큰 수백만의 가중치가있을 수있는 큰 네트워크가 있습니다. 모든 단계를 해석하여 컴퓨팅은 영원히 걸릴 것입니다.

따라서 우리는 신경망의 레이아웃, 모든 수학 연산 및 변수에 대한 초기 값을 설명하는 텐서 및 OPS로 구성된 그래프를 만듭니다. 우리 가이 그래프를 만든 후에 만 ​​Tensorflow가 세션을 호출하는 것에 전달합니다. 이것은 연기 된 실행으로 알려져 있습니다. 세션은 매우 효율적인 코드를 사용하여 그래프를 실행합니다. 뿐만 아니라 매트릭스 곱셈과 같은 많은 작업은 지원되는 GPU (그래픽 처리 장치)에서 수행 할 수있는 일들이며 세션이 사용자를 위해 할 수 있습니다. 또한 Tensorflow는 B입니다여러 기계 및 / 또는 GPU에 처리를 배포 할 수 있도록 UM; 완전한 그래프를 제공하면 그렇게 할 수 있습니다.

바이너리 카운터 그래프 만들기

여기에 이진 카운터 신경망의 코드가 있습니다. 이 GitHub 페이지에서 전체 소스 코드를 찾을 수 있습니다. Tensorboard와 함께 사용할 정보를 저장하기위한 추가 코드가 있습니다.

텐서와 OPS 그래프를 만드는 코드로 시작합니다.

tf로 tensorflow 가져 오기
SESS = TF.INTERACTIVESESSION ()

num_inputs = 3.
num_hidden = 5.
num_outputs = 3.

우리는 먼저 TensorFlow 모듈을 가져오고 나중에 사용할 수있는 세션을 만들고 코드를보다 이해 할 수있게하기 위해 네트워크의 단위 수가 포함 된 몇 가지 변수를 만듭니다.

x = tf.placeholder (tf.float30, shape = [없음, num_inputs], name = ‘x’)
y_ = tf.placeholder (tf.float30, shape = [none, num_outputs], name = ‘y_’)

그런 다음 우리는 입력 및 출력 장치의 자리 표시자를 만듭니다. 자리 표시자는 나중에 값을 제공 할 것들을 위해 Tensorflow OP입니다. x와 y_은 이제 새로운 그래프에서 텐서이며 각각은 자리 표시 자 연관이 있습니다.

[NONE, NUM_INPUTS] 및 [NONE, NUM_OUTPUTS], 2 차원 목록으로 모양을 정의하는 이유를 궁금해 할 수 있습니다. 첫 번째 차원의 경우 없습니까? 위의 신경 네트워크의 개요에서는 한 번에 하나의 입력을 제공하고 주어진 출력을 생성하기 위해 훈련 할 것 같습니다. 우리가 한 번에 여러 입 / 출력 쌍을 제공하면 일괄 처리라고 불리는 것이 더 효율적입니다. 첫 번째 치수는 각 배치의 입력 / 출력 쌍의 수를위한 것입니다. 우리는 실제로 나중에 실제로 줄 때까지 얼마나 많은 사람들이 일괄 적이 있습니까? 실제로, 우리는 교육, 테스트 및 실제 사용을 위해 동일한 그래프를 사용하여 배치 크기가 항상 동일하지는 않습니다. 그래서 우리는 이제 첫 번째 차원의 크기에 대해 Python 자리 표시 자 개체를 사용하지 않습니다.

w_fc1 = tf.truncated_normal ([num_inputs, num_hidden], 평균 = 0.5, stddev = 0.707)
w_fc1 = tf.variable (w_fc1, name = ‘w_fc1’)

b_fc1 = tf.truncated_normal ([num_hidden], mean = 0.5, stddev = 0.707)
b_fc1 = tf.variable (b_fc1, name = ‘b_fc1’)

h_fc1 = tf.nn.relu (tf.matmul (x, w_fc1) + b_fc1)

그 뒤 따르는 것은 신경 네트워크 그래프 중 하나를 생성 한 것입니다. 가중치 W_FC1, 바이어스 B_FC1 및 숨겨진 단위 H_FC1. “FC”는 가중치가 모든 입력 유닛을 모든 숨겨진 단위에 연결하기 때문에 “완전 연결” “완전 연결”됩니다.

tf.truncated_normal은 나중에 모든 무게에 정규화 된 임의의 숫자를 나중에 할당 할 수있는 많은 OPS 및 텐서를 생성합니다.

변수 OPS에는이 경우 임의의 숫자와 함께 초기화를 수행하고 여러 실행에 데이터를 유지하는 값이 제공됩니다. 그들은 또한 신경망을 파일에 저장하기 위해 편리합니다.

Matmul OP를 사용하여 매트릭스 곱셈을 할 위치를 볼 수 있습니다. 또한 바이어스 가중치에 추가되는 추가 OP를 삽입합니다. RELU OP는 활성화 기능을 호출하는 것을 수행합니다. 매트릭스 곱셈과 첨가는 선형 작업입니다. 선형 작업만을 사용하여 신경 네트워크가 배울 수있는 매우 제한된 수의 일이 있습니다. 활성화 함수는 비선형 성을 제공합니다. Relu 활성화 기능의 경우 0보다 0보다 작은 값을 설정하고 다른 모든 값은 변경되지 않습니다. 그것을 믿든지, 그렇게하면 배울 수있는 다른 모든 세계를 열어줍니다.

w_fc2 = tf.truncated_normal ([num_hidden, num_outputs], 평균 = 0.5, stddev = 0.707)
w_fc2 = tf.variable (w_fc2, name = ‘w_fc2’)

b_fc2 = tf.truncated_normal ([num_outputs], mean = 0.5, stddev = 0.707)
b_fc2 = tf.variable (b_fc2, name = ‘b_fc2’)

y = tf.matmul (h_fc1, w_fc2) + b_fc2

층 2의 가중치 및 바이어스는 레이어 1과 동일하게 설정되지만 출력 레이어가 다릅니다. 우리는 다시 매트릭스 곱셈을 수행합니다.이 시간은 가중치와 숨겨진 단위를 곱한 다음 바이어스 가중치를 추가합니다. 우리는 다음 비트 코드에 대한 활성화 함수를 남겼습니다.

결과 = tf.sigmoid (y, name = ‘결과’)

cross_entropy = tf.reduce_mean (
tf.nn.sigmoid_cross_entropy_with_logits (logits = y, labels = y_))

Sigmoid는 우리가 위에서 둔 Relu와 같은 다른 활성화 기능이며, 비선형 성을 제공합니다. SIGMOID 방정식이 0에서 1 사이의 값을 초래하면서 이진 카운터 예제에 이상적이므로 부분적으로 시그모이드를 사용했습니다. 또한 하나 이상의 출력 장치가 큰 값을 가질 수있는 출력에 좋기 때문에 사용했습니다. 우리의 경우, 이진수 (111)를 나타내는 것, 모든 출력 장치는 큰 값을 가질 수있다. 이미지 분류를 수행 할 때 우리는 뭔가 다른 것을 원할 것입니다. 우리는 하나의 출력 단위가 큰 가치로 화재 할 것을 원합니다. 예를 들어 이미지가 기린이 포함되어 있으면 기린을 나타내는 출력 장치가 큰 값을 갖도록 원합니다. SoftMax와 같은 것이 이미지 분류에 좋은 선택이 될 것입니다.

가까운 검사에서 몇 가지 복제가있는 것처럼 보입니다. 우리는 시그모이드를 두 번 삽입하는 것 같습니다. 우리는 실제로 두 개의 다른 병렬 O를 만듭니다여기서 utputs. Cross_entropy Tensor는 중립 네트워크 훈련 중에 사용됩니다. 결과 텐서는 우리가 나중에 훈련 된 신경망을 나중에 생성 할 때 우리가 재미있게 재미있게 만들 때 사용됩니다. 이것이 이것이 이것을하는 가장 좋은 방법이라는 것을 모르지만, 내가 일어난 방식입니다.

train_step = tf.train.rmspropoptimizer (0.25, momentum = 0.5) .Minimize (cross_entropy)

우리의 그래프에 추가하는 마지막 작품은 훈련입니다. 이것은 교육 데이터를 기반으로 모든 가중치를 조정하는 OP 또는 OPS입니다. 기억하십시오, 우리는 여전히 그래프를 만드는 것입니다. 실제 훈련은 나중에 그래프를 실행할 때 발생합니다.

선택할 수있는 몇 가지 최적화기가 있습니다. SIGMOID와 마찬가지로 모든 출력 값이 클 수있는 경우에는 잘 작동하기 때문에 tf.train.rmspropoptimizer를 선택했습니다. 이미지 분류를 수행 할 때와 마찬가지로 물건을 분류하기 위해 tf.train.gradientDextenDEntOptimizer가 더 좋을 수 있습니다.

교육 및 이진 카운터 사용

그래프를 만들었 으면 훈련을 할 시간입니다. 일단 훈련을 받으면 우리는 그것을 사용할 수 있습니다.

inputvals = [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1] ,
[1, 1, 0], [1, 1, 1]]]
targetVals = [[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0] ,
[1, 1, 1], [0, 0, 0]]]

첫째, 우리는 몇 가지 훈련 데이터가 있습니다 : Inputvals 및 TargetVals. Inputvals에는 입력이 포함되어 있으며 각각에는 해당 TargetVals 대상 값이 있습니다. inputvals [0]의 경우 [0, 0, 0]가 있으며 예상 출력은 [0, 0, 1] 인 TargetVals [0]입니다.

do_training == 1 인 경우 :
sess.run (tf.global_variables_initializer ())

범위 범위 (10001) :
I % 100 == 0 :
train_error = cross_entropy.eval (feed_dict = {x : inputvals, y_ : targetvals})
인쇄 ( “단계 % D, 트레이닝 오류 % G”% (i, train_error))
train_error <0.0005 : 부서지다 sess.run (train_step, feed_dict = {x : inputvals, y_ : targetVals})) save_trained == 1 인 경우 : 인쇄 ( "신경망을 % s. *"% (save_file)로 저장)) saver = tf.train.saver () Saver.Save (SESS, save_file) do_training 및 save_trained는 하드 코딩 될 수 있으며 각 사용마다 변경되거나 명령 줄 인수를 사용하여 설정할 수 있습니다. 우리는 먼저 모든 변수 작전을 거쳐 텐서를 초기화하게합니다. 그런 다음 최대 10001 번 동안 우리는 맨 아래에서 train_step tensor까지의 그래프를 실행합니다. 우리 그래프에 마지막으로 추가 한 것입니다. rmspropoptimizer를 사용하여 ratingvals의 op 또는 ops에 입력 범절 및 targetvals를 전달합니다. 이 단계는 주어진 입력이 해당 대상 출력에 가까운 무언가를 가져올 수 있도록 모든 가중치를 조정하는 단계입니다. 대상 출력과 실제 출력 간의 오류가 빨리 충분히 작 으면 루프에서 벗어납니다. 수천 개의 입 / 출력 쌍이 있으면 한 번에 하위 집합을 줄 수 있습니다. 우리가 이전에 말했습니다. 그러나 여기서 우리는 8 명만 가지고 있으며, 우리는 매번 그들 모두를주고 있습니다. 우리가 원한다면 네트워크를 파일에 저장할 수도 있습니다. 일단 그것이 잘 훈련되면 우리는 그것을 다시 훈련 할 필요가 없습니다. 그렇지 않으면 우리가 훈련하지 않으면 파일에서로드해야합니다. 인쇄 ( "% s"% (save_file)에서 신경 네트워크로드)) saver = tf.train.saver () saver.restore (SESS, save_file) # 참고 : 복원 모두로드 및 변수 초기화 우리가 훈련하지 않으면 훈련 된 네트워크를 파일에서로드하십시오. 파일에는 변수 OP가있는 텐서의 값만 포함됩니다. 그래프의 구조가 포함되어 있지 않습니다. 그래서 이미 훈련 된 그래프를 실행할 때도 그래프를 만드는 코드가 여전히 필요합니다. 메호 그래프를 사용하여 파일에서 그래프를 저장하고로드하는 방법이 있지만 여기서는 그렇게하지 않습니다. 인쇄 ( '\ NCounting부터 시작 : 0 0 0')) res = sess.run (결과, feed_dict = {x : [[0, 0, 0]]}) 인쇄 ( '% g % g % g'% % (res [0] [0], res [0] [1], res [0] [2]))

Categories:

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *