我是神经网络新手,我已经成功训练了 RNN,但训练数据需要一段时间。对于我来说,每次想要进行预测时都训练数据是不可行的。那么问题是,如何让训练数据持久化,这样 RNN 就不必每次进行预测时都进行训练?
这是我正在使用的代码...
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense
from keras.utils.data_utils import pad_sequences
class Predict:
TrainingData = None
XScale = None
def __init__(self,PredData,TrainingData):
PreparedData = self.PrepareData(PredData,TrainingData)
#set the training data
self.Train(PreparedData)
#split all of the training data into their respective variables
X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(self.XScale, self.Y, test_size = 0.6)
X_val, X_test, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size = 0.6)
#define the model
self.DefineModel(X_train, Y_train, X_val, Y_val)
#do the prediction
return self.predict(PredData)
def PrepareData(self, PredData,TrainingData):
LNumber = 0
for I in TrainingData:
if(len(I) > LNumber):
LNumber = len(I)
PadData = pad_sequences(TrainingData, maxlen = LNumber, padding = 'post', truncating = 'post')
return PadData
def Train(self,TrainData):
min_max_scaler = preprocessing.MinMaxScaler()
self.X = TrainData[0:10]
self.Y = TrainData[-10:]
self.XScale = min_max_scaler.fit_transform(self.X)
def DefineModel(self,X_train, T_train, X_val, Y_val):
self.model = Sequential([
Dense(32, activation = 'relu', input_shape = (10,)),
Dense(32, activation = 'relu'),
Dense(1, activation = 'sigmoid'),
])
self.model.compile( optimizer = 'sgd',
loss = 'binary_crossentropy',
metrics = ['accuracy']
)
self.model.fit( X_train, Y_train,
batch_size = 32, epochs = 100,
validation_data = (X_val, Y_val))
def predict(self,PredData):
Self.Prediction = model.predict(PredData)
最佳答案
根据评论中的建议,您可以使用 SavedModel保存您的整个架构+权重。我建议您查看此页面,了解如何 Save and load Keras models .
基本上你只需要像这样保存:
self.model.save('path/to/location')
稍后恢复:
from tensorflow import keras
model = keras.models.load_model('path/to/location')
此外,如果你的训练时间相当长,你还可以考虑使用回调 tf.keras.callbacks.ModelCheckpoint
保存迄今为止最佳模型的检查点。 。您创建回调并将其添加到您的适合中:
checkpoint_filepath = '/tmp/checkpoint'
model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_filepath,
save_weights_only=True,
monitor='val_accuracy',
mode='max',
save_best_only=True)
# Model weights are saved at the end of every epoch, if it's the best seen so far.
model.fit(X_train, Y_train, batch_size=32, epochs=100,
validation_data=(X_val, Y_val), callbacks=[model_checkpoint_callback])
如果您的火车发生事故或中断,您可以重新加载最佳权重,如下所示:
# The model weights (that are considered the best) are loaded into the model.
model.load_weights(checkpoint_filepath)
请注意,如果您重新启动脚本,则必须重新创建模型对象:load_weights
不会像它那样为您重新创建架构 load_model
。但这只是你的情况,首先要做的事情:
self.model = Sequential([
Dense(32, activation = 'relu', input_shape = (10,)),
Dense(32, activation = 'relu'),
Dense(1, activation = 'sigmoid'),
])
关于python-3.x - 如何在不每次训练的情况下对 RNN 进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73480889/