【问题标题】:Getting error to fit a Conv1d to classify diabetic patients using the Pima Indian diabetes data set using keras in R使用 R 中的 keras 使用 Pima Indian 糖尿病数据集来拟合 Conv1d 以对糖尿病患者进行分类
【发布时间】:2019-11-11 02:37:55
【问题描述】:

我是机器学习领域的新手。我在 R 中使用 keras 包对糖尿病个体进行分类,使用 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.

【问题讨论】:

    标签: python r machine-learning deep-learning


    【解决方案1】:

    问题在于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) 不匹配。为了解决这个问题,您可以在max_pooling_1dlayer 和dropoutlayer 之间为您的模型添加一个layer_flatten 层。

    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         
    

    或者您可以在最后一个dense 层之后添加layer_flatten,然后再添加一个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),以便调试任何与形状相关的问题。希望对你有帮助

    【讨论】:

      【解决方案2】:

      我按照您的建议尝试了两种方法,但仍然出现错误。我使用了以下代码。

      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:无法使用形状为 [8] 的张量更新形状为 [] 的变量,形状必须相等。 [[{{node metrics_22/acc/AssignAddVariableOp}}]]

      【讨论】:

      • 您好,问题已解决。非常感谢你的帮助。实际上,在重塑数据的维度之前,我们需要应用一种热编码(虽然我不确定为什么我们需要这样编码,因为标签已经有 2 个类别 0 和 1)。幸运的是,它现在正在工作。而且我也可以运行其他网络。 # one-hot encoding如下: y_train_lab
      猜你喜欢
      • 2017-06-14
      • 2015-07-26
      • 2019-02-15
      • 2020-12-06
      • 1970-01-01
      • 2013-11-03
      • 2016-06-24
      • 2019-01-27
      • 2018-03-12
      相关资源
      最近更新 更多