2017-11-23 20 views
1

私の仕事はVGGベースのネットワークを通して顕著性マップを得ることです。 しかし、私が想像しているように、ミスの損失は減少しません。だから、なぜ私の損失が減少しないのか分かりません。 ps。トレーニングデータセットはSALICONです。 は、ここに出力です:VGGベースのモデルを訓練して顕著性マップを得るときに損失が減少しない

training epoch 1, loss value is 0.041423566639423 
training epoch 2, loss value is 0.041423123329878 
training epoch 3, loss value is 0.041430559009314 
training epoch 4, loss value is 0.041424177587032 
... 
training epoch 20, loss value is 0.041416928172112 

そして私は率、損失関数を学習し、オプティマイザを変更しようと、誰もが働きません。

def shuffle(photo, grdtr, shuffle=True): 
    idx = np.arange(0, len(photo)) 
    if shuffle: 
     np.random.shuffle(idx) 
    photo_shuffle = [photo[i] for i in idx] 
    grdtr_shuffle = [grdtr[i] for i in idx] 

    return np.asarray(photo_shuffle), np.asarray(grdtr_shuffle) 


if __name__ == '__main__': 
    # create the model 
    x = tf.placeholder(tf.float32, [None, 48, 64, 3]) 
    y_ = tf.placeholder(tf.float32, [None, 48 * 64, 1]) 
    h = tf.placeholder(tf.float32, [None, 48, 64, 1]) 

    y = deepnn(x) 

    # define loss and optimizer 

    # cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=(tf.clip_by_value(y,1e-8,tf.reduce_max(y))), labels=y_)) 
    y_ = tf.nn.softmax(y_, dim=1) 

    cross_entropy = tf.reduce_mean(tf.pow(y - y_, 2)) 
    # cross_entropy = tf.reduce_mean(y_ * tf.log(y_/y)) #KL 
    tf.summary.scalar('loss', cross_entropy) 
    train_step = tf.train.AdamOptimizer(learning_rate = 0.001, beta1 = 0.9, beta2 = 0.999).minimize(cross_entropy) 
    # do the training 
    with tf.Session() as sess: 
     ... 

     # load the training data 
     photos = np.load('./data/npy/SALICON100/photos_queue.npy') 
     grdtrs = np.load('./data/npy/SALICON100/grdtrs_queue.npy') 
     photos = photos/255.0 
     grdtrs = grdtrs/255.0 
     EPOCH = 20 
     BATCH_SIZE = 20 
     TRAINING_SET_SIZE = 20 
     for j in range(EPOCH): 
      # photos, grdtrs = shuffle(photos, grdtrs, shuffle=False) 
      grdtrs = np.resize(grdtrs, [TRAINING_SET_SIZE, 48, 64, 20]) 
      grdtrs = np.reshape(grdtrs,[TRAINING_SET_SIZE, 48 * 64, 20]) 
      _, loss_value, pred_y = sess.run([train_step, cross_entropy,y],feed_dict={x: photos[:20], y_: grdtrs[:20]}) 
      if (j + 1) % 1 == 0: 
       print('training epoch %d, loss value is %.15f' % (j + 1, loss_value)) 
      np.save('./data/20_photos_test/net_output.npy', pred) 
      np.save('./data/20_photos_test/net_grdtrs.npy', grdtrs[:20]) 

       # stop the queue threads and properly close the session 
     ... 

そして私は、SESにおけるテンソルについてのいくつかのコード入れ: はここに私のコードです、あなたが実際にあなたの列車のステップを実行することはありません投稿のコードでは

x = tf.placeholder(tf.float32, [None, 48, 64, 3]) 
y_ = tf.placeholder(tf.float32, [None, 48 * 64, 1]) 
y = deepnn(x) 
cross_entropy = tf.reduce_sum(tf.pow(y-y_sm,2)) 

答えて

1

を。実際にネットワークをトレーニングするには、sess.run(train_step, feed_dict)の行に沿って何かを呼び出す必要があります。あなたのネットワークを訓練しない場合、損失は目立たなくなりません。

また、ラベルにsoftmaxを使用してもよろしいですか?

+0

申し訳ありませんが、実際には 'sess.run'を呼び出していますので、私は' loss_value'を得ることができます。私は前に私の質問に 'sess.run'を投稿しませんでした。そのために残念。 –

+0

実際のトレーニングコードはコードスニペットに含まれていません。関連するコードを投稿しないと、あなたがしていることを伝えるのは難しいです。たとえば、あなたのコードではloss_valueが割り当てられていません。 –

+0

しかし、私はここにあまりにも多くのコードですbecuzより多くのコードを入力することはできません。 –

関連する問題