首页 > 解决方案 > 保存 Keras 模型错误:AttributeError: 'numpy.dtype' object has no attribute 'item'

问题描述

我试图将我的 Keras 模型保存在出现错误的 pycharm 中,这就是我创建模型的方式:

main_input = Input(shape=(X_train.shape[1],), dtype=X_train.dtype, 
name='main_input')
xx = Embedding(output_dim=512, input_dim=3000, input_length=len(X)) 
(main_input)
xx= SpatialDropout1D(0.4)(xx)
lstm_out = LSTM(64)(xx)


#lstm_out = Dense(3,activation='softmax')(lstm_out)
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

auxiliary_input = Input(shape=(Z_train.shape[1],), name='aux_input')
auxB= Input(shape=(hasB_train.shape[1],), name='aux_B')
auxM = Input(shape=(hasM_train.shape[1],), name='aux_M')
auxBM_input = keras.layers.concatenate([ auxB, auxM])


auxiliary_output = Dense(3, activation='softmax', name='aux_output')        (lstm_out)
auxBM_output = Dense(3, activation='softmax', name='auxBM_output')        (auxBM_input)


x = keras.layers.concatenate([lstm_out, auxiliary_input, auxBM_input])
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
main_output = Dense(3, activation='sigmoid', name='main_output')(x)



model = Model(inputs=[main_input, auxiliary_input, auxB, auxM], outputs=    [main_output, auxiliary_output, auxBM_output])
model.compile(optimizer='rmsprop', loss='categorical_crossentropy'     ,metrics = ['accuracy'], loss_weights=[4, 1, 10])

model.summary()

当我运行此代码时model.save('model.h5'),我收到以下错误:

回溯(最后一次调用):文件“C:/.../ENV/newDataset/combined3.py”,第 209 行,在 model.save('blah.h5') 文件“C:\ProgramData\Anaconda2\envs \Building_Deep_Learning_Keras\lib\site-packages\keras\engine\network.py”,第 1085 行,保存 save_model(self, filepath, overwrite, include_optimizer) 文件“C:\ProgramData\Anaconda2\envs\Building_Deep_Learning_Keras\lib\site- packages\keras\engine\saving.py",第 117 行,在 save_model },默认 =get_json_type).encode('utf8') 文件 "C:\ProgramData\Anaconda2\envs\Building_Deep_Learning_Keras\lib\json__init__.py",行237,在转储中 **kw).encode(obj) 文件“C:\ProgramData\Anaconda2\envs\Building_Deep_Learning_Keras\lib\json\encoder.py”,第 198 行,在编码块 = self.iterencode(o,_one_shot=True) 文件“C:\ProgramData\Anaconda2\envs\Building_Deep_Learning_Keras\lib\json\encoder.py”,第 256 行,在 iterencode 返回 _iterencode(o, 0) 文件“C:\ProgramData\Anaconda2\envs\Building_Deep_Learning_Keras \lib\site-packages\keras\engine\saving.py",第 84 行,在 get_json_type 返回 obj.item() AttributeError: 'numpy.dtype' object has no attribute 'item'

如果我运行以下代码,我没有问题:

model = Sequential() 
model.add(Embedding(max_fatures, embed_dim,input_length = X.shape[1])) 
model.add(SpatialDropout1D(0.4)) 
model.add(LSTM(lstm_out, dropout=0.2, recurrent_dropout=0.2))  
model.add(Dense(3,activation='softmax')) 
model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['accuracy']) 
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,train_size=0.8, random_state = 42) 
model.fit(X_train, Y_train, epochs = 1, batch_size=32,shuffle=True)    
model.save('test.h5')

标签: tensorflowmachine-learningkeras

解决方案


我相信您遇到这个问题是因为 Keras 在dtype创建功能模型时如何处理参数。Keras 期望dtype只是一个简单的字符串而不是一个numpy.dtype对象,因此,当您将一个 numpy 对象传递给此参数时,它将很难保存模型。

为了进行调整,我将使用其中一个字符串来描述数据输入类型,如https://keras.io/backend/中所建议的那样。

我有一个类似的问题,当我将dtype参数更改为 Keras 所期望的(字符串)时,我能够保存模型而没有任何其他问题。

为了解决您的问题,我建议将dtype=X_train.dtype参数更改为dtype=X_train.dtype.name,因为这会产生 的字符串形式dtype,可以由 Keras 处理。


推荐阅读