如何提取多模式自动编码器的已编码part.h5并将其另存为numpy数组?

问题描述

我两次发布了这个问题,但没有完全解决问题,我希望现在就做。

当前,我正在研究一种深多模自动编码器,该编码器具有两个输入并产生两个输出(它们是重构的输入)。两个输入的形状分别为(1000,50)和(1000,60),模型具有3个隐藏层,目的是将输入1和输入2的两个潜在层连接起来。

这是模型的完整代码:

input_X = Input(shape=(X[0].shape))

dense_X = Dense(40,activation='relu')(input_X)

dense1_X = Dense(20,activation='relu')(dense_X)

latent_X= Dense(2,activation='relu')(dense1_X)

input_X1 = Input(shape=(X1[0].shape))

dense_X1 = Dense(40,activation='relu')(input_X1)

dense1_X1 = Dense(20,activation='relu')(dense_X1)

latent_X1= Dense(2,activation='relu')(dense1_X1)

Concat_X_X1 = concatenate([latent_X,latent_X1])

decoding_X = Dense(20,activation='relu')(Concat_X_X1)

decoding1_X = Dense(40,activation='relu')(decoding_X)

output_X = Dense(X[0].shape[0],activation='sigmoid')(decoding1_X)

decoding_X1 = Dense(20,activation='relu')(Concat_X_X1)

decoding1_X1 = Dense(40,activation='relu')(decoding_X1)

output_X1 = Dense(X1[0].shape[0],activation='sigmoid')(decoding1_X1)

multi_modal_autoencoder = Model([input_X,input_X1],[output_X,output_X1],name='multi_modal_autoencoder')

encoder = Model([input_X,Concat_X_X1)

encoder.save('encoder.h5')

multi_modal_autoencoder.compile(optimizer=keras.optimizers.Adam(lr=0.001),loss='mse')

model = multi_modal_autoencoder.fit([X,X1],[X,epochs=70,batch_size=150)

我的目标是提取模型的编码部分(其表现为.h5文件)并将数据保存为numpy数组,然后将concatenate_1转换为numpy数组,其形状为(1000,4)以供使用用于回归任务。为此,我执行了以下操作:

file = h5py.File('encoder.h5','r')
keys = list(file.keys())   #it returns models weights as key
value = file.get('model_weights') #<HDF5 group "/model_weights" (9 members)> 
the 9 members are ['concatenate_1','dense_1','dense_2','dense_3','dense_4','dense_5','dense_6','input_1','input_2'].
file['/model_weights/concatenate_1']) returns <HDF5 group "/model_weights/concatenate_1" (0 members)> 

我也尝试过

value = file['/model_weights/concatenate_1'][:]

但是它会产生以下错误

AttributeError                            Traceback (most recent call last)
<ipython-input-18-7bc6cbac9468> in <module>
----> 1 value = file['/model_weights/concatenate_1'][:]

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

~\Anaconda3\envs\tensorflow\lib\site-packages\h5py\_hl\group.py in __getitem__(self,name)
    260                 raise ValueError("Invalid HDF5 object reference")
    261         else:
--> 262             oid = h5o.open(self.id,self._e(name),lapl=self._lapl)
    263 
    264         otype = h5i.get_type(oid)

~\Anaconda3\envs\tensorflow\lib\site-packages\h5py\_hl\base.py in _e(self,name,lcpl)
    135         else:
    136             try:
--> 137                 name = name.encode('ascii')
    138                 coding = h5t.CSET_ASCII
    139             except UnicodeEncodeError:

AttributeError: 'slice' object has no attribute 'encode'

请帮忙吗?

解决方法

根据您的输出,该对象file[/model_weights/concatenate_1']是一个组。因此,此表达式无效。 (它用于以NumPy数组的形式访问数据集。)

value = file['/model_weights/concatenate_1'][:]

您需要确定哪些对象是组,哪些对象是数据集。您可以使用HDFView或h5dump来做到这一点,或者编写一些代码来访问每个对象并输出类型。这是一些执行第三个选项的代码:

import h5py
def visit_func(name,node) :
    print ('Full object pathname is:',node.name)
    if isinstance(node,h5py.Group) :
        print ('Object:',name,'is a Group\n')
    elif isinstance(node,h5py.Dataset) :
        print ('Object:','is a Dataset\n')
    else :
        print ('Object:','is an unknown type\n')
   
with h5py.File('encoder.h5','r') as h5r:     
    h5r.visititems(visit_func)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...