You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Keras神经网络权重注册到GPflow Kernel以实现训练?

解决GPFlow中神经核函数的Keras权重无法被训练的问题

问题的核心在于:GPFlow的Kernel类继承自Module,只会自动追踪自身属性中的GPFlow Parameter/Variable以及其他GPFlow Module实例的变量。而你直接使用的Keras原生Sequential模型,其变量属于TensorFlow原生变量,不会被GPFlow自动纳入追踪范围,因此无法被GPFlow的优化器训练。

以下是两种可行的解决方法:


方法一:使用GPFlow内置层构建神经网络

GPFlow提供了和Keras兼容的层(比如gpflow.layers.Dense),这些层的参数都是GPFlow的Parameter,会被自动识别并纳入变量追踪体系。修改后的代码如下:

import gpflow
import tensorflow as tf
from gpflow.layers import Dense

class AttentiveKernel(gpflow.kernels.Kernel):
    def __init__(self, 
                 lengthscales, 
                 dim_hidden=10,
                 amplitude=1.0,
                 ndim=2): 
        super().__init__()
        with self.name_scope:
            self.num_lengthscales = len(lengthscales)
            # 用GPFlow Parameter替代原生tf.Variable,支持约束(比如振幅为正)
            self._free_amplitude = gpflow.Parameter(
                amplitude, 
                transform=gpflow.utilities.positive(),
                dtype=gpflow.default_float()
            )
            self.lengthscales = tf.Variable(
                lengthscales, 
                shape=[self.num_lengthscales], 
                trainable=False,
                dtype=gpflow.default_float()
            )
            
            # 使用GPFlow的Dense层构建网络
            self.nn = tf.keras.Sequential([
                tf.keras.layers.InputLayer(shape=[ndim], batch_size=None),
                Dense(dim_hidden, activation='tanh'), 
                Dense(dim_hidden, activation='tanh'),
                Dense(self.num_lengthscales, activation='softmax')
            ])

方法二:将Keras模型包装为GPFlow Module

如果必须使用Keras原生层,可以把Keras模型封装成GPFlow的Module子类,让GPFlow能识别并追踪其内部变量:

import gpflow
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 自定义GPFlow Module包裹Keras模型
class KerasNN(gpflow.Module):
    def __init__(self, ndim, dim_hidden, num_outputs):
        super().__init__()
        self.model = keras.Sequential([
            layers.InputLayer(shape=[ndim], batch_size=None),
            layers.Dense(dim_hidden, activation='tanh'), 
            layers.Dense(dim_hidden, activation='tanh'),
            layers.Dense(num_outputs, activation='softmax')
        ])
        self.model.build()
        
    def __call__(self, x):
        return self.model(x)

class AttentiveKernel(gpflow.kernels.Kernel):
    def __init__(self, 
                 lengthscales, 
                 dim_hidden=10,
                 amplitude=1.0,
                 ndim=2): 
        super().__init__()
        with self.name_scope:
            self.num_lengthscales = len(lengthscales)
            self._free_amplitude = gpflow.Parameter(
                amplitude, 
                transform=gpflow.utilities.positive(),
                dtype=gpflow.default_float()
            )
            self.lengthscales = tf.Variable(
                lengthscales, 
                shape=[self.num_lengthscales], 
                trainable=False,
                dtype=gpflow.default_float()
            )
            
            # 用自定义GPFlow Module替代原生Keras Sequential
            self.nn = KerasNN(ndim, dim_hidden, self.num_lengthscales)

验证方法

创建Kernel实例后,运行以下代码验证变量是否被正确追踪:

kernel = AttentiveKernel(lengthscales=[0.05, 0.5, 1.0, 2.0])
# 打印所有可训练变量
print(kernel.trainable_variables)
# 或者用GPFlow的工具打印详细参数信息
gpflow.utilities.print_summary(kernel)

此时神经网络的权重会出现在变量列表中,接入高斯过程后即可被正常训练。

内容的提问来源于stack exchange,提问作者ItsKalvik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:58:10