2017-12-24 21 views
1

テンソルフローによるカスタマイズされたペアワイズ損失関数を実装しています。簡単な例では、訓練データは、5つのインスタンスを有し、そのラベルがテンソルフローによるペアワイズ損失関数はどのように実装できますか?

y=[0,1,0,0,0] 

が予測は、この場合

y'=[y0',y1',y2',y3',y4'] 

であると想定し、簡単な損失関数は

min f=(y0'-y1')+(y2'-y1')+(y3'-y1')+(y4'-y1') 

であってもよいですy[1]=1以降。私はちょうどy0',y2',y3',y4'の予測がy1'のように遠いことを確認したいと思う。

しかし、テンソルフローで実装する方法はわかりません。私の現在の実装では、私はミニバッチを使用し、 y = tf.placeholder("float", [None, 1])のようなプレースホルダとしてトレーニングラベルを設定します。この場合、訓練データのサイズがわからず、 "None"のためにラベル "1"または "0"を持つため、損失関数を構築することはできません。

誰もテンソルフローで行う方法を提案できますか?ありがとう!

+0

「y」に1が複数ある場合はどうなりますか? – Maxim

答えて

0

Y=[-1,1,-1,-1,-1]に変換

、我々はこのようなラベル、y=[0,1,0,0,0]があるとします。

予測は、だから、

y'=[y0',y1',y2',y3',y4']で、目的は、上記の式は、あなたの文の等価であることを分f = -mean(Y*y')

お知らせです。

1

のモデルを前処理することができます。

まず入力の2つの群に、正および負のインスタンスを区切る:例えば

# data.py 

import random 

def load_data(data_x, data_y): 
    """ 
    data_x: list of all instances 
    data_y: list of their labels 
    """ 
    pos_x = [] 
    neg_x = [] 
    for x, y in zip(data_x, data_y): 
     if y == 1: 
      pos_x.append(x) 
     else: 
      neg_x.append(x) 

    ret_pos_x = [] 
    ret_neg_x = [] 

    # randomly sample k negative instances for each positive one 
    for x0 in pos_x: 
     for x1 in random.sample(neg_x, k): 
      ret_pos_x.append(x0) 
      ret_neg_x.append(x1) 

    return ret_pos_x, ret_neg_x 

次に、モデルに、2つのプレースホルダの代わりに1規定:

# model.py 

import tensorflow as tf 

class Model: 
    def __init__(self): 
     # shape: [batch_size, dim_x] (assume x are vectors of dim_x) 
     self.pos_x = tf.placeholder(tf.float32, [None, dim_x]) 
     self.neg_x = tf.placeholder(tf.float32, [None, dim_x]) 

     # shape: [batch_size] 
     # NOTE: variables in some_func should be reused 
     self.pos_y = some_func(self.pos_x) 
     self.neg_y = some_func(self.neg_x) 

     # A more generalized form: loss = max(0, margin - y+ + y-) 
     self.loss = tf.reduce_mean(tf.maximum(0.0, 1.0 - self.pos_y + self.neg_y)) 
     self.train_op = tf.train.AdamOptimizer(learning_rate).minimize(self.loss) 

最後に、データを繰り返してモデルにフィードします。

# main.py 

import tensorflow as tf 

from model import Model 
from data import load_data 

data_x, data_y = ... # read from your file 
pos_x, neg_x = load_data(data_x, data_y) 

model = Model() 
with tf.Session() as sess: 
    # TODO: randomize the order 
    for beg in range(0, len(pos_x), batch_size): 
     end = min(beg + batch_size, len(pos_x)) 

     feed_dict = { 
      model.pos_x: pos_x[beg:end], 
      model.neg_x: neg_x[beg:end] 
     } 
     _, loss = sess.run([model.train_op, model.loss], feed_dict) 
     print "%s/%s, loss = %s" % (beg, len(pos_x), loss) 
関連する問題