使用conv1D时输入数据和训练数据之间的尺寸不匹配

时间:2019-12-29 22:47:44

标签: python tensorflow keras conv-neural-network convolution

我尝试使用Conv1D构建我的第一个CNN,因为我处理时间序列数据。我的目标是对1501形状的input_data进行压缩。 x_train的形状为(550,1501),我增加了它的尺寸以适合模型。

但是,编译器抱怨:

  

ValueError:传递形状为(550、1501、1)的目标数组以输出形状为(None,1500、1),同时用作损失mean_squared_error。这种损失期望目标与输出具有相同的形状。

这是代码

import numpy as np
from tensorflow.keras.layers import Input,Dense, Conv1D, MaxPooling1D, UpSampling1D, Flatten, Input
from tensorflow.keras import optimizers, Model
import matplotlib.pyplot as plt
from tensorflow.keras import backend as K

#(1,128,1)
input_data = Input(shape=(1501,1))
fil_ord = 3
# Eecode
encode  = Conv1D(2000,  fil_ord, activation='relu', padding='same')input_data) 
encode = MaxPooling1D( 2 )(encode)
encode = Conv1D(750,   fil_ord, activation='relu', padding='same')(encode)

# Decode

decode  = Conv1D(750,  fil_ord, activation='relu', padding='same')(encode)
decode = UpSampling1D( 2)(decode)
decode = Conv1D(1,   fil_ord, activation='sigmoid', padding='same')(decode)


model = Model(input_data, decode)


model.summary()

from numpy import zeros, newaxis
x_train1=x_train[:,:,None]

batch_size = 128
epochs = 10
# Optimizer
sgd = optimizers.Adam(lr=0.001)

# compile
model.compile(loss='mse', optimizer=sgd)
# train
history = model.fit(x_train1, x_train1, batch_size=batch_size, epochs=epochs, verbose=2,shuffle=True)

model.summary()输出:

enter image description here

1 个答案:

答案 0 :(得分:0)

错误在于decode的{​​{1}}输出维度,即axis=1,它与1500的目标x_train1维度不同。

之所以发生这种情况,是因为 max-pooling upsampling 操作的此链1501其中1501 -> 750 -> 1500在下采样时忽略一个附加元素,并在MaxPooling1D输出尺寸为750的特征,而这些特征不能从使用axis=1的上采样操作中恢复。

因此,目标(UpSampling1D)和预测(x_train1)的输出形状不同,因此我们无法计算损失。

可以使用两种方法解决此问题:

  • 裁剪,将decode中的目标(x_train)尺寸与axis=1的尺寸(即decode)相匹配。这是执行此操作的一种方法: 1500
  • 填充,从history = model.fit(x_train1, x_train1[:,:-1,], batch_size=batch_size, ...)获得(例如)decode的输出,以匹配0的维度,即x_train。一种实现方法是在1501上使用ZeroPadding2D层: decode