Python 如何协调keras flow_从_数据框到实际标签的预测?
我一直在研究这个问题,虽然似乎有人提到它,但我没能让它发挥作用 我正在使用kerasPython 如何协调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生成器,我得到了本质上的随机
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
?