numpy Keras回归模型输出总是给予相同的值

vohkndzv  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(114)
list_features,masks=fe.prepare_all_videos()
X_train=np.array(list_features)
scaler = MinMaxScaler(feature_range=(-1,1))
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[1], -1)).reshape(X_train.shape)
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[2], -1)).reshape(X_train.shape)
y_train=f.getListEtichettaFromVideos('happy')
y_train=np.array(y_train)
y_train = (y_train-min(y_train)) / (max(y_train)-min(y_train))
model = keras.Sequential([
    layers.LSTM(32,input_shape=(24,2048)),
    layers.Dense(16),
    layers.Dense(1,activation='sigmoid')
])

# Compile neural network
model.compile(optimizer='adam', loss='mse')
history=model.fit(X_train,y_train,epochs=20,batch_size=16,validation_data=(X_train,y_train))

这是我的模型,List_features是从人们走路的视频中提取的特征,对于每个视频,都有一个视频中的人有多快乐的值(y_train)。
我选择LSTM层,因为它对时间特征很好。和一个简单的密集层,并在输出一个单一的层与激活函数sigmoid(我需要一个值之间的0和1)
对于每个视频,Input_shape为(num_frames,num_features

modello=keras.models.load_model('Modello.keras')
video=cv2.VideoCapture(path+'VID_TEST_CUT_75.avi')
frames=f.getAllFramesFromVideo(video)
frames=frames[:24]

feature,mask=fe.prepare_single_video(frames)
features=np.array(feature)
scaler = MinMaxScaler(feature_range=(-1,1))
features = scaler.fit_transform(features.reshape(features.shape[0], -1)).reshape(features.shape)
features = scaler.fit_transform(features.reshape(features.shape[1], -1)).reshape(features.shape)
features = scaler.fit_transform(features.reshape(features.shape[2], -1)).reshape(features.shape)
print(modello.predict(features))

这是对单个视频的测试,但如果我在其他视频上测试,我总是得到相同的输出,我不明白为什么。

k10s72fa

k10s72fa1#

X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[1], -1)).reshape(X_train.shape)
X_train = scaler.fit_transform(X_train.reshape(X_train.shape[2], -1)).reshape(X_train.shape)

使用sklearn MinMaxScaler时,有两种方法可供用途:fit()transform()。方法fit()查找最小值和最大值,以确定应该从每个特征中减去和乘以多少。
如果多次调用fit(),则只保留最后一次调用的最小值和最大值。
下面是一个例子:

from sklearn.preprocessing import MinMaxScaler
data = [[1000, 1001], [1002, 1003], [1004, 1005], [1006, 1007]]
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
print("Row 1 transform after first fit", scaler.transform([data[0]]))
print("Data max", scaler.data_max_)
data_scaled_x2 = scaler.fit_transform(data_scaled)
print("Row 1 transform after second fit", scaler.transform([data[0]]))
print("Data max", scaler.data_max_)

我们从1000到1000范围内的输入要素开始。我们要将其重新缩放到0到1的范围。作为其中的一部分,缩放器学习输入数据集的最大值和最小值。然后,我们再次调用fit_transform()。它查看输入数据集,并看到最小值为0,最大值为1,并了解到它根本不应该重新调整输出。
输出:

Row 1 transform after first fit [[0. 0.]]
Data max [1008. 1009.]
Row 1 transform after second fit [[1000. 1001.]]
Data max [1. 1.]

请注意,在第二次拟合之前,它会将数据集中的第一个输入重新缩放到0和1之间,而在第二次拟合之后,它不再这样做。
总之,你不应该在sklearn scaler上多次调用fit(),否则它会忘记它应该缩放多少输入。

相关问题