我想用 Gekko 创建一个回归 ANN 模型。我使用 tf_Keras 制作了这个模型,效果非常好。不幸的是,无法将 Keras 模型转换为 Gekko amp 模型。因此,我需要使用 Gekko Brain 类来制作它。然而,它未能找到解决方案。
这是我的数据集:ss10_1k_converted.csv
这是我在 Gekko 中的模型:
import pandas as pd
import numpy as np
from gekko import brain
# load dataset
df = pd.read_csv("ss10_1k_converted.csv")
# split data for train and test
train=df.sample(frac=0.8,random_state=200)
test=df.drop(train.index)
# Preparing training data
train_x = train[['D','V']].to_numpy()
train_x = np.transpose(train_x)
train_y = train['F'].to_numpy()
train_y = np.transpose(train_y).reshape(1,-1)
# Preparing test data
test_x = test[['D','V']].to_numpy()
test_y = test['F'].to_numpy().reshape(1,-1)
# neural network
b = brain.Brain()
b.input_layer(2)
b.layer(relu=61)
#b.layer(relu=61)
b.output_layer(1)
b.learn(train_x, train_y, obj=2)
这是错误:
EXIT: Restoration Failed!
An error occured.
The error code is -2
---------------------------------------------------
Solver : IPOPT (v3.12)
Solution time : 179.147199999999 sec
Objective : 2064584.02728447
Unsuccessful with error code 0
---------------------------------------------------
Creating file: infeasibilities.txt
@error: Solution Not Found
完全错误 --> 链接
请让我知道问题是什么。
谢谢你
由于输入数据的某些限制或问题,模型似乎无法找到解决方案。以下是一些可以帮助您解决问题的建议:
检查数据:确保输入数据(train_x 和 train_y)格式正确且不包含任何缺失值或异常值。您可以使用 pandas 的
describe()
和 info()
函数来检查数据。
标准化数据:如果输入数据具有不同的尺度,则可能会导致模型出现问题。您可以尝试使用最小-最大缩放或标准化等技术将数据标准化为通用比例。
增加层数或神经元数量:当前模型只有一个隐藏层,有 61 个神经元。您可以尝试增加层数或神经元数量,看看是否有助于模型找到更好的解决方案。
更改激活函数:当前模型使用ReLU激活函数。您可以尝试将激活函数更改为其他类型,例如 sigmoid 或 tanh,看看是否可以改进解决方案。
提高学习率:学习率是一个超参数,控制优化算法每次迭代的步长。您可以尝试提高学习率,看看是否有助于模型找到更好的解决方案。
使用不同的求解器:当前模型使用IPOPT求解器。您可以尝试使用其他求解器,例如 APOPT 或 CONOPT,看看它们是否提供更好的解决方案。
要实现这些建议,您可以按如下方式修改 Gekko 模型:
# neural network
b = brain.Brain()
b.input_layer(2)
b.layer(relu=61)
b.layer(relu=61) # Add another hidden layer
b.output_layer(1)
# Normalize the data
# ...
# Change the activation function
b.setActivation('sigmoid') # or 'tanh'
# Increase the learning rate
b.setLearningRate(0.01)
# Use a different solver
b.setSolver('APOPT')
b.learn(train_x, train_y, obj=2)