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))
这是对单个视频的测试,但如果我在其他视频上测试,我总是得到相同的输出,我不明白为什么。
1条答案
按热度按时间k10s72fa1#
使用sklearn MinMaxScaler时,有两种方法可供用途:
fit()
和transform()
。方法fit()
查找最小值和最大值,以确定应该从每个特征中减去和乘以多少。如果多次调用
fit()
,则只保留最后一次调用的最小值和最大值。下面是一个例子:
我们从1000到1000范围内的输入要素开始。我们要将其重新缩放到0到1的范围。作为其中的一部分,缩放器学习输入数据集的最大值和最小值。然后,我们再次调用
fit_transform()
。它查看输入数据集,并看到最小值为0,最大值为1,并了解到它根本不应该重新调整输出。输出:
请注意,在第二次拟合之前,它会将数据集中的第一个输入重新缩放到0和1之间,而在第二次拟合之后,它不再这样做。
总之,你不应该在sklearn scaler上多次调用
fit()
,否则它会忘记它应该缩放多少输入。