如何将模型从Lua转换为TensorFlow / Keras并提供预训练的权重

时间:2019-06-22 20:11:56

标签: python tensorflow keras lua

我有一个.t7文件,其中保存了网络体系结构和预先训练的权重。由于该模型是在Lua上训练的,并且需要nn和cudnn(由于我没有NVIDIA GPU而无法安装),因此我试图将所有内容转换为Keras / TensorFlow。

读取文件后,我有一个torchfile.TorchObject,在我的情况下是nn.Sequential火炬类型的对象,所有图层都是nn.layer或cudnn.layer。

假设我将.t7文件加载到名为readFile的变量中: readFile。 dir ()返回

[b'_type', b'output', b'gradInput', b'modules', b'train', 'torch_typename']

(b应该来自torchfile包,它不影响任何内容。)

readFiles.modules是TorchObject的列表,每个都有一些属性,例如:

[b'padW',
 b'pad',
 b'nInputPlane',
 b'output',
 b'gradInput',
 b'iSize',
 b'fgradInput',
 b'_type',
 b'gradBias',
 b'bias',
 b'output_slice',
 b'stride',
 b'benchmarked',
 b'dH',
 b'dW',
 b'output_offset',
 b'padH',
 b'kH',
 b'weight_offset',
 b'finput',
 b'input_slice',
 b'input_offset',
 b'weight',
 b'train',
 b'gradWeight',
 b'groups',
 b'kW',
 b'nOutputPlane',
 b'autotunerHash',
 'torch_typename'] 

torch.load()对我不起作用,因此我从torchfile包中使用了torchfile.load(),该文件将.t7文件读取到TorchObject中,可以在python笔记本中查询打印。

print(readFile.torch_typename())
for node in step1.modules:
    print("  "+str(node.torch_typename()))
    if(type(node.modules) == list):
        for node2 in node.modules:
            print("    "+str(node2.torch_typename()))
            if(type(node2.modules) == list):
                for node3 in node2.modules:
                    print("      "+str(node3.torch_typename()))

打印出的网络结构为:(省略了某些图层,带有'...')

b'nn.Sequential'
  b'cudnn.SpatialConvolution'
  b'cudnn.SpatialBatchNormalization'
  b'cudnn.ReLU'
  b'cudnn.SpatialMaxPooling'
  b'nn.Sequential'
    b'nn.Sequential'
      b'nn.ConcatTable'
      b'nn.CAddTable'
      b'cudnn.ReLU'
    ...
  b'cudnn.SpatialFullConvolution'
  b'cudnn.SpatialBatchNormalization'
  b'cudnn.ReLU'
  ...

如何使用所有这些属性规范将所有预训练的权重(作为Numpy数组)提供给TensorFlow / Keras层? 如何重新创建相同的结构?

0 个答案:

没有答案