Python 预测给了我同样的价值
我试图根据cnn+lstm模型的前一个值来预测下一个值,但我得到了每个预测的总体平均值。我的数据包括20周的街区(特征)热图图像和每周的犯罪数量(标签)。我尝试更改了历元的数量、批量大小以及模型中参数的数量。下面是我的模型Python 预测给了我同样的价值,python,lstm,cnn,Python,Lstm,Cnn,我试图根据cnn+lstm模型的前一个值来预测下一个值,但我得到了每个预测的总体平均值。我的数据包括20周的街区(特征)热图图像和每周的犯罪数量(标签)。我尝试更改了历元的数量、批量大小以及模型中参数的数量。下面是我的模型 # MODEL from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers impor
# 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]
我检查了一下我的模型,做了一些修改
# MODEL
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
def ReshapeLayer(x):
shape = x.shape
reshape = Reshape((shape[2],shape[3]*shape[4]))(x)
return reshape
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)
)
)
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(
Lambda(ReshapeLayer)
)
model.add(
LSTM(20, activation='relu', return_sequences=True)
)
model.add(
Dense((2), activation='relu')
)
model.add(
Flatten()
)
model.add(
Dense((1))
)
#Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
模型摘要:
Model: "sequential_58"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_343 (TimeDi (None, 1, 127, 127, 16) 448
_________________________________________________________________
time_distributed_344 (TimeDi (None, 1, 63, 63, 16) 0
_________________________________________________________________
time_distributed_345 (TimeDi (None, 1, 61, 61, 16) 2320
_________________________________________________________________
time_distributed_346 (TimeDi (None, 1, 30, 30, 16) 0
_________________________________________________________________
time_distributed_347 (TimeDi (None, 1, 28, 28, 32) 4640
_________________________________________________________________
time_distributed_348 (TimeDi (None, 1, 14, 14, 32) 0
_________________________________________________________________
lambda_58 (Lambda) (None, 14, 448) 0
_________________________________________________________________
lstm_58 (LSTM) (None, 14, 20) 37520
_________________________________________________________________
dense_115 (Dense) (None, 14, 2) 42
_________________________________________________________________
flatten_58 (Flatten) (None, 28) 0
_________________________________________________________________
dense_116 (Dense) (None, 1) 29
=================================================================
Total params: 44,999
Trainable params: 44,999
Non-trainable params: 0
_________________________________________________________________
当我试图预测温哥华市中心的犯罪率时,我得到了我想要的结果
# 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()))
基线:-3838.29(10400.71)毫秒
然而,每当我试图预测美景镇温哥华的犯罪率时,每次预测的值都是一样的
# 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()))
基线:-782.18(735.71)毫秒
我不知道为什么每次预测都会给我相同的值,而市中心的预测给了我不同的值,即使我对两个预测都使用相同的模型。这是否取决于MSE,我的预测值是否都相同?我认为它来自于您使用
TimeDistributed
层的方式。这将使用相同的权重将包裹层应用于每个时间步。因此,在每个时间步限制相同的权重时,实现最小MSE损失的唯一方法是在每个时间步以总平均值为目标。您可以阅读以下内容来帮助您相应地修改您的体系结构:
# 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()))
# evaluate
estimator.fit(X, y)
prediction = estimator.predict(X)
print(y)
print(prediction)
[[39]
[40]
[36]
[29]
[44]
[49]
[35]
[29]
[49]
[55]
[40]
[57]
[38]
[39]
[38]
[37]
[24]
[53]
[32]
[43]]
[9.494502 9.494502 9.494502 9.494502 9.494502 9.494502 9.494502 9.494502
9.494502 9.494502 9.494502 9.494502 9.494502 9.494502 9.494502 9.494502
9.494502 9.494502 9.494502 9.494502]