如何解决如何在gpflow中修复内核长度尺度的某些尺寸?
我有一个2d内核,
colorPixelFormat = .rgba16Float
if let caml = layer as? CAMetalLayer {
caml.wantsExtendedDynamicRangeContent = true
let name = CGColorSpace.extendedLinearITUR_2020
caml.colorspace = CGColorSpace(name: name)
let edrMetadata = CAEDRMetadata.hdr10(minLuminance: 0.5,maxLuminance: 1000,opticalOutputScale: 100)
caml.edrMetadata = edrMetadata
}
我想将长度比例尺固定在第二维,然后优化另一个。
我可以使用禁用所有长度比例优化,
let pipelineDescriptor = MTLRenderPipelineDescriptor()
pipelineDescriptor.sampleCount = 1
if(bIs10Bit == false){
pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm
}
else{
pipelineDescriptor.colorAttachments[0].pixelFormat = .rgba16Float
}
pipelineDescriptor.depthAttachmentPixelFormat = .invalid
pipelineDescriptor.vertexFunction = library.makeFunction(name: vertexName)
pipelineDescriptor.fragmentFunction = library.makeFunction(name: fragmentName)
guard let state = try? device.makeRenderPipelineState(descriptor: pipelineDescriptor) else {
print("create render pipeline state failed")
return nil
}
但是我不能仅将一个维度传递给该方法。
在GPy中,我们会调用k = gpflow.kernels.RBF(lengthscales=[24*5,1e-5])
m = gpflow.models.GPR(data=(X,Y),kernel=k,mean_function=None)
之类的东西。
也许我可以使用一个转换来大致实现这一目标(例如here),但这很复杂。
解决方法
GPflow为每个参数(例如内核的tf.Variable
)使用单个lengthscales
,而TensorFlow仅允许您整体更改变量的trainable
状态。对于任意维度,每个维度具有单独的参数并不容易实现,但是您可以轻松地对所需的内核进行子类化,并使用如下属性覆盖lengthscales
:
import gpflow
import tensorflow as tf
class MyKernel(gpflow.kernels.SquaredExponential): # or whichever kernel you want
@property
def lengthscales(self) -> tf.Tensor:
return tf.stack([self.lengthscale_0,self.lengthscale_1])
@lengthscales.setter
def lengthscales(self,value):
self.lengthscale_0 = gpflow.Parameter(value[0],transform=gpflow.utilities.positive())
self.lengthscale_1 = value[1] # fixed
然后,您只需使用k = MyKernel(lengthscales=[24*5,1e-5])
。 (尽管1e-5的长度比例看起来不正确!但这超出了此问题的范围。)
之所以可行,是因为超类的__init__
(在 gpflow.kernels.Stationary 中)分配了self.lengthscales = Parameter(lengthscales,transform=positive())
,因此在此自定义类中,它调用了属性设置器,后者又创建了两个独立的属性。然后,属性获取器将它们重新缝合在一起,以获得实际需要二维向量的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。