TensorFlow가 무작위 훈련과 배치 훈련을 구현하는 방법

不言
풀어 주다: 2018-04-28 10:00:45
원래의
2579명이 탐색했습니다.

이 글에서는 주로 TensorFlow가 Random Training과 Batch Training을 구현하는 방법을 소개합니다. 이제 이를 공유하고 참고용으로 제공합니다. 와서 함께 살펴보세요

TensorFlow는 모델 변수를 업데이트합니다. 한 번에 하나의 데이터 포인트에서 작동하거나 한 번에 많은 양의 데이터에서 작동할 수 있습니다. 단일 훈련 예제로 작업하면 "기발한" 학습 프로세스가 발생할 수 있지만 대규모 배치를 사용한 훈련은 계산 비용이 많이 들 수 있습니다. 어떤 유형의 훈련을 선택하느냐는 기계 학습 알고리즘의 융합에 매우 중요합니다.

TensorFlow가 역전파가 작동하도록 가변 기울기를 계산하려면 하나 이상의 샘플에서 손실을 측정해야 합니다.

Random 훈련은 훈련 데이터와 목표 데이터 쌍을 무작위로 샘플링하여 훈련을 완료합니다. 또 다른 옵션은 대규모 배치 훈련에서 기울기 계산을 위한 손실을 평균화하는 것이며, 배치 훈련 크기를 전체 데이터 세트로 한 번에 확장할 수 있습니다. 여기서는 무작위 훈련과 배치 훈련을 사용하여 회귀 알고리즘의 이전 예를 확장하는 방법을 보여줍니다.

배치 훈련과 무작위 훈련의 차이점은 최적화 방법과 수렴입니다.

# 随机训练和批量训练
#----------------------------------
#
# This python function illustrates two different training methods:
# batch and stochastic training. For each model, we will use
# a regression model that predicts one model variable.
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
# 随机训练:
# Create graph
sess = tf.Session()
# 声明数据
x_vals = np.random.normal(1, 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[1], dtype=tf.float32)
y_target = tf.placeholder(shape=[1], dtype=tf.float32)
# 声明变量 (one model parameter = A)
A = tf.Variable(tf.random_normal(shape=[1]))
# 增加操作到图
my_output = tf.multiply(x_data, A)
# 增加L2损失函数
loss = tf.square(my_output - y_target)
# 初始化变量
init = tf.global_variables_initializer()
sess.run(init)
# 声明优化器
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)
loss_stochastic = []
# 运行迭代
for i in range(100):
 rand_index = np.random.choice(100)
 rand_x = [x_vals[rand_index]]
 rand_y = [y_vals[rand_index]]
 sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
 if (i+1)%5==0:
  print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
  temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
  print('Loss = ' + str(temp_loss))
  loss_stochastic.append(temp_loss)
# 批量训练:
# 重置计算图
ops.reset_default_graph()
sess = tf.Session()

# 声明批量大小
# 批量大小是指通过计算图一次传入多少训练数据
batch_size = 20

# 声明模型的数据、占位符
x_vals = np.random.normal(1, 0.1, 100)
y_vals = np.repeat(10., 100)
x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# 声明变量 (one model parameter = A)
A = tf.Variable(tf.random_normal(shape=[1,1]))

# 增加矩阵乘法操作(矩阵乘法不满足交换律)
my_output = tf.matmul(x_data, A)

# 增加损失函数
# 批量训练时损失函数是每个数据点L2损失的平均值
loss = tf.reduce_mean(tf.square(my_output - y_target))

# 初始化变量
init = tf.global_variables_initializer()
sess.run(init)

# 声明优化器
my_opt = tf.train.GradientDescentOptimizer(0.02)
train_step = my_opt.minimize(loss)

loss_batch = []
# 运行迭代
for i in range(100):
 rand_index = np.random.choice(100, size=batch_size)
 rand_x = np.transpose([x_vals[rand_index]])
 rand_y = np.transpose([y_vals[rand_index]])
 sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
 if (i+1)%5==0:
  print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)))
  temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
  print('Loss = ' + str(temp_loss))
  loss_batch.append(temp_loss)

