【问题标题】:ValueError: Error when checking input: expected input_58 to have 3 dimensions, but got array with shape (10000, 10020)ValueError:检查输入时出错:预期 input_58 有 3 个维度,但得到了形状为 (10000、10020) 的数组
【发布时间】:2020-02-11 01:11:00
【问题描述】:

所以我正在尝试使用具有形状 (10000, 10020) 的数据构建一维 CNN 自动编码器。 这是我的设置:

input_wave = Input(shape=(10020,1))
encode1 = Conv1D(16, 16)(input_wave)
pool1 = MaxPooling1D(3)(encode1)
encode2 = Conv1D(32, 60)(pool1)
pool2 = MaxPooling1D(5)(encode2)
encode3 = Conv1D(64, 130)(pool2)
pool3 = MaxPooling1D(5)(encode3)
encode4 = Conv1D(128, 105)(pool3)
up1 = UpSampling1D(10)(encode4)
drop = Dropout(.2)(up1)
up2 = UpSampling1D(10)(drop)
drop2 = Dropout(.2)(up2)
flat  = Flatten()(drop2)
Den = Dense(10020, activation = 'sigmoid', input_shape = (12800, 1))(flat)

autoencoder.compile(optimizer = 'Adam',
                    loss = 'mean_squared_error',
                    metrics = ['accuracy'])

autoencoder = Model(input_wave, Den)
autoencoder.summary()

很遗憾,我无法发布数据本身,但它的数字介于 0 和 1 之间,没有 NA,并且是波形数据。

当我运行 data.shape() 时,我得到:

(10000, 10020)

当我运行 type(data) 时,我得到:

pandas.core.frame.DataFrame

我的健康声明如下所示:

autoencoder.fit(data,data,
                batch_size = 250,
                epochs = 10)

我收到以下错误:

  ValueError: Error when checking target: expected dense_7 to have 2 dimensions, but got array with shape (10000, 10020, 1)

我尝试使用 data.values,并使用以下代码重塑我的数据:

data = np.reshape(i_data[1].values, (10000, 10020, 1))

但这给了我这个错误:

ValueError: Error when checking target: expected dense_7 to have 2 dimensions, but got array with shape (10000, 10020, 1)

因此,无论哪种方式,我的网络结构似乎都很糟糕。很抱歉,我无法发布我的数据 :( 但如果有帮助,我可以制作玩具数据!有人知道我的结构问题出在哪里吗?

【问题讨论】:

    标签: python keras autoencoder


    【解决方案1】:

    首先,你的自动编码器的定义很奇怪,我不知道你用的是什么例子。

    你必须用相同的形状重建你的数据,所以你的最后一层需要输出一个(batch, 10020, 1)的形状,这是你的错误,你正在对你的数据应用扁平和密集,这就是为什么你只有 2 Dimension符合预期的输出。

    这是一个简单的自动编码器工作示例:

    x = Input(shape=(10020, 1), name="input")
    h = Conv1D(filters=50, kernel_size=3, activation="relu", padding='same', name='Conv1')(x)
    h = MaxPooling1D(pool_size=2, name='Maxpool1')(h)
    h = Conv1D(filters=150, kernel_size=3, activation="relu", padding='same', name='Conv2')(h)
    h = MaxPooling1D(pool_size=2,  name="Maxpool2")(h)
    y = Conv1D(filters=150, kernel_size=3, activation="relu", padding='same', name='conv-decode1')(h)
    y = UpSampling1D(size=2, name='upsampling1')(y)
    y = Conv1D(filters=50, kernel_size=3, activation="relu", padding='same', name='conv-decode2')(y)
    y = UpSampling1D(size=2, name='upsampling2')(y)
    y = Conv1D(filters=1, kernel_size=3, activation="relu", padding='same', name='conv-decode3')(y)
    
    
    autoencoder = Model(x, y)
    

    您可以根据需要使用内核大小和过滤器,但您需要以与编码相同的方式对数据进行解码。

    此外,由于您的最后一个 Dense 层,您的模型有 1.29 亿个参数,这实在是太多了。

    如果您需要更高的精度,请告诉我。

    【讨论】:

    • 感谢您提供清晰的答案和深刻的见解!这很有意义!不久前我正在使用一些堆栈溢出答案表单作为模板。不过有两个问题,我的数据是信号数据,并且有一个持续 130 次观察的周期(这是我奇怪结构的原因之一)。当您制作这样的自动编码器时,您最初会制作多宽的内核(从最宽到最窄),知道您有一些可能是 3-4 个周期长的模式?另外,我听说从较小的内核大小开始并构建更长的内核是一个很好的做法。这是常见的做法吗?
    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多