在Gekko模型中调用TensorFlow神经网络触发IndexError问题排查
我尝试用训练好的TensorFlow神经网络模型预测甲烷选择性,再通过Gekko做最小化优化,但调用模型预测时持续触发IndexError。使用CustomMinMaxGekkoScaler做数据缩放,通过Gekko_NN_TF加载TensorFlow模型,相关代码及错误栈如下:
import numpy as np import matplotlib.pyplot as plt from gekko import GEKKO from sklearn.preprocessing import StandardScaler import pandas as pd from joblib import load from gekko import ML from gekko.ML import CustomMinMaxGekkoScaler features = ['Oil T', 'Tmax', 'Recycle', 'Syngas', 'P', 'CH4 Comp'] features2 = ['Oil T', 'Tmax', 'Recycle', 'Syngas', 'P'] df = pd.read_csv('Training Set.csv').dropna() df2 = pd.read_csv('Test Set.csv').dropna() df3 = pd.read_csv('Aug4_6 Data.csv').dropna() df = df[df['P']>19.8] df = df[df['CH4 Comp']>5] df = df[df['Syngas']<2.8] df = df[df['Recycle']<40.075] df2 = df2[df2['P']>20.02] df2 = df2[df2['Oil T']<210.1] df2 = df2[df2['Oil T']>209.91] df2 = df2[df2['Recycle']>40.003] df3 = df3[df3['P']>15.82] df3 = df3[df3['CH4 Comp']>3] df3 = df3[df3['Recycle']>23.95] df3 = df3[['Oil T', 'Tmax', 'Recycle', 'Syngas', 'P', 'CH4 Comp', 'CH4 Selec']] df4 = df.append(df3) df4 = df4[['Oil T', 'Tmax', 'Recycle', 'Syngas', 'P', 'CH4 Selec']] s = CustomMinMaxGekkoScaler(df4,features2,['CH4 Selec']) from tensorflow import keras model = keras.models.load_model('/Users/dallinlittlewood/Smart Systems') m = GEKKO() nt = 601 t = np.linspace(0,1000,nt) m.time = t Model = ML.Gekko_NN_TF(model,s.minMaxValues(),m) ## Reactor Properties ρ_b = m.Const(value=0.8*1e6) #g/m3 D = m.Const(value=1.5/39.37) #m L = m.Const(value=4*12/39.37) #m Ac = m.Intermediate(np.pi/4*D**2) #m2 V = m.Intermediate(np.pi/4*D**2*L) #m3 W = m.Intermediate(Ac*L*ρ_b) #weight of catalyst, g Cp = m.Const(value=53.89*74.93) #kJ/kg/K Ua = m.Const(value=5e4) ## Syngas Feed yco = m.Const(0.214) yh2 = m.Const(0.46) T0 = m.Const(value= 195 + 273.15) #K ## Kinetics A = m.Const(value=3.32e7/60) #mol/g/s/atm^0.55 Ea = m.Const(value=93.8) #kJ/mol ΔHr = m.Const(value=-165) #kJ/mol R = m.Const(value=8.314e-3) #kJ/mol/K ## Manipulated Variables Tc = m.MV(value=200+273.15,lb=195+273.15,ub=230+273.15) P = m.MV(value=19.9,lb=17/1.01325,ub=24/1.01325) #atm q = m.MV(value=2.5,lb=2,ub=6) #SLPM Recycle = m.MV(value=40,lb=20,ub=50) #SLPM F0 = m.Intermediate(q/0.082057/273.15/60) #mol/s Fco = m.Intermediate(F0*yco) #mol/s Tc.STATUS = 1 Tc.DCOST = 0 P.STATUS = 1 P.DCOST = 0 q.STATUS = 1 q.DCOST = 0 Recycle.STATUS = 1 Recycle.DCOST = 0 T = m.Var(value=196+273.15,lb=195+273.15,ub=215+273.15) ## Equations Pco = m.Intermediate(P*yco) Ph2 = m.Intermediate(P*yh2) r_CO = m.Intermediate(A*m.exp(-Ea/R/T)*Pco**(-0.05)*Ph2**0.6) #X_CO = m.Intermediate(W*r_CO/Fco) m.Equation(T.dt() == (-ΔHr)*r_CO/Cp + Ua*(Tc - T)/ρ_b/Cp/V) CH4_selec = Model.predict([Tc-273.15,T-273.15,Recycle,q,P])
错误栈如下:
IndexError Traceback (most recent call last) <ipython-input-1-2ca486a260bc> in <module> 96 m.Equation(T.dt() == (-ΔHr)*r_CO/Cp + Ua*(Tc - T)/ρ_b/Cp/V) 97 ---> 98 CH4_selec = Model.predict([Tc-273.15,T-273.15,Recycle,q,P]) /opt/anaconda3/lib/python3.8/site-packages/gekko/ML.py in predict(self, a, return_std) 817 aNext = feedforward(a_scaled,n,self.W,self.b) 818 else: ---> 819 aNext = feedforward(aNext,n,self.W,self.b) 820 if return_std: 821 aNextSigma = [] /opt/anaconda3/lib/python3.8/site-packages/gekko/ML.py in feedforward(a, n, W, b) 780 a_len = self.layer_sizes[n+1] 781 for i in range(a_len): ---> 782 aNext.append(self.m.Intermediate(activation(self.m.sum(W[n].T[i] * a)+b[n][i]))) 783 return aNext 784 IndexError: index 1 is out of bounds for axis 0 with size 1
可能的原因分析
输入特征数量/顺序与模型预期不匹配:
训练模型时使用的输入特征是features2(共5个:Oil T,Tmax,Recycle,Syngas,P),调用predict时传入的[Tc-273.15,T-273.15,Recycle,q,P]虽然数量是5个,但需要确认:- 模型输入层的神经元数量确实为5;
- 传入特征的顺序和
features2完全一致(比如Tc-273.15对应Oil T,T-273.15对应Tmax,q对应Syngas)。顺序错误会导致缩放后的数据维度逻辑混乱,触发前向传播时的索引错误。
Gekko_NN_TF对模型层结构解析错误:
错误发生在feedforward函数中访问权重矩阵的索引时,说明Gekko加载TensorFlow模型时,没有正确解析各层的神经元数量或权重维度。比如模型隐藏层的神经元数量被错误识别为1,导致循环访问索引1时越界。可以加载模型后打印model.summary(),确认各层的输入输出形状是否符合预期。数据缩放器的minMaxValues传递错误:
CustomMinMaxGekkoScaler的s.minMaxValues()需要正确传递给Gekko_NN_TF,确保缩放逻辑和训练时一致。如果缩放器的特征范围与模型预期不匹配,会导致输入数据的维度或数值异常,进而引发矩阵运算错误。TensorFlow模型保存/加载异常:
检查加载的模型是否完整:比如保存时是否只保存了权重而没有层结构,或者模型存在自定义层导致Gekko无法正确解析。加载后执行model.summary()确认输入层形状为(None, 5),输出层为(None, 1)。
内容的提问来源于stack exchange,提问作者Dallin Littlewood

