我正在嘗試在 R keras 中根據我自己的資料訓練內置的 convnet 架構。我的資料存盤在 R 中的陣列中,而不是存盤在單個影像檔案中,這似乎是標準。
我認為我的主要問題是我不知道如何正確預處理我的特征資料。
這是資料和模型定義的一個簡單示例(有效):
#simulate data resembling images, but in array format:
p <- 32 # note: minium height/width for resnet
toy_x <- array(runif(p*p*100*3), c(100, p, p, 3))
toy_y <- runif(100)
#define and compile model
input <- layer_input(shape = c(p, p, 3))
N1 <- application_resnet50(weights = NULL,
input_tensor = input,
include_top = FALSE)
output_layer_instance <- layer_dense(units = 1, activation = 'sigmoid')
output <- input %>% N1() %>% output_layer_instance()
model <- keras_model(input, output)
model %>% compile(loss = "binary_crossentropy", optimizer = "adam")
但是當我嘗試使用以下代碼擬合模型時,出現錯誤:
model %>% fit(toy_x, toy_y, epochs = 1)
我不確定該錯誤是否提供了很多資訊,但這里是:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: in user code:
/root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
/root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:951 run **
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
return fn(*args, **kwargs)
/root/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:533 train_step
我嘗試了一些替代解決方案。如上所述,我認為問題可能是由于缺乏對特征資料的預處理。我曾嘗試使用內置的預處理功能,但沒有運氣 - 我在運行以下命令時遇到與上述相同的錯誤:
toy_x_preproc <- imagenet_preprocess_input(toy_x)
model %>% fit(toy_x_preproc, toy_y, epochs = 1)
我還測驗了代碼在不使用內置示例 resnet 的情況下運行,將其替換為一個簡單的 convnet(仍然使用函式式 API):
#define & compile model
model2_input <- layer_input(shape = c(p, p, 3))
model2_output <- model2_input %>%
layer_conv_2d(filters = 25, kernel_size = c(2,2), activation = "relu",
input_shape = c(p,p,1)) %>%
layer_max_pooling_2d(pool_size = c(2, 2)) %>%
layer_flatten() %>%
layer_dense(units = 1, activation = 'sigmoid')
model2 <- keras_model(model2_input, model2_output)
model2 %>% compile(
loss = "binary_crossentropy",
optimizer = "adam")
#train on "raw" toy_x -- works
model2 %>% fit(toy_x, toy_y, epochs = 1)
這運行沒有錯誤。如果我重新運行整個塊但適合它,它也可以作業toy_x_preproc。
感謝您閱讀 - 我將不勝感激任何幫助。
uj5u.com熱心網友回復:
您的模型輸出形狀是shape(NULL,1,1,1),而您的訓練標簽的形狀是shape(NULL)。你可能想在你的模型中的降維層如果你正在做一個自定義的頂部,例如layer_flatten(),layer_global_max_pooling_3d()或者別的,降低了輸出的等級。您可能還想k_expand_dims()在訓練資料標簽中呼叫或手動包含一個值為 1 的維度,以將其從shape(batch_size)到shape(batch_size, 1)。
旁注:如果呼叫堆疊很大,則默認列印的錯誤將被截斷。如果您呼叫reticulate::py_last_error(),您仍然可以獲得完整的錯誤訊息,這通常會提供必要的線索。例如,在fit呼叫中遇到錯誤后立即,如果您運行,purrr::walk(reticulate::py_last_error(), cat)您會看到一個很長的列印輸出,其中包括作為最后一行的內容:
ValueError: `logits` and `labels` must have the same shape, received ((None, 1, 1, 1) vs (None, 1)).
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325714.html
上一篇:如何獲得不同的隨機嵌套字典?
下一篇:在kdb中把字串轉為長字串
