我刚接触过Keras、Tensorflow、Python和我正试图为个人使用/未来的学习建立一个模型。我刚从python开始,我想出了这段代码(借助视频和教程)。我的问题是,随着每一个时代,甚至在构建新模型之后,我对Python的内存使用量都在缓慢上升。一旦内存达到100%,训练就在没有错误/警告的情况下停止。我不知道太多,但问题应该在循环的某个地方(如果我没有弄错的话)。我知道
k.clear.session()
但是,要么这个问题没有被删除,要么我不知道如何将它集成到我的代码中。我有:Pythonv3.6.4,Tensorflow 2.0.0rc1 (cpu版本),Keras 2.3.0
这是我的密码:
import pandas as pd
import os
import time
import tensorflow as tf
import numpy as np
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint
EPOCHS = 25
BATCH_SIZE = 32
df = pd.read_csv("EntryData.csv", names=['1SH5', '1SHA', '1SA5', '1SAA', '1WH5', '1WHA',
'2SA5', '2SAA', '2SH5', '2SHA', '2WA5', '2WAA',
'3R1', '3R2', '3R3', '3R4', '3R5', '3R6',
'Target'])
df_val = 14554
validation_df = df[df.index > df_val]
df = df[df.index <= df_val]
train_x = df.drop(columns=['Target'])
train_y = df[['Target']]
validation_x = validation_df.drop(columns=['Target'])
validation_y = validation_df[['Target']]
train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
validation_x = np.asarray(validation_x)
validation_y = np.asarray(validation_y)
train_x = train_x.reshape(train_x.shape[0], 1, train_x.shape[1])
validation_x = validation_x.reshape(validation_x.shape[0], 1, validation_x.shape[1])
dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]
for dense_layer in dense_layers:
for layer_size in layer_sizes:
for conv_layer in conv_layers:
NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size,
dense_layer, int(time.time()))
tensorboard = TensorBoard(log_dir="logs\{}".format(NAME))
print(NAME)
model = Sequential()
model.add(LSTM(layer_size, input_shape=(train_x.shape[1:]),
return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())
for l in range(conv_layer-1):
model.add(LSTM(layer_size, return_sequences=True))
model.add(Dropout(0.1))
model.add(BatchNormalization())
for l in range(dense_layer):
model.add(Dense(layer_size, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(2, activation='softmax'))
opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)
# Compile model
model.compile(loss='sparse_categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
# unique file name that will include the epoch
# and the validation acc for that epoch
filepath = "RNN_Final.{epoch:02d}-{val_accuracy:.3f}"
checkpoint = ModelCheckpoint("models\{}.model".format(filepath,
monitor='val_acc', verbose=0, save_best_only=True,
mode='max')) # saves only the best ones
# Train model
history = model.fit(
train_x, train_y,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
validation_data=(validation_x, validation_y),
callbacks=[tensorboard, checkpoint])
# Score model
score = model.evaluate(validation_x, validation_y, verbose=2)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# Save model
model.save("models\{}".format(NAME))另外,我也不知道是否可以在一个问题中问出两个问题(我不想在这里用我的问题来垃圾邮件,任何有蟒蛇经验的人都可以在一分钟内解决这个问题),但是我在检查点保存方面也有问题。我只想保存性能最好的模型(每1NN规范一个模型-节点/层数),但目前它保存在每个时代之后。如果这不合适,我可以提出另一个问题。
非常感谢您的帮助。
发布于 2019-09-27 16:18:15
问题的一个原因是,一个新的model = Sequential()循环并没有删除以前的模型;它仍然是在其TensorFlow图形范围内构建的,并且每个新的model = Sequential()都添加了另一个挥之不去的结构,最终导致内存溢出。为了确保模型被完全销毁,在完成模型后运行下面的命令:
import gc
del model
gc.collect()
K.clear_session()
tf.compat.v1.reset_default_graph() # TF graph isn't same as Keras graphgc是Python的垃圾收集模块,它清除了del之后遗留的model痕迹。K.clear_session()是主调用,并清除TensorFlow图。
此外,虽然您对模型检查点、日志记录和超参数搜索的想法很好,但它执行得非常糟糕;实际上,您将只测试您在那里设置的整个嵌套循环的一个超参数组合。但这应该在另一个问题中提出。
UPDATE:只是在一个完全正确的设置环境中遇到了同样的问题;最有可能的结论是,这是一个bug --一个明确的罪魁祸首是急于执行。若要工作,请使用
tf.compat.v1.disable_eager_execution() # right after `import tensorflow as tf`切换到图形模式,这也可以运行significantly faster。还请参阅上面更新的清晰代码。
发布于 2020-01-16 17:02:54
这是个已知的窃听器。更新到Tensorflow 2.1应该可以解决这个问题。
https://stackoverflow.com/questions/58137677
复制相似问题