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

VAE生成HVAC合成数据时遇TypeError:KerasTensor对象不可调用

解决VAE生成HVAC合成数据时的TypeError问题

问题重现

运行基于VAE生成HVAC合成数据的代码时,触发如下错误:

TypeError: 'KerasTensor' object is not callable

错误发生在代码行:

vae_output = MyModel(input_shape)(inputs=vae_input)

错误原因

MyModel函数当前返回的是Dense层的输出张量(KerasTensor),而非可调用的Model对象。将张量当作模型调用自然会触发"不可调用"的错误。此外,原代码的VAE架构拆分混乱,之前定义的编码器核心组件(z_mean、z_log_var等)完全未被使用,实际只实现了普通MLP逻辑,没有搭建出真正的VAE结构。

修复步骤

  1. 修正模型定义逻辑:让模型函数返回完整的Model实例,而非输出张量。
  2. 规范模型调用方式:直接将输入张量传入模型,无需指定inputs=参数。
  3. 整合完整VAE架构:将编码器(均值、方差采样)和解码器部分整合,实现变分自动编码器的核心逻辑。

修正后的完整代码

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import joblib
import os
from keras.callbacks import EarlyStopping
from keras.losses import mse
from keras.layers import Input, Dense, Dropout, Lambda
from keras import backend as K
from keras.models import Model
import tensorflow as tf
from tensorflow import keras

# 加载数据
data_initial = pd.read_excel('hvac.xlsx', header=None)
data = data_initial.iloc[0:96, 0:3]

# 定义生成样本数量
n_samples = 1000

# 自定义类型转换层
class CastLayer(keras.layers.Layer):
    def __init__(self, output_type='float32', **kwargs):
        self.output_type = output_type
        super(CastLayer, self).__init__(**kwargs)

    def call(self, inputs):
        return tf.cast(inputs, self.output_type)

    def compute_output_shape(self, input_shape):
        return input_shape

# VAE参数配置
original_dim = 3
input_shape = (original_dim,)
intermediate_dim = 512
batch_size = 1
latent_dim = 10
epochs = 10000

# ---------------------------
# 编码器部分
# ---------------------------
inputs = Input(shape=input_shape, name='encoder_input')
h = Dense(intermediate_dim, activation='relu')(inputs)
h = Dropout(0.2)(h)
z_mean = Dense(latent_dim, name='z_mean')(h)
z_log_var = Dense(latent_dim, name='z_log_var')(h)

# 采样函数:动态获取批量大小,避免固定值限制
def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim), mean=0., stddev=1.)
    return z_mean + K.exp(z_log_var / 2) * epsilon

z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])

# 构建编码器模型
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')

# ---------------------------
# 解码器部分
# ---------------------------
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
decoder_h = Dense(intermediate_dim, activation='relu')(latent_inputs)
decoder_outputs = Dense(original_dim, activation='linear')(decoder_h)

# 构建解码器模型
decoder = Model(latent_inputs, decoder_outputs, name='decoder')

# ---------------------------
# 完整VAE模型
# ---------------------------
# 编码器输出采样z,传入解码器得到重构输出
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs, name='vae')

# 定义VAE核心损失函数(重构损失+KL散度)
reconstruction_loss = mse(inputs, outputs)
reconstruction_loss *= original_dim
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.sum(kl_loss, axis=-1)
kl_loss *= -0.5
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer='adam')

# 可选:查看模型结构
vae.summary()

关键说明

  • 重构了VAE的完整架构,整合了编码器的采样逻辑与解码器的重构逻辑。
  • 采样函数改用动态批量大小,避免固定batch_size导致的兼容性问题。
  • 添加了VAE特有的损失函数组合,这是模型训练的核心依据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:03:10