【发布时间】:2019-04-20 19:48:23
【问题描述】:
我想训练一个卷积网络来解决图像数据上的多类、多标签问题。由于数据的性质,并且出于我会饶恕你的原因,最好我可以使用自定义 R 生成器函数来提供给 fit_generator 命令,而不是其内置的 image_data_generator 和 @ 987654324@ 命令(我成功地能够开始工作,只是不是针对这个特定问题)。
在这里 (https://www.rdocumentation.org/packages/keras/versions/2.2.0/topics/fit_generator) 它说我可以做到这一点,但没有给出任何示例。所以我尝试了以下方法。这是我正在尝试做的一个非常精简的示例(此代码完全是自包含的):
library(keras)
library(reticulate) #for py_iterator function
play.network = keras_model_sequential() %>%
layer_dense(units = 10, activation = "relu", input_shape = c(10)) %>%
layer_dense(units = 1, activation = "relu")
play.network %>% compile(
optimizer = "rmsprop",
loss = "mse"
)
mikes.custom.generator.function = function() #generates a 2-list of a random 1 x 10 array, and a scalar
{
new.func = function()
{
arr = array(dim = c(1,10))
arr[,] = sample(1:10, 10, replace = TRUE)/10
return(list(arr,runif(1)))
}
}
mikes.custom.iterator = py_iterator(mikes.custom.generator.function()) #creates a python iterator object
generator_next(mikes.custom.iterator) #correctly returns a 2-member list consisting of a 1 x 10 array, and a scalar
generator_next(mikes.custom.iterator)[[1]] #a 1 x 10 array
generator_next(mikes.custom.iterator)[[2]] #a scalar
#try to fit with "fit_generator":
play.network %>% fit_generator( #FREEZES.
mikes.custom.iterator,
steps_per_epoch = 1,
epochs = 1
)
事情在训练时冻结,没有给我错误消息或任何东西。我还针对我的原始问题使用自定义图像数据生成器进行了尝试,结果相同。
请注意,如果我只使用fit 并手动输入训练数据,这个网络训练得很好:
play.network %>% fit(generator_next(mikes.custom.iterator)[[1]],generator_next(mikes.custom.iterator)[[2]], epochs = 1, batch_size = 1)
#trains just fine
我想我知道问题所在,但我不知道解决方案。如果您向它询问我的自定义迭代器的类,它会给出
class(mikes.custom.iterator)
[1] "python.builtin.iterator" "rpytools.generator.RGenerator" "python.builtin.object"
而如果我使用内置的 image_data_generator 和 flow_images_from_directory 命令构建一个迭代器,它会给出
train_datagen <- image_data_generator(rescale = 1/255)
class(train_datagen)
[1] "keras.preprocessing.image.ImageDataGenerator" "keras_preprocessing.image.ImageDataGenerator" "python.builtin.object"
train_generator <- flow_images_from_directory(
train_dir,
train_datagen,
....
)
class(train_generator)
[1] "python.builtin.iterator" "keras_preprocessing.image.DirectoryIterator" "keras_preprocessing.image.Iterator" "tensorflow.python.keras.utils.data_utils.Sequence" "python.builtin.object"
所以我的猜测是train_datagen 和/或train_generator 具有mikes.custom.iterator 没有的属性,并且fit_generator 试图使用基本generator_next 以外的函数调用mikes.custom.iterator(即理论上它应该真正需要的一切)。但是我不知道它们可能是什么,也不知道如何正确构建mikes.custom.iterator,即使在网上搜索了两个小时。
帮助任何人?
【问题讨论】: