말로 들었을때 이해가 잘 안가서 print 찍어보면서 한줄 한줄 해석했다.
첫번째 레이어에서 학습한 fore_weight 를 뽑는다,
그후 두번째 레이어에서 Back_weight 값을fore_weight값과 동일하게 변경한다.
그리고, 변경된 back_weight값=fore_weight 을 이용해 역전파 학습을 시킨다.
나온 W값을 back_weight2에 저장한다.
그리고 첫번째 fore_weight1을 가져온후, back_weight2 값으로 저장한다(fore_weight2)
그 값을, 다시 순정파 학습을 시켜서 x 예측값을 얻는다.
'''실습 '''
xor = {'x1':[0,0,1,1], 'x2':[0,1,0,1], 'y':[0,1,1,1]}
XOR = pd.DataFrame(xor)
X = XOR.drop('y', axis=1)
y = XOR.y
#첫번째 학습 레이어
model = Sequential()
#단층 퍼셉트론 입력값 2 출력 1
model.add(Dense(1, input_dim=2, activation='linear'))
model.compile(loss='mse', optimizer='adam')
#순정파 학습
model.fit(X, y, epochs=5000, verbose=0)
#첫번째 레이어의 가중치를 저장한다.
fore_weight1 = model.get_weights() #학습한 가중치를 save한다.
print(fore_weight1[0][0][0])#0.49999866
print(fore_weight1[0][1][0])# 0.4999988
print('fore1',fore_weight1) # [[0.49655014],[0.4960262]] , ([0.25451878])
#뒤에서 하는 학습레이어 뒤에서 하기 때문에 (2,1)
back = Sequential()
back.add(Dense(2, input_dim=1, activation='sigmoid'))
print(back.get_weights(), '\n')
back.summary()
back_weight1 = back.get_weights() #가중치 save
print('back',back_weight1) # back [array([[1.0386578, 1.1136357]], dtype=float32), array([0., 0.], dtype=float32)]
print('back[000]',back_weight1[0][0][0]) # 0.8148669
print('back[001]',back_weight1[0][0][1]) #-1.1135976
back_weight1[0][0][0] = fore_weight1[0][0][0]
back_weight1[0][0][1] = fore_weight1[0][1][0]
print('fore1 가중치 로 변경된 back_weight1',back_weight1) # 변경된 back_weight1 [array([[0.49968332, 0.49990472]
#역전파 학습
back.set_weights(back_weight1) #fore1 값으로 변경된 back_weight1으로 가중치 설정
back.compile(loss='binary_crossentropy', optimizer='adam')
#핏할때 y,X 거꾸로 학습
back.fit(y, X, epochs=5000, verbose=0)
#학습한 가중치 가져오기
back.get_weights()
#weight2에 저장
back_weight2 = back.get_weights()
print('back_weight2',back_weight2) # [array([[3.8088257, 3.8077242]], dtype=float32), array([-3.137535 , -3.1367283], dtype=float32)]
print('back_weight2[0][0][0]',back_weight2[0][0][0]) # 3.8088257
print('back_weight2[0][0][1]',back_weight2[0][0][1]) # 3.8077242
#첫번째 가중치를 save한 것을 가져오기
fore_weight2 = model.get_weights() # fore_weight1
print('fore_weight2',fore_weight2) # fore_weight2 [array([[0.499996 ],[0.4999892]]), array([0.25000888], dtype=float32)]
print('fore_weight2[0][0][0]',fore_weight2[0][0][0]) # 0.499996
print('fore_weight2[0][1][0]',fore_weight2[0][1][0]) # 0.4999892
fore_weight2[0][0][0] = back_weight2[0][0][0] #3.8088257
fore_weight2[0][1][0] = back_weight2[0][0][1] #3.8077242
print('변경된 fore_weight2',fore_weight2) # 변경된 foreweight2 [array([[3.8088257 ], [3.8077242]], dtype=float32), array([0.25000036], dtype=float32)]
#
model.set_weights(fore_weight2) # 변경된 foreweight2
model.compile(loss='mse', optimizer='adam')
model.fit(X, y, epochs=5000, verbose=0) #순정파 학습
print(model.predict(X))
#x값 출력
# [[-0.5728012]
# [ 0.6191954]
# [ 0.6191955]
# [ 1.811192 ]]
'DeepLearning' 카테고리의 다른 글
DeepLearning - 인공 신경망 모델,weights 저장하기 (0) | 2022.10.28 |
---|---|
DeepLearning - XOR문제 Greedy Layer-wise 트레이닝으로 풀기 (1) | 2022.10.28 |
DeepLearning -레이어 , 활성화 함수 (0) | 2022.10.27 |
DeepLearning - 타이타닉 생존자 예측 (0) | 2022.10.26 |
DeepLearning - 입문 (손실함수,배치,옵티마이저) (0) | 2022.10.26 |