我尝试使用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()输出:
误差在于的decode
输出尺寸axis=1
,即1500
与的目标x_train1
尺寸不同1501
。
这是由于发生在此链的MAX-池和上采样操作: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
用(say)填充从中获得的输出0
,以匹配的尺寸x_train
,即1501
。一种方法是在以下位置使用ZeroPadding2D层decode
:ZeroPadding2D(padding=((0,0),(0,1),(0,0)))(decode)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句