我尝试使用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()输出:
答案 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