【发布时间】:2020-11-23 05:00:51
【问题描述】:
我正在尝试根据我的 cnn+lstm 模型的前一个值来预测下一个值,但我得到了每个预测的总体平均值。我的数据包含一个社区(特征)二十周的热图图像以及每周的犯罪数量(标签)。我尝试更改模型中的 epoch 数、更改批量大小和更改参数数量。下面是我的模型。
# MODEL
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
def baseline_model():
#create model
model = Sequential()
model.add(
TimeDistributed(
Conv2D(16, (3, 3), strides=(2,2), data_format='channels_last', activation='relu'),
input_shape=(1,256, 256,3)# looking back 1 image
)
)
model.add(
TimeDistributed(
MaxPooling2D(pool_size=(2, 2))
)
)
model.add(
TimeDistributed(
Conv2D(16, (3, 3), activation='relu'),
)
)
model.add(
TimeDistributed(
MaxPooling2D(pool_size=(2, 2))
)
)
model.add(
TimeDistributed(
Conv2D(32, (3, 3),activation='relu'),
)
)
model.add(
TimeDistributed(
MaxPooling2D(pool_size=(2, 2))
)
)
model.add(
TimeDistributed(
Flatten()
)
)
model.add(
LSTM(4, return_sequences=True)
)
model.add(Dense(2, activation='relu'))
model.add(Flatten())
model.add(Dense((1), activation='linear'))
#Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
# evaluate model
estimator = KerasRegressor(build_fn=baseline_model, epochs=500, batch_size=1,verbose=0)
kfold = KFold(n_splits=10)
results = cross_val_score(estimator, X, y, cv=kfold)
print("Baseline: %.2f (%.2f) MSE" % (results.mean(), results.std()))
Baseline: -16.57 (19.04) MSE
estimator.fit(X, y)
prediction = estimator.predict(X)
print(y)
print(prediction)
[[ 4]
[ 7]
[ 7]
[ 6]
[13]
[11]
[10]
[ 4]
[11]
[10]
[ 6]
[ 7]
[ 2]
[17]
[14]
[ 9]
[ 8]
[ 8]
[ 4]
[ 8]]
[8.324332 8.324332 8.324332 8.324332 8.324332 8.324332 8.324332 8.324332
8.324332 8.324332 8.324332 8.324332 8.324332 8.324332 8.324332 8.324332
8.324332 8.324332 8.324332 8.324332]
【问题讨论】:
-
我认为它来自您使用
TimeDistributed层的方式。这会将包裹层应用到使用相同权重的每个时间步。因此,在每个时间步都限制相同权重的同时实现最小 MSE 损失的唯一方法是针对每个时间步的总体平均值。 -
你可以阅读这篇文章来帮助你相应地修改你的架构:machinelearningmastery.com/…
标签: python lstm conv-neural-network