Tensorflow에서 특정한 변수만 최적화하는 방법(How to train particular variable in Tensorflow)

공대생의 팁 2017. 11. 26. 16:15


 최근 Tensorflow를 공부하면서 강화학습을 공부하고 있습니다. 오랜만에 Python을 다루는 것이기도 하며 인공신경망 기반의 인공지능도 구현할 수 있어 간단한 인공지능도 구현해보기도 합니다.


 이번 포스팅에서는 train을 하는 과정에서 특정한 변수만을 사용하여 조건을 minimize 하는 방법에 대해 알아보도록 하겠습니다.


 다음은 특정 Neural Network의 Output을 구현하는 과정을 나타낸 것입니다. 첫 번째 Output에서는 모든 Variable들을 훈련시키고 이후 새로운 Output을 구현하여 해당 Output layer만 minimize를 적용해보는 과정을 살펴볼 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
y_ = tf.placeholder(tf.float32, shape=[None, 9])
y_add = tf.placeholder(tf.float32, shape=[None, 10])
 
# Output layer(first)
W_fc2 = tf.Variable(tf.truncated_normal([5009], stddev=0.1))
b_fc2 = tf.Variable(tf.constant(0.1, shape=[9]))
y_hat=tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2)
 
# Output layer(additional)
W_fc3 = tf.Variable(tf.truncated_normal([50010], stddev=0.1))
b_fc3 = tf.Variable(tf.constant(0.1, shape=[10]))
y_hat2=tf.nn.softmax(tf.matmul(h_fc1, W_fc3) + b_fc3)
 
# Train and Evaluate the Model
cross_entropy = - tf.reduce_sum(y_*tf.log(y_hat))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
 
# Addition layer train
cross_entropy2 = -tf.reduce_sum(y_add*tf.log(y_hat2))
add_train = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy2, var_list=[W_fc3, b_fc3])
cs


 위 소스코드를 살펴보았을 때 두 개의 cross_entropy를 구현하였습니다. 첫 번째 output layer는 구현된 Neural Network 전체를 대상으로 최적화를 수행함으로 Optimizer 함수에서 cross_entropy를 변수로 하여 값을 구현합니다.


 다음으로 구현되는 cross_entropy2는 새로운 Output layer를 구현하여 기존의 output layer를 대체하게 됩니다. 이 때 기존에 구현된 Neural Network는 그대로 사용한 채 새로운 Output layer를 대상으로 Minimize를 수행하고자 합니다. 이 Optimizer 함수에서 cross_entropy2 변수 뿐 아니라 var_list 변수에 특정 변수만 최적화 시킬 수 있도록 설정할 수 있습니다. 이 때 해당 변수명을 list [] 형식으로 변수들을 입력해두면 해당 변수만 훈련되는 것을 직접 확인하실 수 있습니다.


300x250