Python 如何协调keras flow_从_数据框到实际标签的预测?

Python 如何协调keras flow_从_数据框到实际标签的预测?,python,machine-learning,keras,Python,Machine Learning,Keras,我一直在研究这个问题,虽然似乎有人提到它,但我没能让它发挥作用 我正在使用kerasflow\u from\u dataframe。我的文件名和标签存储在两个数据帧中,一个用于train(df),一个用于validation(dfv)。 当我训练我的模型时,验证精度为.75。我可以通过查看model.history来验证这一点。即使是模型。评估\u生成器也将确认完全相同的值。 但是当我做一个模型时。使用提供给.fit和模型的完全相同的验证数据集预测\u生成器。评估\u生成器,我得到了本质上的随机

我一直在研究这个问题,虽然似乎有人提到它,但我没能让它发挥作用

我正在使用keras
flow\u from\u dataframe
。我的文件名和标签存储在两个数据帧中,一个用于train(df),一个用于validation(dfv)。 当我训练我的模型时,验证精度为.75。我可以通过查看
model.history
来验证这一点。即使是
模型。评估\u生成器
也将确认完全相同的值。 但是当我做一个
模型时。使用提供给
.fit
模型的完全相同的验证数据集预测\u生成器。评估\u生成器
,我得到了本质上的随机性(.5),这告诉我要么是发生了与观察顺序相同的事情,或者可能有管道的某些部分没有进行到评估部分(如重新缩放)

这是我的密码:

datagen=ImageDataGenerator(rescale=1./255.)

train_generator=datagen.flow_from_dataframe(
    dataframe=df,
    directory=path+'\\img.tar\\img',
    x_col="loc",
    y_col="target",
    weight_col=None,
    target_size=(32, 32),
    color_mode="rgb",
    classes=None,
    class_mode="binary",
    batch_size=100,
    shuffle=True,
    seed=SEED,
    save_to_dir=None,
    save_prefix="",
    save_format="png",
    subset=None,
    interpolation="nearest",
    validate_filenames=True
)
valid_generator=datagen.flow_from_dataframe(
    dataframe=dfv,
    directory=path+'\\img.tar\\img',
    x_col="loc",
    y_col="target",
    weight_col=None,
    target_size=(32, 32),
    color_mode="rgb",
    classes=None,
    class_mode="binary",
    batch_size=100,
    shuffle=False,
    seed=SEED,
    save_to_dir=None,
    save_prefix="",
    save_format="png",
    subset=None,
    interpolation="nearest",
    validate_filenames=True
)

#Found 8500 validated image filenames belonging to 2 classes.
#Found 500 validated image filenames belonging to 2 classes.

from keras.models import Sequential
#Import from keras_preprocessing not from keras.preprocessing
from keras_preprocessing.image import ImageDataGenerator
from keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization
from keras.layers import Conv2D, MaxPooling2D
from keras import regularizers, optimizers
import pandas as pd
import numpy as np

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=(32,32,3)))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=["accuracy"])

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
#STEP_SIZE_TEST=test_generator.n//test_generator.batch_size

hx = model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=1
)

#Epoch 1/1
#85/85 [==============================] - 74s 871ms/step - loss: 0.6584 - accuracy: 0.6398 - val_loss: 0.6059 - val_accuracy: 0.7500

hx.history

#{'val_loss': [0.6059464812278748],
 #'val_accuracy': [0.75],
 #'loss': [0.6583675097016727],
 #'accuracy': [0.6397647]}

model.evaluate_generator(generator=valid_generator,
steps=STEP_SIZE_VALID)

#[0.6059464812278748, 0.75]

pred=model.predict_generator(valid_generator,verbose=1,steps=STEP_SIZE_VALID)

roc_auc_score(dfv.label.values,pred.ravel())
#0.51
print(roc_auc_score(dfv.label.values,pred.ravel()>df['label'].mean()))
print(roc_auc_score(dfv.label.values,pred.ravel()>0.5))
#0.5
#0.5

您能在predict()之前重置有效的_生成器吗?使用'valid_generator.reset()
。您还可以使用
valid\u generator获取匹配的文件名。filenames`尝试了这一点并获得了相同的结果。文件名让我发疯。如果我不使用np.mean(valid_generator.filenames==dfv['loc']),这将得到1.0,这意味着文件名与数据帧的顺序相同。但是如果我使用np.mean(valid_generator.labels==dfv['label']),我得到0.5,这与预测问题一致,但与filenames.Ok不一致。我发现了这一点,并且相关的提交仍然是当前的:“如果[shuffle]设置为False,则按字母数字顺序对数据进行排序。”。你能试着把你的数据框也按字母数字顺序排序吗?另外,您是否可以尝试使用
shuffle=None
?是否可以尝试在predict()之前重置有效的_生成器?使用'valid_generator.reset()
。您还可以使用
valid\u generator获取匹配的文件名。filenames`尝试了这一点并获得了相同的结果。文件名让我发疯。如果我不使用np.mean(valid_generator.filenames==dfv['loc']),这将得到1.0,这意味着文件名与数据帧的顺序相同。但是如果我使用np.mean(valid_generator.labels==dfv['label']),我得到0.5,这与预测问题一致,但与filenames.Ok不一致。我发现了这一点,并且相关的提交仍然是当前的:“如果[shuffle]设置为False,则按字母数字顺序对数据进行排序。”。你能试着把你的数据框也按字母数字顺序排序吗?另外,您是否可以尝试使用
shuffle=None