tensorflowで以下のようなニューラルネット(Domain adversarial neuralnetwork)を組んで学習させていたのですが,feature extractorと書いてある部分のLSTM層のところにdropout(tf.nn.dropout)を挟んだところ,学習が進まなくなってしまいました。(labelの二値分類が0.5の精度からほとんど動かない。dropout挟む前は普通に学習できていた)
dropout層の後の出力を可視化してみてみたのですが,dropoutに入力する前の値と変化がありませんでした。。
tf.nn.dropoutの使い方が間違っているのでしょうか?ご存知の方教えていただけると助かります。
python
1 import tensorflow as tf 2 3 X = tf.placeholder(tf.float32, [None,time_steps,input_row], name='X') # Input data 4 Y_ind = tf.placeholder(tf.int32, [None], name='Y_ind') # Class index 5 D_ind = tf.placeholder(tf.int32, [None], name='D_ind') # Domain index 6 l = tf.placeholder(tf.float32, [], name='l') # Gradient reversal scaler 7 8 Y = tf.one_hot(Y_ind, 2) 9 D = tf.one_hot(D_ind, 3) 10 11 # Feature extractor 12 lstm_1 = tf.nn.rnn_cell.BasicLSTMCell(15, name='blstmc1') 13 lstm_2 = tf.nn.rnn_cell.BasicLSTMCell(15, name='blstmc2') 14 lstm_3 = tf.nn.rnn_cell.BasicLSTMCell(15, name='blstmc3') 15 16 lstm_out_1,states_op = tf.nn.dynamic_rnn(lstm_1,X,dtype=tf.float32,time_major=False) 17 lstm_out_1_drop = tf.nn.dropout(lstm_out_1, 0.5)##ここ 18 lstm_out_2,states_op = tf.nn.dynamic_rnn(lstm_2,lstm_out_1_drop,dtype=tf.float32,time_major=False) 19 lstm_out_2_drop = tf.nn.dropout(lstm_out_2, 0.5)##ここ 20 lstm_out_3,states_op = tf.nn.dynamic_rnn(lstm_3,lstm_out_2_drop,dtype=tf.float32,time_major=False) 21 22 lstm_out_last = lstm_out_3[:,-1,:] 23 24 W11 = weight_variable([15, 15]) 25 b11 = bias_variable([15]) 26 f_logit = tf.matmul(lstm_out_last, W11) + b11 27 feature_vector = tf.nn.softmax(f_logit) 28 29 # Label predictor 30 31 W1 = weight_variable([15, 2]) 32 b1 = bias_variable([2]) 33 p_logit = tf.matmul(feature_vector, W1) + b1 34 p = tf.nn.softmax(p_logit) 35 p_loss = tf.nn.softmax_cross_entropy_with_logits(logits=p_logit, labels=Y) 36 37 # Domain predictor 38 f_ = flip_gradient(feature_vector, l) 39 40 W2 = weight_variable([15, 8]) 41 b2 = bias_variable([8]) 42 h2 = tf.nn.relu(tf.matmul(f_, W2) + b2) 43 44 W3 = weight_variable([8, 3]) 45 b3 = bias_variable([3]) 46 d_logit = tf.matmul(h2, W3) + b3 47 d = tf.nn.softmax(d_logit) 48 d_loss = tf.nn.softmax_cross_entropy_with_logits(logits=d_logit, labels=D) 49 50 # Optimization 51 pred_loss = tf.reduce_sum(p_loss, name='pred_loss') 52 domain_loss = tf.reduce_sum(d_loss, name='domain_loss') 53 total_loss = tf.add(pred_loss, domain_loss, name='total_loss') 54 55 #for dann_train_op 56 dann_train_op = tf.train.AdamOptimizer().minimize(total_loss, name='dann_train_op') 57
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。