Python 多目标回归的CNN超参数优化错误

Python 多目标回归的CNN超参数优化错误,python,hyperparameters,talos,Python,Hyperparameters,Talos,我试图用CNN解决一个多目标回归问题。为了优化超参数,我使用了Talos库,但最后出现了一个错误: 检查输入时出错:预期conv1d_1_输入有3个维度,但得到了具有形状的数组(280000,70) 数据集描述:X有70个特征,Y有32个目标 时间序列长度:509760个时间点 Shape of Dataset: Train Data size: (400000, 70), Train Target size: (400000, 32), Test Data size: (109760, 70

我试图用CNN解决一个多目标回归问题。为了优化超参数,我使用了Talos库,但最后出现了一个错误:

检查输入时出错:预期conv1d_1_输入有3个维度,但得到了具有形状的数组(280000,70)

数据集描述:X有70个特征,Y有32个目标 时间序列长度:509760个时间点

Shape of Dataset:

Train Data size: (400000, 70),
Train Target size: (400000, 32),
Test Data size: (109760, 70),
Test Target size: (109760, 32),
代码:

tf.keras.backend.clear_session()
def模型(x_列、y_列、x_值、y_值、参数):
n_时间步,n_特征,n_输出=x_train.shape[0],x_train.shape[1],y_train.shape[1]
模型=顺序()
添加(Conv1D(filters=params['conv1\u filter'],kernel\u size=(3),activation=params['activation'],input\u shape=(n\u timesteps,n\u features)))
添加(Conv1D(filters=params['conv2\u filter'],kernel\u size=(3),activation=params['activation']))
添加(最大池1d(池大小=2))
model.add(Dropout(参数['Dropout']))
add(Conv1D(filters=8,kernel_size=3,activation=params['activation']))
添加(最大池1d(池大小=2))
model.add(密集型(100,activation=params['activation']))
模型添加(密集(n_输出))
model.add(展平())
compile(loss='mse',optimizer=params['optimizer'](),metrics=['acc',fmeasure\u acc])
out=model.fit(x_-train,y_-train,validation_-data=[x_-val,y_-val],batch_-size=params['batch_-size'],epochs=params['epochs'],verbose=1,shuffle=True)
退场,模特
p={'conv1_filter':[32],
“conv2_过滤器”:[32],
“优化器”:[Nadam],
“批量大小”:[1000],
“时代”:[5],
“辍学”:[0.5],
“激活”:[relu]}
#然后进行实验
t=ta.Scan(x=x_序列,y=y_序列,模型=model,参数=p,实验号=1’)
错误如下:

168#输入参数部分结束
169
-->170 self.\u null=self.runtime()
171
172 def运行时(自):
/运行时中的anaconda3/lib/python3.7/site-packages/talos/scan/scan.py(self)
173
174 self=扫描准备(self)
-->175 self=扫描运行(self)
/anaconda3/lib/python3.7/site-packages/talos/scan/scan_run.py in scan_run(self)
16禁用=自我禁用(进度条)
17而len(自参数日志)!=0:
--->18 self=扫描(self)
19自我保护更新(1)
20 self.pbar.close()
/anaconda3/lib/python3.7/site-packages/talos/scan/scan_round.py in scan_round(self)
30#适合模型
31尝试:
--->32_hr_out,self.keras_model=摄取_model(self)
33除类型错误作为错误外:
34如果err.args[0]=“不支持+:'int'和'numpy.str'的操作数类型”:
/anaconda3/lib/python3.7/site-packages/talos/model/ingest_model.py in ingest_model(self)
8 self.x_val,
9自我价值,
--->10.自身圆度(参数)
模型中(x_列、y_列、x_值、y_值、参数)
20
21
--->22 out=model.fit(x_-train,y_-train,validation_-data=[x_-val,y_-val],批量大小=params['batch_-size'],年代=params['epochs'],详细=1,随机=True)
23
24
/anaconda3/lib/python3.7/site-packages/keras/engine/training.py适合(self、x、y、批量大小、历元、详细信息、回调、验证分割、验证数据、混洗、类权重、样本权重、初始历元、每个历元的步骤、验证步骤、**夸克)
950样品重量=样品重量,
951类重量=类重量,
-->952批次大小=批次大小)
953#准备验证数据。
954 do_验证=错误
/anaconda3/lib/python3.7/site-packages/keras/engine/training.py在标准化用户数据中(自身、x、y、样本重量、类别重量、检查数组长度、批次大小)
749馈送输入形状,
750检查批处理轴=False,#不强制执行批处理大小。
-->751异常(前缀为“输入”)
752
753如果y不是无:
/标准化输入数据(数据、名称、形状、检查批处理轴、异常前缀)中的anaconda3/lib/python3.7/site-packages/keras/engine/training\u utils.py
126':预期'+names[i]+'具有'+
127 str(len(shape))+'维度,但得到数组'
-->128'带形状'+str(数据形状))
129如果不检查批次轴:
130数据形状=数据形状[1:]

ValueError:检查输入时出错:预期conv1d_1_输入为3维,但得到了形状为(280000,70)的数组。
我再次查看了它,代码中需要更改一些内容。我测试了它,现在应该可以工作了:

首先,模型本身有几个问题

也就是说,模型的输入应该是
(n\u功能,1)
,而不是
(n\u时间步,n\u功能)
。Keras内部认为,在给出输入形状时,您忽略了批处理维度。因此,当它将注册为一个形状时,
(批大小,n特征,1)
。最后一个维度是必需的,以便与
Conv1D
兼容

它应该是这样的:

model.add(Conv1D(filters=params['conv1\u filter'],kernel\u size=(3),activation=params['activation'],input\u shape=(n\u features,1)))
其次,模型不应该以
flant()
层结束。相反,该层应该位于
Dense()
层之前(这样它可以看到2D输入,而不是3D输入)。两次更改后,模型应如下所示:

model=Sequential()
添加(Conv1D(filters=params['conv1\u filter'],kernel\u size=(3),activation=params['activation'],input\u shape=(n\u features,1)))
添加(Conv1D(filters=params['conv2\u filter'],kernel\u size=(3),activation=params['activation']))
添加(最大池1d(池大小=2))
模型。添加(辍学)(参数