Ошибка значения: в коде пользователя при использовании модели keras в R

#python #r #tensorflow #keras

Вопрос:

Я пытаюсь запустить 1-мерный CNN в R, используя keras пакет. Я использую следующий код

 library(MASS)
library(keras)

##Create some data
data("Boston")
data <- Boston
# create a list of 70% of the rows in the original dataset we can use for training
set.seed(123)
training <- sample(nrow(data), 0.7 * nrow(data))

dataTrain <- data[training,]
dataTest <- data[-training,]

dataTrain_y <- as.matrix(dataTrain$medv)
dataTrain_x <- as.matrix(subset(dataTrain, select = -c(medv)))

dataTest_y <- as.matrix(dataTest$medv)
dataTest_x <- as.matrix(subset(dataTest, select = -c(medv)))

#Reshaping the data for CNN
dataTrain_x <- array_reshape(dataTrain_x, c(ncol(dataTrain_x), nrow(dataTrain_x), 1))
dataTest_x <- array_reshape(dataTest_x, c(ncol(dataTest_x), nrow(dataTest_x), 1))

#CNN model
model <- keras_model_sequential() %>%
  layer_conv_1d(filters=32, kernel_size=4, activation="relu", 
                input_shape=c(ncol(dataTrain_x), nrow(dataTrain_x))) %>%
  layer_max_pooling_1d(pool_size=2) %>%
  layer_conv_1d(filters=64, kernel_size=2, activation="relu") %>%
  layer_max_pooling_1d(pool_size=2) %>%
  layer_dropout(rate=0.4) %>%
  layer_flatten() %>%
  layer_dense(units=100, activation="relu") %>%
  layer_dropout(rate=0.2) %>%
  layer_dense(units=1, activation="linear")

model %>% compile(
  loss = "mse",
  optimizer =  "adam", #'sgd' can also be used
  metrics = list("mean_absolute_error")
)

model %>% summary()

history <- model %>% fit(dataTrain_x, dataTrain_y, 
                         epochs = 100, batch_size = 50, 
                         #callbacks = callback_tensorboard("logs/run_a"),
                         validation_split = 0.2)
 

Но это возвращает мне следующую ошибку

Ошибка в py_call_impl(вызывается, ключевые слова dots$args, dots$) : Ошибка значения: в коде пользователя: C:Python37libsite-packagestensorflowpythonkerasenginetraining.py:805 train_function * возвращаемая функция шага(self, итератор) C:Python37libsite-packagestensorflowpythonkerasenginetraining.py:795 step_function ** выходы = model.distribute_strategy.run(run_step, args=(данные,)) C:Python37libsite-packagestensorflowpythondistributedistribute_lib.py:1259 запустите return self. _ extended.call_for_each_replica(fn, аргументы=аргументы, аргументы=аргументы) C:Python37libsite-packagestensorflowpythondistributedistribute_lib.py:2730 call_for_each_replica возвращает self._call_for_each_replica(fn, аргументы, аргументы) C:Python37libsite-packagestensorflowpythondistributedistribute_lib.py:3417 _call_for_each_replica возвращает fn(*аргументы, **аргументы) C:Python37libsite-packagestensorflowpythonkerasenginetraining.py:788 run_step ** выводит = model.train_step(данные) C:Python37libsite-pac

Теперь как я могу устранить эту ошибку?

Ответ №1:

