Как использовать самоопределяемую функцию в модели тензорного потока? - PullRequest
0 голосов
/ 30 августа 2018

Я хотел рассчитать MSE двух матриц только по некоторым элементам в этой матрице. Я определил функцию, подобную этой:

def calDeltaY(self, Y, Y_):
    sum = 0.0
    for row in range(self.nm):
        for col in range(self.nu):
            if 1 == self.r[row][col]:
                sum += (Y[row][col] - Y_[row][col])*(Y[row][col] - Y_[row][col])
                print('calDeltaY: {0}.{1}  !'.format(row, col))
    return sum

Я использовал 1 == self.r[row][col] только для вычисления элементов, для которых определено значение. Затем я построил модель тензорного потока, чтобы использовать эту функцию:

def build_model(self):
    self.Y_ = tf.placeholder(shape=[self.nm, self.nu], dtype=tf.float32, name='Y_')
    self.X = tf.Variable(tf.truncated_normal(shape=[self.nm, self.n], mean=0.0, stddev=0.01, seed=1.0), dtype=tf.float32, name='X')
    self.UT = tf.Variable(tf.truncated_normal(shape=[self.n, self.nu], mean=0.0, stddev=0.01, seed=1.0), dtype=tf.float32, name='X')
    self.Y = tf.matmul(self.X, self.UT)
    self.L = self.calDeltaY(self.Y, self.Y_)
    # self.L = tf.reduce_sum((self.Y - self.Y_)*(self.Y - self.Y_))
    self.J = self.L + self.lanmeda*tf.reduce_sum(self.X**2) + self.lanmeda*tf.reduce_sum(self.UT**2)
    self.train_step = tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, 
            beta2=0.999, epsilon=1e-08, use_locking=False, 
            name='Adam').minimize(self.J)

Но я обнаружил, что когда я вызываю функцию build_model, строка кода self.L = self.calDeltaY(self.Y, self.Y_) будет фактически выполнена. Если бы вместо этого я использовал self.L = tf.reduce_sum((self.Y - self.Y_)*(self.Y - self.Y_)), он бы просто определил граф вычислений без выполнения реального расчета.

Казалось, что только тензорная функция может быть использована в модели тензорного потока. Как использовать пользовательскую функцию в режиме тензорного потока?

...