当前位置: 代码迷 >> 综合 >> keras报错:ValueError: Negative dimension size caused by subtracting 5 from 1
  详细解决方案

keras报错:ValueError: Negative dimension size caused by subtracting 5 from 1

热度:70   发布时间:2023-12-08 07:25:20.0

ValueError: Negative dimension size caused by subtracting 5 from 1

  • 报错现象
  • 任务背景
  • 问题参考
  • 问题解决
  • 解决呈现
    • 原始错误程序
    • 方式1 + 方式2 (结合使用)
    • 方式3

报错现象

ValueError: Negative dimension size caused by subtracting 5 from 1 for '{
   {node 
conv1d_8/conv1d}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 
1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true]
(conv1d_8/conv1d/ExpandDims, conv1d_8/conv1d/ExpandDims_1)' with input shapes: 
[?,1,1,128], [1,5,128,64].

在这里插入图片描述
主要是传送数据的格式并不匹配!!!

任务背景

任务目的: 使用 Conv1D 预测单变量时序数据
出现位置: 在搭建堆叠形的 Conv1D 的时候,将一维卷积串联拼接起来 model.Sequential() 时候产生了报错

在这里插入图片描述

问题参考

https://stackoverflow.com/questions/47324571/keras-valueerror-negative-dimension-size-caused-by-subtracting-5-from-1?answertab=oldest

问题解决

  • Decrease the pool size,在 MaxPool1D 中减少 pool_size 中的个数
  • Apply a padding by adding padding=‘same’ to your convolutional layer
    在卷积层使用 参数 padding = 'same’
    • 注意:在实践的过程中,可能是在 MaxPool和Conv1D中同时加上参数 padding=‘same’
  • Cut down yout model 直接去掉模型

解决呈现

原始错误程序

# define the model
model = Sequential()
model.add(Conv1D(filters=128, kernel_size=2, activation='relu', input_shape=(n_steps, n_features), padding='same'))
model.add(MaxPool1D(pool_size=3)) ## model.add(MaxPool1D(pool_size=2, padding='same'))
model.add(Conv1D(filters=64, kernel_size=5 , activation='relu'))
model.add(MaxPool1D(pool_size=2, padding='same'))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(n_features))
model.summary()

方式1 + 方式2 (结合使用)

添加 padding = ‘same’

# define the model
model = Sequential()
model.add(Conv1D(filters=128, kernel_size=2, activation='relu', input_shape=(n_steps, n_features), padding='same'))
model.add(MaxPool1D(pool_size=3)) ## model.add(MaxPool1D(pool_size=2, padding='same'))
model.add(Conv1D(filters=64, kernel_size=5 , activation='relu', padding='same'))
model.add(MaxPool1D(pool_size=2, padding='same'))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(n_features))
model.summary()

在这里插入图片描述

方式3

直接裁掉:

# define the model
model = Sequential()
model.add(Conv1D(filters=128, kernel_size=2, activation='relu', input_shape=(n_steps, n_features)))
model.add(MaxPool1D(pool_size=2))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(n_features))
model.summary()
  相关解决方案