【发布时间】:2017-09-09 02:12:38
【问题描述】:
关于使用 h5py 覆盖数组的问题并没有解决我的问题。 我想编辑 VGG16 模型的数组值。
f = h5py.File('C:/Users/yash/.keras/models/vgg16_weights_tf_dim_ordering_tf_kernels_2.h5', mode = 'a')
ab = list(h5py.AttributeManager.keys(f))
print(list(f.attrs.keys()))
print(ab)
上面的代码返回:
['layer_names']
['block1_conv1', 'block1_conv2', 'block1_pool', 'block2_conv1', 'block2_conv2', 'block2_pool', 'block3_conv1', 'block3_conv2', 'block3_conv3',
'block3_pool', 'block4_conv1', 'block4_conv2', 'block4_conv3', 'block4_pool',
'block5_conv1', 'block5_conv2', 'block5_conv3', 'block5_pool', 'fc1', 'fc2',
'flatten', 'predictions']
使用此代码后:
print(f.attrs['layer_names'])
我得到以下信息:
[b'block1_conv1' b'block1_conv2' b'block1_pool' b'block2_conv1'
b'block2_conv2' b'block2_pool' b'block3_conv1' b'block3_conv2'
b'block3_conv3' b'block3_pool' b'block4_conv1' b'block4_conv2'
b'block4_conv3' b'block4_pool' b'block5_conv1' b'block5_conv2'
b'block5_conv3' b'block5_pool' b'flatten' b'fc1' b'fc2' b'predictions']
如何更改 f.attrs['layer_names'] 中包含的值?我无法编辑它们主要是因为使用:
print(f.attrs['layer_names/block1_conv1']) 返回错误。
每个block(n)_conv(n)内部都有一个权重和偏差矩阵。
我想更改这些值。
我在 python 3 中这样做,没有文档帮助我编辑这些值。主要是因为我无法在不使用此代码的情况下访问这些:
layer = h5py.AttributeManager.get(f, key = str(layerstringlist[i]))
nplayer = np.asarray(list(layer))
layerstringlist是这种方式的列表:
['block1_conv1/block1_conv1_W_1:0', 'block1_conv1/block1_conv1_b_1:0', .....
'predictions/predictions_W_1:0', 'predictions/predictions_b_1:0']
这会正确返回它,但我无法保存修改后的 h5 文件,因为我不知道如何在 python 3 中引用它。
提前致谢!
【问题讨论】:
-
您不能使用
f.attrs['layer_names'][0]、f.attrs['layer_names'][1]等访问内容吗? -
我试过了。 f.attrs['layer_names'][0][:] 返回 b'block1_conv1'。基本上它是一个列表,使用 [0] 对其进行索引。我需要访问“block1_conv1”中的组,这样我就可以使用该矩阵并对其进行编辑。有什么建议吗?
-
字符串是一个字节序列,所以是的,您会在该位置看到字符的 (ASCII) 值(
c为 107)。但实际上,这对您没有帮助,因为它只访问层的名称,而不是它们的数据。 -
我认为我无法访问子分支的原因是因为它们的名称是一个字节字符串,但是根 (layer_names) 只是一个字符串。所以使用这个: f.attrs['layer_names/block1_conv1'] 不起作用。你有什么技巧可以规避这个问题吗?谢谢。
-
我不清楚,为什么你不能直接访问它们:
f['block1_conv1']?因为'layer_names'只是f属性中的一个键。您还应该直接查看f.keys(),而不是f.attrs。