Получение ошибки для подбора Conv1d для классификации пациентов с диабетом с использованием набора данных Pima Indian диабета с использованием керас в R - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в области машинного обучения.Я использовал пакет keras в R для классификации людей, страдающих диабетом, используя набор данных о диабете Pima Indian и подходил к Conv1d.Я не уверен, где я делаю ошибку, но получаю некоторые ошибки.

1: 8 столбцов - это элементы, а 9-й столбец - наша метка с кодировкой 0 и 1.

Размеры данных следующие:

dim (data)=(768,9)#Main data dimension

dim (training)=(534, 8)#Training set dimension

dim (test)=(234,8)#Testing set dimension

Пожалуйста, помогитемне идентифицировать ошибку.Заранее спасибо.

data=read.csv(file.choose(), header=T)


data=as.matrix(data)
head(data)
dimnames(data)=NULL
str(data)

#Data Normalization
data[, 1:8]=normalize(data[, 1:8])
summary(data)


#Data Partition 
set.seed(1234) 

ind=sample(2, nrow(data), replace=T, prob=c(0.7,0.3))
training=data[ind==1, 1:8]
test=data[ind==2, 1:8]
trainingtarget=data[ind==1, 9]
testtarget=data[ind==2, 9]


# reshape
dim(training) <- c(nrow(training), 8, 1)
dim(test) <- c(nrow(test), 8, 1)

dim(trainingtarget) <- c(nrow(trainingtarget), 1, 1)
dim(testtarget) <- c(nrow(testtarget), 1, 1)



cnn_bc_model <- keras_model_sequential()

cnn_bc_model %>%
  layer_conv_1d(filter=32, kernel_size=5, padding="same", input_shape=c(8,1)) %>%
  layer_activation("relu") %>%

  layer_conv_1d(filter=32, kernel_size=3) %>%
  layer_activation("relu") %>%

  layer_max_pooling_1d(pool_size=2) %>%
  layer_dropout(0.2) %>%

  layer_dense(units=1, activation='sigmoid')

cnn_bc_model %>% compile(loss='binary_crossentropy', optimizer='nadam', metrics = c('accuracy'))
cnn_bc_history <- cnn_bc_model %>% fit(training, trainingtarget, epochs=100, 
                                       batch_size=8, validation_split=0.2)

#Now evaluate the model with our test data set
cnn_bc_model %>%
  evaluate(test, testLabels)

Ошибка:

Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ValueError: A target array with shape (534, 1, 1) was passed for output of shape (None, 3, 1) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output.

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Я пробовал оба способа, как вы предложили, но все равно получаю ошибку.Я использовал следующий код.

data=read.csv(file.choose(), header=T)


data=as.matrix(data)
head(data)
dimnames(data)=NULL
str(data)

#Data Normalization
data[, 1:8]=normalize(data[, 1:8])
summary(data)


#Data Partition 
set.seed(1234) 

ind=sample(2, nrow(data), replace=T, prob=c(0.7,0.3))
training=data[ind==1, 1:8]
test=data[ind==2, 1:8]
trainingtarget=data[ind==1, 9]
testtarget=data[ind==2, 9]


# reshape
dim(training) <- c(nrow(training), 8, 1)
dim(test) <- c(nrow(test), 8, 1)

dim(trainingtarget) <- c(534, 1, 1)#534 is the length of this series
dim(testtarget) <- c(234, 1, 1)#234 is the length of this series


cnn_bc_model <- keras_model_sequential()
cnn_bc_model %>%
  layer_conv_1d(filter=32, kernel_size=5, input_shape=c(8,1)) %>%
  layer_activation("relu") %>%
  layer_conv_1d(filter=32, kernel_size=3) %>%
  layer_activation("relu") %>%
  layer_max_pooling_1d(pool_size=2) %>%
  layer_flatten() %>%
  layer_dropout(0.2) %>%
  layer_dense(units=1, activation='sigmoid') %>%
  layer_activation("softmax")

summary(cnn_bc_model)

cnn_bc_model %>% compile(loss='binary_crossentropy', optimizer='nadam', metrics = c('accuracy'))
cnn_bc_history <- cnn_bc_model %>% fit(training, trainingtarget, epochs=100, 
                                       batch_size=8, validation_split=0.2)

#Now evaluate the model with our test data set
cnn_bc_model %>%
  evaluate(test, testLabels)

Теперь ошибка выглядит иначе:

Ошибка в py_call_impl (callable, dots $ args, dots $ Keywords): InvalidArgumentError: Невозможно обновить переменную с shape [] с помощью Tensorс формой [8] формы должны быть одинаковыми.[[{{node metrics_22 / acc / AssignAddVariableOp}}]]

0 голосов
/ 30 июня 2019

Проблема в форме слоя max_pooling_1d. Для вашей конкретной модели у вас есть следующие формы слоя.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_3 (Conv1D)            (None, 8, 32)             192       
_________________________________________________________________
activation_4 (Activation)    (None, 8, 32)             0         
_________________________________________________________________
conv1d_4 (Conv1D)            (None, 6, 32)             3104      
_________________________________________________________________
activation_5 (Activation)    (None, 6, 32)             0         
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 3, 32)             0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 3, 32)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 3, 1)              33        
_________________________________________________________________
activation_6 (Activation)    (None, 3, 1)              0         
=================================================================
Total params: 3,329
Trainable params: 3,329
Non-trainable params: 0
_________________________________________________________________

Выходная форма вашей сети (None,3,1), которая не соответствует целевой форме, определенной ранее (None,1,1). Чтобы решить эту проблему, вы можете добавить слой layer_flatten к вашей модели между слоем max_pooling_1d и слоем dropout.

max_pooling1d_3 (MaxPooling1 (None, 3, 32)             0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 96)                0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 96)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 97        
_________________________________________________________________
activation_9 (Activation)    (None, 1)                 0         

Или вы можете добавить layer_flatten после последнего dense слоя и добавить еще один dense слой.

activation_12 (Activation)   (None, 3, 1)              0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 3)                 0         
_________________________________________________________________
dense_5 (Dense)              (None, 1)                 4         
_________________________________________________________________
activation_13 (Activation)   (None, 1)                 0         

Если вам сложно отслеживать все формы слоев, попробуйте добавить summary(cnn_bc_model) перед началом обучения модели, чтобы вы могли отладить любую проблему, связанную с формами. Надеюсь, это поможет

...