TensorFlow中时间序列数据的输入方式与模型适配咨询
数据输入调整与模型结构改造方案
一、维度对应关系梳理
传统图像CNN(如处理(64,64,3)的模型)的输入是4D张量:(样本数, 空间维度1, 空间维度2, 通道数)。对应你的数据:
- 961:总样本数(日期数)
- 4:自变量特征数(对应「空间维度1」)
- 1865:企业数量(对应「空间维度2」)
我们可以把每个日期的样本看作一张「4行(自变量)、1865列(企业)」的灰度图,通道数设为1,完全匹配传统CNN的输入逻辑。
二、数据形状调整
1. 调整xtrain
将原3D张量转换为符合CNN要求的4D张量,添加通道维度:
import numpy as np # 最终形状:(961, 4, 1865, 1) xtrain_reshaped = np.expand_dims(xtrain, axis=-1)
2. 调整ytrain
对应xtrain的结构,同步将ytrain转换为4D张量:
# 最终形状:(961, 1, 1865, 1) ytrain_reshaped = np.expand_dims(ytrain, axis=-1)
三、模型结构改造
替换原Conv1D+LSTM结构,改用传统CNN的Conv2D+池化+全连接/上采样组合,适配4D输入并输出匹配ytrain的形状。以下提供两种实用方案:
方案1:保留空间关联性的CNN结构
适合需要挖掘企业间特征关联的场景:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D model = Sequential([ # 提取自变量与企业间的局部特征 Conv2D(filters=64, kernel_size=(4, 3), activation='relu', padding='same', input_shape=(4, 1865, 1)), # 压缩企业维度,降低计算量 MaxPooling2D(pool_size=(1, 2)), # 提取高层特征 Conv2D(filters=32, kernel_size=(1, 3), activation='relu', padding='same'), MaxPooling2D(pool_size=(1, 2)), # 恢复企业维度原始长度 UpSampling2D(size=(1, 2)), Conv2D(filters=32, kernel_size=(1, 3), activation='relu', padding='same'), UpSampling2D(size=(1, 2)), # 输出匹配ytrain的形状 Conv2D(filters=1, kernel_size=(4, 1), activation='linear', padding='valid') ])
方案2:轻量化卷积+全连接结构
适合追求训练效率的场景:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Reshape, Dropout model = Sequential([ Conv2D(filters=64, kernel_size=(2, 3), activation='relu', padding='same', input_shape=(4, 1865, 1)), MaxPooling2D(pool_size=(1, 2)), Conv2D(filters=128, kernel_size=(2, 3), activation='relu', padding='same'), MaxPooling2D(pool_size=(1, 2)), # 展平特征接入全连接层 Flatten(), Dense(512, activation='relu'), Dropout(0.3), # 抑制过拟合 # 输出1865个企业的预测值 Dense(1865, activation='linear'), # 重塑为与ytrain匹配的形状 Reshape((1, 1865, 1)) ])
四、模型编译与训练
作为回归任务,使用MSE作为损失函数,搭配Adam优化器即可:
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mean_absolute_error']) # 启动训练 model.fit(xtrain_reshaped, ytrain_reshaped, epochs=50, batch_size=16, validation_split=0.2)
内容的提问来源于stack exchange,提问作者Pablo Ferrer Gonzalez
相关产品推荐
相关产品推荐

