【问题标题】:Dimension mismatch between input data and trained data when using conv1D使用 conv1D 时输入数据和训练数据之间的维度不匹配
【发布时间】:2019-12-29 22:47:44
【问题描述】:

在处理时间序列数据时,我尝试使用 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() 输出:

【问题讨论】:

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


    【解决方案1】:

    错误出现在axis=1 处的decode 输出维度,即1500,与1501 的目标x_train1 维度不同。

    这是由于 max-pooling上采样 操作的 这条链1501 -> 750 -> 1500 其中MaxPooling1D 忽略了一个附加元素而在axis=1 处下采样并输出维度为750 的特征,该特征无法从UpSampling1D 的上采样操作中恢复。

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

    可用于解决此问题的两种方法是:

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

    【讨论】:

      猜你喜欢
      • 2018-08-25
      • 2019-07-10
      • 2019-05-14
      • 2020-03-15
      • 2015-07-09
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多