use*_*212 14 regression machine-learning neural-network keras
我想用
flow_from_directory
Run Code Online (Sandbox Code Playgroud)
的方法
ImageDataGenerator
Run Code Online (Sandbox Code Playgroud)
生成回归模型的训练数据,其中目标值可以是介于1和-1之间的任何浮点值.
flow_from_directory
Run Code Online (Sandbox Code Playgroud)
有一个带有descripton的"class_mode"参数
class_mode:"分类","二进制","稀疏"或"无"之一.默认值:"分类".确定返回的标签数组的类型:"分类"将是2D单热编码标签,"二进制"将是1D二进制标签,"稀疏"将是1D整数标签.
我应该选择以下哪些值?他们似乎都不适合......
小智 8
我认为以不同的方式组织数据,使用 DataFrame(不必将图像移动到新位置)将允许您运行回归模型。简而言之,在 DataFrame 中创建包含每个图像的文件路径和目标值的列。这允许您的生成器保持回归值和图像正确同步,即使您在每个时期对数据进行洗牌。
这是一个示例,展示了如何将图像与二项式目标、多项式目标和回归目标联系起来,只是为了表明“一个目标是一个目标是一个目标”,并且只有模型可能会改变:
df['path'] = df.object_id.apply(file_path_from_db_id)
df
object_id bi multi path target
index
0 461756 dog white /path/to/imgs/756/61/blah_461756.png 0.166831
1 1161756 cat black /path/to/imgs/756/61/blah_1161756.png 0.058793
2 3303651 dog white /path/to/imgs/651/03/blah_3303651.png 0.582970
3 3367756 dog grey /path/to/imgs/756/67/blah_3367756.png -0.421429
4 3767756 dog grey /path/to/imgs/756/67/blah_3767756.png -0.706608
5 5467756 cat black /path/to/imgs/756/67/blah_5467756.png -0.415115
6 5561756 dog white /path/to/imgs/756/61/blah_5561756.png -0.631041
7 31255756 cat grey /path/to/imgs/756/55/blah_31255756.png -0.148226
8 35903651 cat black /path/to/imgs/651/03/blah_35903651.png -0.785671
9 44603651 dog black /path/to/imgs/651/03/blah_44603651.png -0.538359
10 49557622 cat black /path/to/imgs/622/57/blah_49557622.png -0.295279
11 58164756 dog grey /path/to/imgs/756/64/blah_58164756.png 0.407096
12 95403651 cat white /path/to/imgs/651/03/blah_95403651.png 0.790274
13 95555756 dog grey /path/to/imgs/756/55/blah_95555756.png 0.060669
Run Code Online (Sandbox Code Playgroud)
我在这里用例子详细描述了如何做到这一点:
目前(2017年1月21日发布的最新版本的Keras)flow_from_directory只能以以下方式工作:
您需要以以下方式构造目录:
directory with images\
1st label\
1st picture from 1st label
2nd picture from 1st label
3rd picture from 1st label
...
2nd label\
1st picture from 2nd label
2nd picture from 2nd label
3rd picture from 2nd label
...
...
Run Code Online (Sandbox Code Playgroud)flow_from_directory以的格式返回固定大小的批次(picture, label)。因此,如您所见,它只能用于分类案例,并且文档中提供的所有选项仅指定将类提供给分类器的方式。但是,有一个简洁的技巧可以flow_from_directory对回归任务有用:
您需要按照以下方式构建目录:
directory with images\
1st value (e.g. -0.95423)\
1st picture from 1st value
2nd picture from 1st value
3rd picture from 1st value
...
2nd value (e.g. - 0.9143242)\
1st picture from 2nd value
2nd picture from 2nd value
3rd picture from 2nd value
...
...
Run Code Online (Sandbox Code Playgroud)您还需要一个列表list_of_values = [1st value, 2nd value, ...]。然后按照以下方式定义生成器:
def regression_flow_from_directory(flow_from_directory_gen, list_of_values):
for x, y in flow_from_directory_gen:
yield x, list_of_values[y]
Run Code Online (Sandbox Code Playgroud)而对于flow_from_directory_gena来说class_mode='sparse',使这项工作至关重要。当然,这有点麻烦,但它可以工作(我使用了此解决方案:))
在Keras 2.2.4中,您可以使用“ .flow_from_dataframe”解决您想做的事情,允许您从目录中流出图像以解决回归问题。您应该将所有图像存储在一个文件夹中,并加载一个数据帧,该数据帧的一列包含图像ID,另一列包含回归分数(标签),并在“ .flow_from_dataframe”中设置“ class_mode ='other'”。
在这里,您可以找到一个示例,其中图像位于“ image_dir”中,带有图像ID和回归分数的数据框加载有来自“训练文件”中的熊猫
train_label_df = pd.read_csv(train_file, delimiter=' ', header=None, names=['id', 'score'])
train_datagen = ImageDataGenerator(rescale = 1./255, horizontal_flip = True,
fill_mode = "nearest", zoom_range = 0.2,
width_shift_range = 0.2, height_shift_range=0.2,
rotation_range=30)
train_generator = train_datagen.flow_from_dataframe(dataframe=train_label_df, directory=image_dir,
x_col="id", y_col="score", has_ext=True,
class_mode="other", target_size=(img_width, img_height),
batch_size=bs)
Run Code Online (Sandbox Code Playgroud)