Python 为什么我的Keras模型在加载后会进行训练,即使我实际上没有提供任何新的训练数据?

Python 为什么我的Keras模型在加载后会进行训练,即使我实际上没有提供任何新的训练数据?,python,keras,tf.keras,Python,Keras,Tf.keras,我正在尝试使用tf.keras使用LSTM模型进行训练和预测。我在两个不同的文件中编写了代码,LSTMTraining.py用于训练Keras模型(并将其保存到文件中),Predict.py用于加载Keras模型并使用它进行预测。出于某种原因,当我在Predict.py中加载模型时,它开始训练,即使我没有在该文件中使用model.fit()命令。为什么会这样 我已将模型保存为多种不同的文件格式。例如,我尝试将模型的架构保存到一个JSON文件中(使用model_to_JSON()),并分别保存权重

我正在尝试使用tf.keras使用LSTM模型进行训练和预测。我在两个不同的文件中编写了代码,LSTMTraining.py用于训练Keras模型(并将其保存到文件中),Predict.py用于加载Keras模型并使用它进行预测。出于某种原因,当我在Predict.py中加载模型时,它开始训练,即使我没有在该文件中使用model.fit()命令。为什么会这样

我已将模型保存为多种不同的文件格式。例如,我尝试将模型的架构保存到一个JSON文件中(使用model_to_JSON()),并分别保存权重,然后分别加载这两个文件,然后组合它们。我还尝试将它们一起保存到一个文件中(使用model.save()),并将其加载到中

在LSTMTraining.py中创建和训练模型(注意:log_similarity_loss只是我为模型创建的自定义损失函数):

机器学习 导入tensorflow作为tf 从tensorflow.python.keras导入图层 将numpy作为np导入 #加载/保存数据 进口泡菜 导入操作系统 #洗牌 从sklearn.utils导入shuffle #参数 纪元=5 显示步进=1000 n_输入=5 wordvec_len=5 n_hidden=512 经常性辍学=0 辍学率=0 #加载数据 以open(“矢量化的”Word“By”Word.txt“,”rb”)作为数据: 矢量化的_txt=pickle.load(数据) #将数据准备为培训格式(x:[上一个单词],y:[下一个单词]) x_列,y_列=[],[] 对于范围内的n(0,len(矢量化的_-txt)-n_输入-1): 上一个单词=矢量化的文本[n:n+5] 下一个单词=矢量化的文本[n+6] x_train.append(上一个单词) y_train.append(下一个单词) x_列,y_列=np.数组(x_列),np.数组(y_列) x_列,y_列=随机(x_列,y_列,随机状态=0) def日志相似性损失(y_实际值,y_预测值): “”“日志相似性损失计算。”“” cos_相似性=tf.keras.loss.cos相似性(轴=0)(y_实际值,y_预测值) 缩放相似性=tf.add(tf.multiply(0.5,cos_相似性),0.5) return-0.5*tf.math.log(缩放相似性) 对数相似性损失( [0.05, 0.01, 0.05, 1.2], [0.05, -0.01, 0.05, -1.2]) 模型=tf.keras.Sequential([ layers.LSTM(n_hidden,input_shape=(n_input,wordvec_len), 辍学=辍学,经常性辍学=经常性辍学, 返回_序列=真), layers.LSTM(n_hidden,dropout=dropout, 经常性辍学=经常性辍学), 密集层(wordvec_len) ]) model.compile(损失=log\u相似性\u损失, 优化器='adam',度量=['cosine\u接近度'] 模型拟合(x_序列,y_序列,历代=历代,批量大小=12) 保存(“Keras\u model.h5”,包括\u optimizer=True,保存\u format='h5') #保存模型权重和体系结构 model.save_weights('model_weights.h5')) 打开(“model_architecture.json”,“w”)作为json_文件: json_file.write(model.to_json()) 在Predict.py中加载模型(注意:从“WordModel.py”导入的所有函数都只是我编写的与Keras无关的文本处理函数):

从WordModel按单词导入单词,从单词导入到向量,从向量导入到单词
进口gensim
导入tensorflow作为tf
从tensorflow.python.keras.models导入load_模型,从_json导入模型
打开('model_architecture.json','r')作为json_文件:
model_json=json_file.read()
keras_model=model_from_json(model_json)
keras_模型荷载重量(“模型重量.h5”)
我希望没有输出,只是加载模型。但是,我得到了模型的详细训练输出,如下所示(运行Predict.py时):

等等

请注意,我在Predict.py文件中没有执行任何训练命令。我已经多次重新运行代码,并确保运行了正确的文件。不过,似乎什么也没起作用


谢谢你的帮助

问题可能出在您的VSCode IDE上,它需要额外的配置才能使用Python及其包——当您运行一个脚本时,您可能正在运行所有脚本,因此会出现这种行为。我推荐的一个解决方案是切换到并安装您的软件包。安装完这两个命令后,在PC上搜索“anaconda命令提示符”或“anaconda powershell”,然后在终端中键入:

conda update conda
conda update --all
conda install numpy # optional (sort of)
conda install matplotlib # optional (sort of)
# SEE BELOW
conda install -c conda-forge keras
conda update --all # final 'cleanup' command - ensures package compatibility
如果你打算使用GPU(强烈推荐),你需要先下载CUDA(文章中的CUDA是10而不是9)。然后运行
conda安装tensorflow gpu
,如本文所述

然后,在Spyder:
Tools->Preferences->PYTHONPATH manager
->添加您计划使用的模块/数据的所有文件夹,这样您就不必每次都
%cd
,也不用担心相对路径,可以直接导入。最后,确保Anaconda&Spyder使用正确的方法


重新启动Spyder,运行脚本-假设没有bug,一切都会好起来。

问题可能出在您的VSCode IDE上,它需要额外的配置才能与Python及其包一起工作——当您运行一个脚本时,您可能正在运行所有脚本,因此会出现这种行为。我推荐的一个解决方案是切换到并安装您的软件包。安装完这两个命令后,在PC上搜索“anaconda命令提示符”或“anaconda powershell”,然后在终端中键入:

conda update conda
conda update --all
conda install numpy # optional (sort of)
conda install matplotlib # optional (sort of)
# SEE BELOW
conda install -c conda-forge keras
conda update --all # final 'cleanup' command - ensures package compatibility
如果你打算使用GPU(强烈推荐),你需要先下载CUDA(文章中的CUDA是10而不是9)。然后运行
conda安装tensorflow gpu
,如本文所述

然后,在Spyder:
Tools->Preferences->PYTHONPATH manager
->添加您计划使用的模块/数据的所有文件夹,这样您就不必每次都
%cd
,也不用担心相对路径,可以直接导入。最后,确保Anaconda&Spyder使用正确的方法


重新启动Spyder,运行脚本-假设没有bug,一切都会好起来。

您确定运行的文件正确吗?是的,我有两个c