是否可以在喀拉拉邦持续培训多类分类问题?

时间:2019-06-28 06:31:24

标签: keras

我试图继续接受喀拉拉邦的训练。 因为我有了新的标签和值之后就建立了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}}]]

1 个答案:

答案 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')