簡體   English   中英

加載權重時Keras ValueError

[英]Keras ValueError when loading weights

This is the error message I got

Traceback (most recent call last):
    File "/home/xxx/Documents/program/test.py", line 27, in <module>
model.load_weights('models/model.h5')
    File "/home/xxx/Documents/program/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/network.py", line 1391, in load_weights
saving.load_weights_from_hdf5_group(f, self.layers)
    File "/home/xxx/Documents/program/venv/lib/python3.6/site-packages/tensorflow/python/keras/engine/saving.py", line 732, in load_weights_from_hdf5_group
' layers.')
ValueError: You are trying to load a weight file containing 2 layers into a model with 0 layers.

From this minimal example that produces the error

from tensorflow import keras
from data import get_data

X_train, y_train, X_val, y_val = get_data()  # get some train and val data

model = keras.Sequential()
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dense(7, activation='softmax'))

model.compile(
    optimizer=keras.optimizers.Adam(1e-4),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

model.fit(
    x=X_train,
    y=y_train,
    batch_size=500,
    epochs=200,
    verbose=2,
    validation_data=(X_val, y_val)
)

model.save_weights('models/model.h5')

model.load_weights('models/model.h5')

Directly running this does not produce the error. However, when I run the program for a second time commenting out the training part (from line 10 to 25) trying to load the weights, it gives me this error.

I am using Tensorflow 1.9.0 and the built-in Keras.

如上所述,在keras順序模式下似乎存在一個錯誤: https : //github.com/keras-team/keras/issues/10417

但是,您可以使用Keras Functional API來解決此問題(在構建具有復雜I / O和張量級聯的棘手RNN模型時,您還會發現Functional API更加有用)。

使用model.save_weights()方法保存神經網絡的缺點是,您必須在將.h5權重加載到NN中之前調用模型體系結構。 如果您保存整個模型(包括參數和體系結構),則會發現將經過訓練的模型加載到Python對象中要容易得多。 您可以通過使用model.save()方法來實現。

### TRAINING CODE
import tensorflow as tf
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# some data
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
y_train_oh = tf.keras.utils.to_categorical(y_train)
y_val_oh = tf.keras.utils.to_categorical(y_val)

# Keras Functional API
x = tf.keras.Input(shape=(4,))
dense = tf.keras.layers.Dense(64, activation='relu')(x)
dense = tf.keras.layers.Dense(3, activation='softmax')(dense)
model = tf.keras.Model(inputs=x, outputs=dense)
model.compile(optimizer=tf.keras.optimizers.Adam(1e-4),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
# training
model.fit(X_train, y_train_oh, 16, epochs=20, validation_data=(X_val, y_val_oh))
# save weights
model.save_weights('models/model_weights.h5')
# save weights AND architecture
model.save('models/model.h5')


### TESTING CODE
# Model loading using .h5 weights file
import tensorflow as tf
x = tf.keras.Input(shape=(4,))
dense = tf.keras.layers.Dense(64, activation='relu')(x)
dense = tf.keras.layers.Dense(3, activation='softmax')(dense)
model2 = tf.keras.Model(inputs=x, outputs=dense)
model2.load_weights('models/model_weights.h5')

# Model loading using .h5 model file
import tensorflow as tf
model3 = tf.keras.models.load_model('models/model.h5') # simpler API, but bigger filesize

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM