基于Keras等库训练拟合洛伦兹混沌系统的神经网络报错求助
问题解决方案
核心错误原因
- 自定义激活函数中使用
K.eval(x)尝试将计算图张量转换为numpy数组,Keras在构建计算图阶段张量没有对应的numpy属性,且不允许用numpy函数直接操作计算图内的张量 - 损失函数选择不符合任务类型:当前是拟合三维坐标连续值的回归任务,不能使用多分类任务的交叉熵损失
- 输出层维度不匹配:预测目标是3维坐标,最后一层全连接层输出维度设置为10不符合要求
修正代码片段
## 修正后的自定义激活函数,全部使用Keras后端张量运算,不涉及numpy转换 def logsig(x): return 1 / (1 + K.exp(-x)) def radbas(x): return K.exp(-K.square(x)) def purelin(x): return x # 修正模型结构和编译参数 model = Sequential() model.add(Dense(10, activation=logsig)) model.add(Dense(10, activation=radbas)) model.add(Dense(3, activation=purelin)) # 输出维度匹配X/Y/Z三个维度 sgd_optimizer = optimizers.SGD(momentum=0.9) model.compile(optimizer=sgd_optimizer, loss='mse') # 回归任务使用均方误差损失 model.fit(nn_input, nn_output, epochs=30, batch_size=32)
修改说明
- 所有激活函数内的运算都替换为Keras后端提供的张量运算接口,全程在计算图内完成运算,不会触发张量转numpy的操作,直接解决属性报错问题
- 输出层维度调整为3,和预测目标的维度对齐
- 损失函数替换为均方误差,匹配回归任务的优化目标,训练过程不会出现无意义的损失值
内容的提问来源于stack exchange,提问作者YIdirm
相关产品推荐
相关产品推荐

