我尝试使用Tensorflow进行以下操作:


考虑到我已经学习了神经网络文件:检查点,*。meta,*。data和* .index。
我想提取学习的值(权重,偏差,...)以显示或处理到文件/其他工具中,以进行进一步分析。
我想修改一些学习值(例如,用0代替一些已经很小的权重,以简化计算)。
修改后的值应重新加载回模型。
结果,我希望获得相同的检查点集,*。meta,*。data和* .index文件,但具有一些修改后的值(来自第4步)。


注意:用于生成初始模型的脚本是未知的。我在步骤1中所拥有的只是列出的4个文件。

到目前为止,我设法做到的是提取图形定义并显示学习的值(使用inspect_checkpoint.py)。我发现无法更改模型上的值并将其导出回* .data,*。meta,*。index和检查点的集合。通过API之后,我看不到用于此类操作的明显工具。可能吗
最好的问候,并感谢您的支持!

最佳答案

在C ++中,您可以使用CheckpointReaderBundleWriter从/向检查点文件读取/写入张量:

BundleWriter writer(tensorflow::Env::Default(), "out.ckpt");

TF_Status status;
tensorflow::checkpoint::CheckpointReader reader("in.ckpt", &status);

const auto& var_to_shape_map = reader.GetVariableToShapeMap();
for (const auto& elem : var_to_shape_map) {
  std::unique_ptr<Tensor> weights;
  const string& key = elem.first;
  reader.GetTensor(key, &weights, &status);
  auto weights_flat = weights->flat<float>();
  for (int i = 0; i < weights->NumElements(); ++i) {
    // replace with 0 some weights that are already of small value
    if (weights_flat(i) < SMALL_VALUE_THRESHOLD) {
      weights_flat(i) = 0.f;
    }
  }
  writer.Add(key, *weights.get());
}
writer.Finish();


运行上述代码后,您将获得out.ckpt.dataout.ckpt.index
您可以使用原始的* meta文件,因为我们仅修改了学习权重的值,并且元信息保持不变。

关于python - Tensorflow-显示和手动修改学习模型的权重并导出以进一步学习,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46687438/

10-09 03:03