示例#1
0
 def to_v(self, x):
     for k in x.keys():
         x[k] = x[k] / self.message_to_x[k]
     p = tf.concat([xx.precision() for k, xx in x.items()], -1)
     mtp = tf.concat([xx.mean_times_precision() for k, xx in x.items()], -1)
     self.message_to_v = GaussianArray.from_array_natural(p, mtp)
     return self.message_to_v
示例#2
0
 def to_vector(self):
     parts = dict()
     for name in self._name:
         parts[name] = self.parts[name] / self.message_to_parts[name]
     p = tf.concat([part.precision() for k, part in parts.items()], -1)
     mtp = tf.concat([part.mean_times_precision() for k, part in parts.items()], -1)
     message_to_vector = GaussianArray.from_array_natural(p, mtp)
     self.vector.update(self.message_to_vector, message_to_vector)
     self.message_to_vector = message_to_vector
示例#3
0
 def to_x(self, v):
     v = v / self.message_to_v
     p, mtp = v.natural()
     for name, begin, size in zip(self._name, self._begin, self._size):
         self.message_to_x[name] = GaussianArray.from_array_natural(
             tf.slice(p, begin, size),
             tf.slice(mtp, begin, size)
         )
     return self.message_to_x
示例#4
0
 def to_parts(self):
     v = self.vector / self.message_to_vector
     p, mtp = v.natural()
     for name, begin, size in zip(self._name, self._begin, self._size):
         message_to_part = GaussianArray.from_array_natural(
             tf.slice(p, begin, size),
             tf.slice(mtp, begin, size)
         )
         self.parts[name].update(self.message_to_parts[name], message_to_part)
         self.message_to_parts[name] = message_to_part
示例#5
0
 def to_x(self, x, result, weight, bias):
     result = result / self.message_to_result
     x = x / self.message_to_x
     m = (tf.expand_dims(result.mean() - bias - tf.tensordot(x.mean(), weight, 1), 1) +
          tf.expand_dims(x.mean(), -1) * tf.expand_dims(weight, 0)) / tf.expand_dims(weight, 0)
     v = (tf.expand_dims(result.log_var() + tf.tensordot(x.log_var(), weight ** 2, 1), 1) -
          tf.expand_dims(x.log_var(), -1) * tf.expand_dims(weight ** 2, 0)) / tf.expand_dims(weight ** 2, 0)
     p = 1.0 / v
     mtp = m * p
     self.message_to_x = GaussianArray.from_array_natural(
         tf.reduce_sum(p, -1),
         tf.reduce_sum(mtp, -1)
     )
     return self.message_to_x
示例#6
0
 def to_parent(self):
     result = self.child / self.message_to_child
     x = self.parent / self.message_to_parent
     weight = self.weight.value()
     bias = self.bias.value()
     m = (tf.expand_dims(result.mean() - bias - tf.tensordot(x.mean(), weight, 1), 1) +
          tf.expand_dims(x.mean(), -1) * tf.expand_dims(weight, 0)) / tf.expand_dims(weight, 0)
     v = (tf.expand_dims(result.log_var() + tf.tensordot(x.log_var(), weight ** 2, 1), 1) -
          tf.expand_dims(x.log_var(), -1) * tf.expand_dims(weight ** 2, 0)) / tf.expand_dims(weight ** 2, 0)
     p = 1.0 / v
     mtp = m * p
     message_to_parent = GaussianArray.from_array_natural(
         tf.reduce_sum(p, -1),
         tf.reduce_sum(mtp, -1)
     )
     self.parent.update(self.message_to_parent, message_to_parent)
     self.message_to_parent = message_to_parent