plt.plot(range(0, 100, 5), loss_stochastic, 'b-', label='Stochastic Loss')
plt.plot(range(0, 100, 5), loss_batch, 'r--', label='Batch Loss, size=20')
plt.legend(loc='upper right', prop={'size': 11})
plt.show()
로그인 후 복사

출력:

단계 #5 A = [ 1.47604525]
손실 = [ 72.55678558]
단계 #10 A = [ 3.01128507]
손실 = [ 48.229 86221]
15단계 A = [4.27042341 ]
손실 = [ 28.97912598]
단계 #20 A = [ 5.2984333]
손실 = [ 16.44779968]
단계 #25 A = [ 6.17473984]
손실 = [ 16.373312]
단계 #30 A = [ 6 .89866304]
손실 = [ 11.71054649 ]
단계 #35 A = [ 7.39849901]
손실 = [ 6.42773056]
단계 #40 A = [ 7.84618378]
손실 = [ 5.92940331]
단계 #45 A = [ 8.15709 782]
손실 = [ 0 .2142024 ]
단계 #50 A = [ 8.54818344]
손실 = [ 7.11651039]
단계 #55 A = [ 8.82354641]
손실 = [ 1.47823763]
단계 #60 A = [ 9.07896614]
손실 = [ 3.08244276 ]
65단계 A = [ 9.24868107]
손실 = [ 0.01143846]
단계 #70 A = [ 9.36772251]
손실 = [ 2.10078788]
단계 #75 A = [ 9.49171734]
손실 = [ 3.9091370 1]
단계 #80 A = [ 9 . 6622715]
손실 = [ 4.80727625 ]
단계 #85 A = [ 9.73786926]
손실 = [ 0.39915398]
단계 #90 A = [ 9.81853104]
손실 = [ 0.14876099]
95단계 A = [ 9.90371323]
손실 = [ 0 .01657014]
단계 #100 A = [ 9.86669159]
손실 = [ 0.444787]
단계 #5 A = [[ 2.34371352]]
손실 = 58.766
단계 #10 A = [[ 3.74766445]]
손실 = 38.4875
15단계 A = [[ 4.88928795 ]]
손실 = 27.5632
20단계 A = [[ 5.82038736]]
손실 = 17.9523
25단계 A = [[ 6.58999157]]
손실 = 13.32 45
30단계 A = [[ 7.20851326 ]]
손실 = 8.68099
단계 #35 A = [[ 7.71694899]]
손실 = 4.60659
단계 #40 A = [[ 8.1296711]]
손실 = 4.70107
단계 #45 = [[ 8.47107315] ]
손실 = 3.28318
단계 #50 A = [[ 8.74283409]]
손실 = 1.99057
단계 #55 A = [[ 8.98811722]]
손실 = 2.66906
단계 #60 A = [[ 9.18062305 ]]
손실 = 3.26207
단계 #65 A = [[ 9.31655025 ]]
손실 = 2.55459
단계 #70 A = [[ 9.43130589]]
손실 = 1.95839
단계 #75 A = [[ 9.55670166]]
손실 = 1.465 04
스텝 #80A = [[ 9.6354847] ]
손실 = 1.49021
단계 #85 A = [[ 9.73470974]]
손실 = 1.53289
단계 #90 A = [[ 9.77956581]]
손실 = 1.52173
단계 #95 = [[ 9.83666706] ]
손실 = 0.819207
단계 #100 A = [[ 9.85569191]]
손실 = 1.2197


훈련 유형 장점 단점
무작위 훈련 로컬 최소값을 벗어남 일반적으로 업데이트 필요 수렴하려면 여러 번의 반복이 필요함
배치 훈련 최소 손실을 빠르게 확보 더 많은 컴퓨팅 리소스 소비

관련 권장 사항:

A tensorflow1.0 풀링 계층(풀링) 및 전체 연결 계층(고밀도)에 대한 간략한 이야기

Tensorflow 모델 저장 및 복원에 대한 간략한 토론

위 내용은 TensorFlow가 무작위 훈련과 배치 훈련을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