使用CNN模型提取股票价格特征:解决MaxPooling1D错误

本文将展示如何使用卷积神经网络 (CNN) 从股票价格数据中提取特征,并解决在构建 CNN 模型时遇到的MaxPooling1D层抛出的“Negative dimension size”错误。

代码示例

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout

# 加载数据
data = pd.read_excel('E:\pythonProject5\深度学习\新建 XLS 工作表.xls')

# 提取每日开盘价、收盘价、最高价和最低价
open_prices = data['开盘'].values
close_prices = data['收盘'].values
high_prices = data['最高'].values
low_prices = data['最低'].values

# 将价格数据转换为二维数组
prices = np.array([open_prices, close_prices, high_prices, low_prices])
prices = np.transpose(prices)

# 定义CNN模型
model = Sequential()
model.add(Conv1D(64, 3, activation='relu', input_shape=(prices.shape[1], 1)))
model.add(MaxPooling1D(2))
model.add(Conv1D(32, 3, activation='relu', padding='same'))
model.add(MaxPooling1D(2))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear'))

model.summary()

# 将数据转换为三维数组
prices = np.expand_dims(prices, axis=2)

# 编译模型
model.compile(loss='mse', optimizer='adam')

# 拟合模型
model.fit(prices, close_prices, epochs=50, batch_size=16, verbose=1)

# 提取特征
features = model.predict(prices[:, :, np.newaxis])  # 将数据转换为三维数组,添加一个维度

print(features)

错误分析

在原始代码中,MaxPooling1D层的输入形状为[?, 1, 1, 32],其中:

  • ? 表示批次大小
  • 1 表示时间步长
  • 1 表示特征数量
  • 32 表示卷积滤波器数量

MaxPooling1D层会将输入数据沿时间轴进行池化,其pool_size参数为2,这意味着它会将两个相邻的时间步长合并成一个。当时间步长为1时,pool_size2会导致最终输出的时间步长为负数,从而引发Negative dimension size错误。

解决方案

为了解决这个问题,我们需要确保输入数据的时间步长至少为2。这可以通过在原始数据中添加一个额外的维度来实现。

在修改后的代码中,我们使用np.newaxis将原始数据扩展到三维,并将时间步长增加到2。这样,MaxPooling1D层就可以正常执行池化操作了。

总结

本文介绍了如何使用CNN模型提取股票价格特征,并详细分析了在构建模型过程中遇到的MaxPooling1D错误。通过将数据扩展到三维,我们解决了错误并成功提取了股票价格特征。希望本文能够帮助您更好地理解CNN模型的使用和错误处理。

使用CNN模型提取股票价格特征:解决MaxPooling1D错误

原文地址: https://www.cveoy.top/t/topic/oZZ3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录