Я хотел рассчитать 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_))
, он бы просто определил граф вычислений без выполнения реального расчета.
Казалось, что только тензорная функция может быть использована в модели тензорного потока. Как использовать пользовательскую функцию в режиме тензорного потока?