我试图继续接受喀拉拉邦的训练。 因为我有了新的标签和值之后就建立了keras多类分类模型。所以我想建立一个新模型而无需重新培训。这就是为什么我尝试在喀拉拉邦进行连续训练的原因。
model.add(Dense(10, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(training_data, labels, epochs=20, batch_size=1)
model.save("keras_model.h5")
保存完模型后,我想继续训练。所以我尝试过,
model1 = load_model("keras_model.h5")
model1.fit(new_input, new_label, epochs=20, batch_size=1)
model1.save("keras_model.h5")
我尝试过了。但是它被抛出一个错误。像以前的10节课但是现在我们添加新类意味着发生错误。
那么我的问题是,有可能继续在喀拉拉邦训练新类别的多类别分类吗?
tensorflow.python.framework.errors_impl.InvalidArgumentError:已收到 标签值10超出有效范围[0,9)。标签 值:10 [[{{node loss / dense_7_loss / SparseSoftmaxCrossEntropyWithLogits / SparseSoftmaxCrossEntropyWithLogits}}]]
答案 0 :(得分:1)
这种情况的典型方法是定义一个通用模型,该模型包含大多数内层并且可重复使用;然后是第二个模型,该模型定义了输出层,从而定义了类数。内部模型可以在后续的外部模型中重复使用。
未经测试的示例:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
def make_inner_model():
""" An example model that takes 42 features and outputs a
transformation vector.
"""
inp = Input(shape=(42,), name='in')
h1 = Dense(80, activation='relu')(inp)
h2 = Dense(40)(h1)
h3 = Dense(60, activation='relu')(h2)
out = Dense(32)(h3)
return Model(inp, out)
def make_outer_model(inner_model, n_classes):
inp = Input(shape=(42,), name='inp')
hidden = inner_model(inp)
out = Dense(n_classes, activation='softmax')(hidden)
model = Model(inp, out)
model.compile('adam', 'categorical_crossentropy')
return model
inner_model = make_inner_model()
inner_model.save('inner_model_untrained.h5')
model1 = make_outer_model(inner_model, 10)
model1.summary()
# model1.fit()
# inner_model.save_weights('inner_model_weights_1.h5')
model2 = make_outer_model(inner_model, 12)
# model2.fit()
# inner_model.save_weights('inner_model_weights_2.h5')