解决 Keras Conv1D 层中输出形状为零或负值的错误

在使用 Keras 构建卷积神经网络 (CNN) 时,可能会遇到 ValueError: One of the dimensions in the output is <= 0 due to downsampling in conv1d_1. Consider increasing the input size. Received input shape [None, 1, 64] which would produce output shape with a zero or negative value in a dimension. 的错误。

根据错误信息,可以发现是因为在第二个 Conv1D 层中进行了 2 倍的下采样,导致输出形状中的某个维度变成了 0 或负数。

解决方法:

  1. 增加输入形状的大小: 尝试增加输入数据的长度,例如,将输入形状从 [None, 1, 64] 更改为 [None, 10, 64]
  2. 减少下采样的程度: 考虑使用更小的池化核大小,例如,将 MaxPooling1D(2) 更改为 MaxPooling1D(1)
  3. 使用 padding='same'Conv1D 层中设置 padding='same' 参数,可以确保输出形状与输入形状相同。

其他建议:

  • 在模型训练之前先对数据进行标准化或归一化处理,以提高模型训练的效果。
  • 检查输入数据的维度是否正确,并确保输入数据的形状与模型的输入形状匹配。

代码示例:

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'))  # 使用 padding='same'
model.add(MaxPooling1D(1))  # 减少下采样程度
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)

# 将数据输入模型
features = model.predict(prices)

# 提取特征
features = np.squeeze(features)

通过以上方法,可以有效解决 ValueError: One of the dimensions in the output is <= 0 due to downsampling in conv1d_1. 错误。

解决 Keras Conv1D 层中输出形状为零或负值的错误

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

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