Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每次保存模型时,keras.Model.save都会更改二进制文件_Python_Tensorflow_Keras_Reproducible Research_Binary Reproducibility - Fatal编程技术网

Python 每次保存模型时,keras.Model.save都会更改二进制文件

Python 每次保存模型时,keras.Model.save都会更改二进制文件,python,tensorflow,keras,reproducible-research,binary-reproducibility,Python,Tensorflow,Keras,Reproducible Research,Binary Reproducibility,为什么每次运行时,keras.Model.save()都会产生不同的二进制文件,而我已经采取了所有必要的步骤来实现结果甚至二进制文件的完全再现性 您可以通过在docker容器中执行以下脚本来验证这一点。保存的\u model.pb和变量目录的内容始终会更改。使用以下内容创建容器: docker-run--rm--volume=/host/dir/with/script:/workspace-it-tensorflow/tensorflow:2.4.1bash #设置环境变量。 导入操作系统 os

为什么每次运行时,
keras.Model.save()
都会产生不同的二进制文件,而我已经采取了所有必要的步骤来实现结果甚至二进制文件的完全再现性

您可以通过在docker容器中执行以下脚本来验证这一点。
保存的\u model.pb
变量
目录的内容始终会更改。使用以下内容创建容器:
docker-run--rm--volume=/host/dir/with/script:/workspace-it-tensorflow/tensorflow:2.4.1bash

#设置环境变量。
导入操作系统
os.environ[“TF_DETERMINISTIC_OPS”]=“1”
os.environ[“TF\u CPP\u MIN\u LOG\u LEVEL”]=“2”
将numpy作为np导入
随机输入
导入tensorflow作为tf
导入时间
def初始化_种子(种子):
os.environ[“pythonhasheed”]=str(seed)
随机。种子(种子)
np.随机种子(种子)
tf.random.set_种子(seed)
种子=42
初始化_种子(种子)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
mnist=tf.keras.datasets.mnist
(x_列,y_列),(x_测试,y_测试)=列表负载数据()
x_系列,x_测试=x_系列/255.0,x_测试/255.0
模型=tf.keras.models.Sequential([
tf.keras.layers.Flatten(输入_形状=(28,28)),
tf.keras.layers.Dense(128,活化='relu'),
tf.keras.层压降(0.2),
tf.keras.致密层(10),
tf.keras.layers.Softmax()
],name=“有史以来最好的”)
model.compile(
优化器='adam',
损耗=tf.keras.loss.SparseCategoricalCross熵(),
指标=['准确度']
)
模型拟合(x_序列,y_序列,历元=2)
评估模型(x_检验,y_检验,verbose=2)
#保存模型权重。
ckpt=“/cp-0.ckpt”
model.save_权重(model.name+ckpt)
#另请保存keras模型。
model.save(model.name)
#转换模型。
converter=tf.lite.TFLiteConverter.from_keras_model(model)
#包括必要的功能。
converter.target_spec.supported_ops=[tf.lite.OpsSet.TFLITE_内置,
tf.lite.optset.SELECT\u tf\u OPS]
tflite_model=converter.convert()
#保存模型。
将open('model.tflite','wb')作为f:
f、 写入(tflite_模型)
#从磁盘加载TFLite模型并分配张量。
解释器=tf.lite.解释器(model\u path=“model.tflite”)
解释器。分配_张量()
#获取输入和输出张量。
input\u details=解释器。获取\u input\u details()
output\u details=解释器。获取\u output\u details()
#在相同数据上测试模型输出,以确保功能正确。
input_shape=输入_详细信息[0]['shape']
input_data=np.ones((input_形状),dtype=np.float32)*0.5
解释器。设置解释器张量(输入解释器详细信息[0]['index'],输入解释器数据)
invoke()解释器
#函数“get_tensor()”返回张量数据的副本。
#使用'tensor()`获取指向该张量的指针。
输出数据=解释器。获取张量(输出详细信息[0]['index'])
打印(输出数据形状)

谢谢。

这不是keras,更可能是HDF5库(h5py),因为HDF5文件中的数据集也有时间戳之类的元数据。TF格式也可能有这样的信息,在运行之间会发生变化。@Dr.Snoopy,我的示例是以.pb格式导出。好了,这不使用HDF5吗?我还假设可能是时间戳导致了这种情况,但我希望在深入研究tensorflow代码之前能得到一些指针。