【Chainer】 다층 퍼셉트론에 의한 XOR 학습
4007 단어 파이썬ChainerDeepLearning초보자기계 학습
소개
Chainer를 사용하고 싶다. 하지만 잘 모르겠다.
그렇다, 다층 퍼셉트론에 의한 XOR의 학습으로부터 처음 보자.
※Chainer를 사용할 수 있는 환경이 갖추어져 있는 전제로 본 기사는 쓰여져 있습니다.
이 기사에서 사용하는 코드
환경
학습 데이터
# Prepare dataset
source = [[0, 0], [1, 0], [0, 1], [1, 1]]
target = [[0], [1], [1], [0]]
dataset = {}
dataset['source'] = np.array(source, dtype=np.float32)
dataset['target'] = np.array(target, dtype=np.float32)
모델 정의
이번 이용하는 모델은 2입력, 1출력입니다.
N = len(source) # train data size
in_units = 2 # 入力層のユニット数
n_units = 2 # 隠れ層のユニット数
out_units = 1 # 出力層のユニット数
#モデルの定義
model = chainer.Chain(l1=L.Linear(in_units, n_units),
l2=L.Linear(n_units , out_units))
순전파
def forward(x, t):
h1 = F.sigmoid(model.l1(x))
return model.l2(h1)
학습
훈련 오차가 0.00001 미만이거나 epoch가 n_epoch 이상이 될 때까지 반복합니다.
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model)
# Learning loop
loss_val = 100
epoch = 0
while loss_val > 1e-5:
# training
x = chainer.Variable(xp.asarray(dataset['source'])) #source
t = chainer.Variable(xp.asarray(dataset['target'])) #target
model.zerograds() # 勾配をゼロ初期化
y = forward(x, t) # 順伝搬
loss = F.mean_squared_error(y, t) #平均二乗誤差
loss.backward() # 誤差逆伝播
optimizer.update() # 最適化
# 途中結果を表示
if epoch % 1000 == 0:
#誤差と正解率を計算
loss_val = loss.data
print 'epoch:', epoch
print 'x:\n', x.data
print 't:\n', t.data
print 'y:\n', y.data
print('train mean loss={}'.format(loss_val)) # 訓練誤差, 正解率
print ' - - - - - - - - - '
# n_epoch以上になると終了
if epoch >= n_epoch:
break
epoch += 1
#modelとoptimizerを保存
print 'save the model'
serializers.save_npz('xor_mlp.model', model)
print 'save the optimizer'
serializers.save_npz('xor_mlp.state', optimizer)
실행 결과
회귀 문제로 학습하고 있습니다.
예측할 때는 0.5이상이라면 1, 0.5미만이라면 0과 같이 역치를 결정할 필요가 있습니다.
$ python train_xor.py --gpu 1
epoch: 0
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[-0.62479508] # 0に近づいて欲しい
[-0.85900736] # 1に近づいて欲しい
[-0.4117983 ] # 1に近づいて欲しい
[-0.62129647]] # 0に近づいて欲しい
train mean loss=1.55636525154 # 訓練誤差 (小さくなってほしい)
- - - - - - - - -
epoch: 1000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.39130747]
[ 0.40636665]
[ 0.50217605]
[ 0.52426183]]
train mean loss=0.257050335407
- - - - - - - - -
...
- - - - - - - - -
epoch: 8000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.00557911]
[ 0.98262894]
[ 0.98446763]
[ 0.02371788]]
train mean loss=0.000284168170765
- - - - - - - - -
epoch: 9000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 5.99622726e-05] # 0に近づいた
[ 9.99812365e-01] # 1に近づいた
[ 9.99832511e-01] # 1に近づいた
[ 2.56299973e-04]] # 0に近づいた
train mean loss=3.31361960093e-08
- - - - - - - - -
save the model
save the optimizer
참고 기사
# Prepare dataset
source = [[0, 0], [1, 0], [0, 1], [1, 1]]
target = [[0], [1], [1], [0]]
dataset = {}
dataset['source'] = np.array(source, dtype=np.float32)
dataset['target'] = np.array(target, dtype=np.float32)
이번 이용하는 모델은 2입력, 1출력입니다.
N = len(source) # train data size
in_units = 2 # 入力層のユニット数
n_units = 2 # 隠れ層のユニット数
out_units = 1 # 出力層のユニット数
#モデルの定義
model = chainer.Chain(l1=L.Linear(in_units, n_units),
l2=L.Linear(n_units , out_units))
순전파
def forward(x, t):
h1 = F.sigmoid(model.l1(x))
return model.l2(h1)
학습
훈련 오차가 0.00001 미만이거나 epoch가 n_epoch 이상이 될 때까지 반복합니다.
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model)
# Learning loop
loss_val = 100
epoch = 0
while loss_val > 1e-5:
# training
x = chainer.Variable(xp.asarray(dataset['source'])) #source
t = chainer.Variable(xp.asarray(dataset['target'])) #target
model.zerograds() # 勾配をゼロ初期化
y = forward(x, t) # 順伝搬
loss = F.mean_squared_error(y, t) #平均二乗誤差
loss.backward() # 誤差逆伝播
optimizer.update() # 最適化
# 途中結果を表示
if epoch % 1000 == 0:
#誤差と正解率を計算
loss_val = loss.data
print 'epoch:', epoch
print 'x:\n', x.data
print 't:\n', t.data
print 'y:\n', y.data
print('train mean loss={}'.format(loss_val)) # 訓練誤差, 正解率
print ' - - - - - - - - - '
# n_epoch以上になると終了
if epoch >= n_epoch:
break
epoch += 1
#modelとoptimizerを保存
print 'save the model'
serializers.save_npz('xor_mlp.model', model)
print 'save the optimizer'
serializers.save_npz('xor_mlp.state', optimizer)
실행 결과
회귀 문제로 학습하고 있습니다.
예측할 때는 0.5이상이라면 1, 0.5미만이라면 0과 같이 역치를 결정할 필요가 있습니다.
$ python train_xor.py --gpu 1
epoch: 0
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[-0.62479508] # 0に近づいて欲しい
[-0.85900736] # 1に近づいて欲しい
[-0.4117983 ] # 1に近づいて欲しい
[-0.62129647]] # 0に近づいて欲しい
train mean loss=1.55636525154 # 訓練誤差 (小さくなってほしい)
- - - - - - - - -
epoch: 1000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.39130747]
[ 0.40636665]
[ 0.50217605]
[ 0.52426183]]
train mean loss=0.257050335407
- - - - - - - - -
...
- - - - - - - - -
epoch: 8000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.00557911]
[ 0.98262894]
[ 0.98446763]
[ 0.02371788]]
train mean loss=0.000284168170765
- - - - - - - - -
epoch: 9000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 5.99622726e-05] # 0に近づいた
[ 9.99812365e-01] # 1に近づいた
[ 9.99832511e-01] # 1に近づいた
[ 2.56299973e-04]] # 0に近づいた
train mean loss=3.31361960093e-08
- - - - - - - - -
save the model
save the optimizer
참고 기사
def forward(x, t):
h1 = F.sigmoid(model.l1(x))
return model.l2(h1)
훈련 오차가 0.00001 미만이거나 epoch가 n_epoch 이상이 될 때까지 반복합니다.
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model)
# Learning loop
loss_val = 100
epoch = 0
while loss_val > 1e-5:
# training
x = chainer.Variable(xp.asarray(dataset['source'])) #source
t = chainer.Variable(xp.asarray(dataset['target'])) #target
model.zerograds() # 勾配をゼロ初期化
y = forward(x, t) # 順伝搬
loss = F.mean_squared_error(y, t) #平均二乗誤差
loss.backward() # 誤差逆伝播
optimizer.update() # 最適化
# 途中結果を表示
if epoch % 1000 == 0:
#誤差と正解率を計算
loss_val = loss.data
print 'epoch:', epoch
print 'x:\n', x.data
print 't:\n', t.data
print 'y:\n', y.data
print('train mean loss={}'.format(loss_val)) # 訓練誤差, 正解率
print ' - - - - - - - - - '
# n_epoch以上になると終了
if epoch >= n_epoch:
break
epoch += 1
#modelとoptimizerを保存
print 'save the model'
serializers.save_npz('xor_mlp.model', model)
print 'save the optimizer'
serializers.save_npz('xor_mlp.state', optimizer)
실행 결과
회귀 문제로 학습하고 있습니다.
예측할 때는 0.5이상이라면 1, 0.5미만이라면 0과 같이 역치를 결정할 필요가 있습니다.
$ python train_xor.py --gpu 1
epoch: 0
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[-0.62479508] # 0に近づいて欲しい
[-0.85900736] # 1に近づいて欲しい
[-0.4117983 ] # 1に近づいて欲しい
[-0.62129647]] # 0に近づいて欲しい
train mean loss=1.55636525154 # 訓練誤差 (小さくなってほしい)
- - - - - - - - -
epoch: 1000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.39130747]
[ 0.40636665]
[ 0.50217605]
[ 0.52426183]]
train mean loss=0.257050335407
- - - - - - - - -
...
- - - - - - - - -
epoch: 8000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.00557911]
[ 0.98262894]
[ 0.98446763]
[ 0.02371788]]
train mean loss=0.000284168170765
- - - - - - - - -
epoch: 9000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 5.99622726e-05] # 0に近づいた
[ 9.99812365e-01] # 1に近づいた
[ 9.99832511e-01] # 1に近づいた
[ 2.56299973e-04]] # 0に近づいた
train mean loss=3.31361960093e-08
- - - - - - - - -
save the model
save the optimizer
참고 기사
$ python train_xor.py --gpu 1
epoch: 0
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[-0.62479508] # 0に近づいて欲しい
[-0.85900736] # 1に近づいて欲しい
[-0.4117983 ] # 1に近づいて欲しい
[-0.62129647]] # 0に近づいて欲しい
train mean loss=1.55636525154 # 訓練誤差 (小さくなってほしい)
- - - - - - - - -
epoch: 1000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.39130747]
[ 0.40636665]
[ 0.50217605]
[ 0.52426183]]
train mean loss=0.257050335407
- - - - - - - - -
...
- - - - - - - - -
epoch: 8000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 0.00557911]
[ 0.98262894]
[ 0.98446763]
[ 0.02371788]]
train mean loss=0.000284168170765
- - - - - - - - -
epoch: 9000
x:
[[ 0. 0.]
[ 1. 0.]
[ 0. 1.]
[ 1. 1.]]
t:
[[ 0.]
[ 1.]
[ 1.]
[ 0.]]
y:
[[ 5.99622726e-05] # 0に近づいた
[ 9.99812365e-01] # 1に近づいた
[ 9.99832511e-01] # 1に近づいた
[ 2.56299973e-04]] # 0に近づいた
train mean loss=3.31361960093e-08
- - - - - - - - -
save the model
save the optimizer
Reference
이 문제에 관하여(【Chainer】 다층 퍼셉트론에 의한 XOR 학습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ichiroex/items/673f5e74b8616f7d5141텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)