cross-validation keras - пояснение о разделении валидации в model.fit - PullRequest
0 голосов
/ 13 июля 2020
• 1000 при запуске model.fit мне нужно указать раздел проверки данных TRAIN или данных TEST? - Насколько я понимаю, это будет val_split тестовых данных, поскольку каждая свертка будет повторять разные их комбинации.

Обучаемая модель представляет собой многоклассовый классификатор с несколькими метками. * У меня есть ранняя остановка и контрольные точки модели, так как я хочу сохранить и наиболее эффективную модель.

код:

inputs=np.array(countsscale)#ALL data, scaled to between 0 and 1
targets=trainingtarget #ALL targets -- one-hot encoded using keras to_categorical


checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=fileName,monitor='val_loss',verbose=1,save_weights_only=True,save_freq='epoch')

#earlystopping
earlystop=tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5,verbose=1,mode='auto')


fold_no = 1
for train, test in kfold.split(normCountsscale1, trainingtarget):

  # Define the model 

    model=tf.keras.models.Sequential()
    model.add(tf.keras.layers.Dense(units=200, input_dim=10000, activation="relu"))
    model.add(tf.keras.layers.Dense(units=300, activation="relu"))
    model.add(tf.keras.layers.Dense(units=100, activation="relu"))
    model.add(tf.keras.layers.Dense(units=19, activation="sigmoid"))


  # Compile the model
    model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])



  # Generate a print
    print('------------------------------------------------------------------------')
    print(f'Training for fold {fold_no} ...')


    checkpoint = tf.keras.callbacks.ModelCheckpoint(checkpointDir+str(fold_no), 
                            monitor='val_loss', verbose=1, 
                            save_best_only=True, mode='auto')

    history=model.fit(inputs[train], targets[train],
            epochs=200,
            batch_size=32,
            verbose=1,
            validation_data=(inputs[test], targets[test]),
            callbacks=[checkpoint, earlystop], shuffle=True)

  
    scores = model.evaluate(inputs[test], targets[test], verbose=0)
    print(f'Score for fold {fold_no}: {model.metrics_names[0]} of {scores[0]}; {model.metrics_names[1]} of {scores[1]*100}%')
    acc_per_fold.append(scores[1] * 100)
    loss_per_fold.append(scores[0])

    # Increase fold number
    fold_no = fold_no + 1

первый вопрос: kfold.split позаботится о разделении, и ни о каком другом разделение до этого необходимо? Второй вопрос: аргумент validation_data в model.fit должен быть тестовыми данными из for train, test in kfold.split(normCountsscale1, trainingtarget): правильно?

или данные поезда (входы [поезд]) должны иметь свой собственный раздел проверки, т.е. validation_split=0.2 аргумент в model.fit, а затем тестовые данные оцениваются отдельно?

Причина путаницы, я видел обучение без какой-либо проверки в примерах перекрестной проверки и обучение, где разделение проверки - это именно набор тестов. 1020 * спасибо !!

...