Сообщение об ошибке усечено, так что это не очень помогает, но мне кажется, что у вас есть некоторые незначительные опечатки. Если вы внесете предлагаемые изменения (комментарии»###»), модель, по-видимому, будет скомпилирована и обучена должным образом, например

 library(MASS)
library(keras)

##Create some data
data("Boston")
data <- Boston
# create a list of 70% of the rows in the original dataset we can use for training
set.seed(123)
training <- sample(nrow(data), 0.7 * nrow(data))

dataTrain <- data[training,]
dataTest <- data[-training,]

dataTrain_y <- as.matrix(dataTrain$medv)
dataTrain_x <- as.matrix(subset(dataTrain, select = -c(medv)))

dataTest_y <- as.matrix(dataTest$medv)
dataTest_x <- as.matrix(subset(dataTest, select = -c(medv)))

#Reshaping the data for CNN
### These dimensions don't look correct; switch ncol() with nrow()
dataTrain_x <- array_reshape(dataTrain_x, c(nrow(dataTrain_x), ncol(dataTrain_x), 1))
dataTest_x <- array_reshape(dataTest_x, c(nrow(dataTest_x), ncol(dataTest_x), 1))

#CNN model
model <- keras_model_sequential() %>%
  layer_conv_1d(filters=32, kernel_size=4, activation="relu", 
                ### The input shape doesn't look correct; instead of 
                ### `c(ncol(dataTrain_x), nrow(dataTrain_x))` (354, 13)
                ### I believe you want `dim(dataTest_x)` (13, 1)
                input_shape=c(ncol(dataTrain_x), 1)) %>%
  layer_max_pooling_1d(pool_size=2) %>%
  layer_conv_1d(filters=64, kernel_size=2, activation="relu") %>%
  layer_max_pooling_1d(pool_size=2) %>%
  layer_dropout(rate=0.4) %>%
  layer_flatten() %>%
  layer_dense(units=100, activation="relu") %>%
  layer_dropout(rate=0.2) %>%
  layer_dense(units=1, activation="linear")

model %>% compile(
  loss = "mse",
  optimizer =  "adam", #'sgd' can also be used
  metrics = list("mean_absolute_error")
)

model %>% summary()
#> Model: "sequential"
#> ________________________________________________________________________________
#> Layer (type)                        Output Shape                    Param #     
#> ================================================================================
#> conv1d_1 (Conv1D)                   (None, 10, 32)                  160         
#> ________________________________________________________________________________
#> max_pooling1d_1 (MaxPooling1D)      (None, 5, 32)                   0           
#> ________________________________________________________________________________
#> conv1d (Conv1D)                     (None, 4, 64)                   4160        
#> ________________________________________________________________________________
#> max_pooling1d (MaxPooling1D)        (None, 2, 64)                   0           
#> ________________________________________________________________________________
#> dropout_1 (Dropout)                 (None, 2, 64)                   0           
#> ________________________________________________________________________________
#> flatten (Flatten)                   (None, 128)                     0           
#> ________________________________________________________________________________
#> dense_1 (Dense)                     (None, 100)                     12900       
#> ________________________________________________________________________________
#> dropout (Dropout)                   (None, 100)                     0           
#> ________________________________________________________________________________
#> dense (Dense)                       (None, 1)                       101         
#> ================================================================================
#> Total params: 17,321
#> Trainable params: 17,321
#> Non-trainable params: 0
#> ________________________________________________________________________________

history <- model %>% fit(dataTrain_x, dataTrain_y, 
                         epochs = 100, batch_size = 50, 
                         #callbacks = callback_tensorboard("logs/run_a"),
                         validation_split = 0.2)
 

пример_1.png

Создано 2021-07-20 пакетом reprex (v2.0.0)

Комментарии:

1. Спасибо, теперь модель работает так, как вы сказали. Но когда я пытаюсь запустить дальнейший код , например model %>% evaluate(dataTrain_x, dataTrain_y, verbose = 0) , или model %>% predict(dataTest_x) , он выдает ошибку, например Error in py_call_impl(callable, dots$args, dots$keywords) : ValueError: Data cardinality is ambiguous: x sizes: 13 y sizes: 354 Make sure all arrays contain the same number of samples. , Можете ли вы, пожалуйста, проверить это?

2. Обе эти команды работают в моей системе должным образом: evaluate() возвращает «потеря 103,927383» и «ошибка mean_absolute_error 7,386703» и predict() возвращает столбец вероятностей. Это проблема с вашими «фактическими» данными и/или с данными примера Бостона? Возможно, удалите все объекты из окружающей среды и повторите попытку?

3. Я скопировал ваш полный код и запустил его. Сейчас он работает. Но я получаю другую потерю и ошибку mean_absolute_error. Почему это может происходить? Можете ли вы объяснить, как решить эту input_shape проблему ?

4. Вы получаете разные значения потерь/прибыли, потому что ваша модель отличается от моей. Такое поведение ожидается, поскольку обучение CNN является стохастическим ( machinelearningmastery.com/stochastic-in-machine-learning ). Это input_shape объясняется следующим образом: rdocumentation.org/packages/keras/versions/2.4.0/topics/. … В принципе, это «Размерность входных данных , не включающая ось выборок», поэтому для вашего массива (354, 13, 1) вы исключаете ось выборок (354), и у вас есть (13, 1) (13 векторов 1-мерных векторов). Видишь baeldung.com/cs/ml-understanding-dimensions-cnn

5. Большое вам спасибо за содержательный комментарий. Нет такого способа, как использовать set.seed() один и тот же вывод для одного и того же набора входных данных?