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

如何修复'Tensor'对象无'numpy'属性报错 含Lorenz系统神经网络训练代码

报错根因
  • 自定义的logsig、radbas激活函数错误混用了TensorFlow张量操作和NumPy运算:你调用的K.eval(x)本质是提取张量对应的numpy数组值,但模型训练时默认运行在计算图模式下,张量没有绑定具体运行时数值,无法调用.numpy()方法,直接触发报错。
  • 激活函数中返回K.variable的写法不符合规范,激活函数只需返回和输入维度一致的张量即可,不需要额外封装为变量。
  • 任务属于连续值预测的回归任务,错误使用了分类场景的categorical_crossentropy损失函数,即便解决报错也无法正常训练收敛。
修正方案

直接替换自定义激活函数的实现,全部使用TensorFlow原生算子实现,同时修改损失函数为回归场景常用的均方误差(MSE)即可。
修正后的完整可运行代码如下:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from matplotlib import rcParams
from scipy import integrate
from mpl_toolkits.mplot3d import Axes3D

## Simulate the Lorenz System
dt = 0.01
T = 8
t = np.arange(0,T+dt,dt)
beta = 8/3
sigma = 10
rho = 28

nn_input = np.zeros((100*(len(t)-1),3))
nn_output = np.zeros_like(nn_input)

fig,ax = plt.subplots(1,1,subplot_kw={'projection': '3d'})

def lorenz_deriv(x_y_z, t0, sigma=sigma, beta=beta, rho=rho):
    x, y, z = x_y_z
    return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]

np.random.seed(123)
x0 = -15 + 30 * np.random.random((100, 3))
x_t = np.asarray([integrate.odeint(lorenz_deriv, x0_j, t)
                  for x0_j in x0])
for j in range(100):
    nn_input[j*(len(t)-1):(j+1)*(len(t)-1),:] = x_t[j,:-1,:]
    nn_output[j*(len(t)-1):(j+1)*(len(t)-1),:] = x_t[j,1:,:]
    x, y, z = x_t[j,:,:].T
    ax.plot(x, y, z,linewidth=1)
    ax.scatter(x0[j,0],x0[j,1],x0[j,2],color='r')

ax.view_init(18, -113)
plt.show()

## Neural Net
# 全部用TF原生算子实现激活函数,不要混用NumPy操作
def logsig(x):
    return 1 / (1 + tf.exp(-x))

def radbas(x):
    return tf.exp(-tf.square(x))

def purelin(x):
    return x

# 统一使用tf.keras接口,避免版本兼容问题
model = tf.keras.Sequential([
    tf.keras.layers.Dense(3, activation=logsig),
    tf.keras.layers.Dense(3, activation=radbas),
    tf.keras.layers.Dense(3, activation=purelin)
])

sgd_optimizer = tf.keras.optimizers.SGD(learning_rate=0.001, momentum=0.9)
# 损失函数替换为回归任务用的均方误差
model.compile(optimizer=sgd_optimizer, loss='mse')
model.fit(nn_input, nn_output, epochs=30, validation_split=0.2)
补充优化建议
  • 可以适当调大隐藏层的节点数,比如把前两层的输出维度改成16或32,提升网络的非线性拟合能力,更适配Lorenz系统的混沌特性。
  • 训练轮次可以增加到100~200轮,足够让模型收敛到较低的损失值。

内容的提问来源于stack exchange,提问作者red shift plus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:02