R keras говорит, что массив не имеет правильные размеры для conv_2d, но он удаляет значение из массива, который был правильным - PullRequest
0 голосов
/ 14 октября 2019

При создании общей сети keras принимает imput_shape из c (28, 28, 1), но когда я запускаю его для обучения, он сообщает мне, что он получил (6000, 28, 28). Я понимаю, что keras вводит размер данных сам, но почему он сбрасывает один, а затем тормозит?

Строка проблемы (я думаю):

model %>%   
  layer_conv_2d(filters = 32, kernel_size = c(3, 3), padding = 'same', input_shape = c(28, 28, 1)) %>%

Ошибка:

Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ValueError: Error when checking input: expected conv2d_5_input to have 4 dimensions, but got array with shape (60000, 28, 28)

Код:

library(keras)
install_keras(tensorflow = "gpu")

mnist <- dataset_mnist()

x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y

# # reshape
#x_train <- array_reshape(x_train, c(nrow(x_train), 784))
#x_test <- array_reshape(x_test, c(nrow(x_test), 784))
# # rescale
# x_train <- x_train / 255
# x_test <- x_test / 255

y_train <- to_categorical(y_train, 10)
y_test <- to_categorical(y_test, 10)
model <- keras_model_sequential() 
model %>%   
  layer_conv_2d(filters = 32, kernel_size = c(3, 3), padding = 'same',  input_shape = c(28, 28, 1)) %>%
  layer_activation('relu') %>%
  # layer_max_pooling_2d(pool_size=c(2, 2), strides=c(2, 2)) %>%
  layer_conv_2d(filters = 16, kernel_size = c(2, 2), dilation_rate = 1, activation = 'softplus', padding = 'same') %>%
  layer_max_pooling_2d(pool_size=c(2, 2)) %>%
  layer_flatten() %>%
  layer_dense(1000, activation = 'relu') %>%
  layer_dropout(0.5) %>%
  layer_dense(10, activation = 'softmax')

  # Stock test model functions
  # layer_dense(units = 256, activation = 'relu', input_shape = c(784)) %>% 
  # layer_dropout(rate = 0.4) %>% 
  # layer_dense(units = 128, activation = 'relu') %>%
  # layer_dropout(rate = 0.3) %>%
  # layer_dense(units = 10, activation = 'softmax') %>%


summary(model)

model %>% compile(
  loss = 'categorical_crossentropy',
  optimizer = optimizer_rmsprop(lr = 0.0001, decay = 1e-6),
  metrics = c('accuracy')
)

history <- model %>% fit(
  x_train, y_train, 
  epochs = 10
)

plot(history)

model %>% evaluate(x_test, y_test)

model %>% predict_classes(x_test)

1 Ответ

0 голосов
/ 15 октября 2019

Из документации layer_conv_2d:

input_shape: - Размерность ввода (целое число) без учета оси образцов. Этот аргумент необходим при использовании этого слоя в качестве первого слоя в модели.

Таким образом, форма ввода (28, 28, 1) означает 28 строк на 28 столбцов на 1 канал. В этом наборе данных есть только один канал, поскольку изображения черно-белые. Изображения RGB будут иметь 3 канала.

Вы получаете эту ошибку, потому что входная форма (60000, 28, 28), то есть 4-е измерение (канал) отсутствует. Это можно исправить, выполнив следующие действия: -

x_train <- array_reshape(x_train, dim = c(n_train, 28, 28, 1)) x_test <- array_reshape(x_test, dim = c(n_test, 28, 28, 1))

Полный код: -

library(keras)

mnist <- dataset_mnist()

x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y

n_train <- dim(x_train)[1]
n_test <- dim(x_test)[1]

x_train <- array_reshape(x_train, dim = c(n_train, 28, 28, 1))
x_test <- array_reshape(x_test, dim = c(n_test, 28, 28, 1))

y_train <- to_categorical(y_train, 10)
y_test <- to_categorical(y_test, 10)

model <- keras_model_sequential() 
model %>%   
    layer_conv_2d(filters = 32, kernel_size = c(3, 3), padding = 'same',  input_shape = c(28, 28, 1)) %>%
    layer_activation('relu') %>%
    # layer_max_pooling_2d(pool_size=c(2, 2), strides=c(2, 2)) %>%
    layer_conv_2d(filters = 16, kernel_size = c(2, 2), 
                  dilation_rate = c(1,1), activation = 'softplus', padding = 'same') %>%
    layer_max_pooling_2d(pool_size=c(2, 2)) %>%
    layer_flatten() %>%
    layer_dense(1000, activation = 'relu') %>%
    layer_dropout(0.5) %>%
    layer_dense(10, activation = 'softmax')

summary(model)

model %>% compile(
    loss = 'categorical_crossentropy',
    optimizer = optimizer_rmsprop(lr = 0.0001, decay = 1e-6),
    metrics = c('accuracy')
)

history <- model %>% fit(
    x_train, y_train, 
    epochs = 1
)

plot(history)

model %>% evaluate(x_test, y_test)

model %>% predict_classes(x_test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...