【问题标题】:Binary classification with additional dimension (subclasses)具有附加维度的二进制分类(子类)
【发布时间】:2020-03-12 12:59:43
【问题描述】:

假设我有一个包含 10 个观察值的数组(属于 A 类或 B 类)、5 列和 2 个子类(C、D)作为附加维度,我想做一个二元分类(到 A 类或 B 类)在 Keras R 中。在这种情况下,网络架构应该是什么样的?

library("keras")

df = data.frame(class = c(rep("A", 10), rep("B", 10)),
                subclass = rep(c("C", "D"), 10),
                feature1 = rnorm(20),
                feature2 = rnorm(20),
                feature3 = rnorm(20))

df1 = df[df$subclass == "C", ]
df2 = df[df$subclass == "D", ]
df_list = list(df1, df2)

build_model = function() {
  model = keras_model_sequential() 

  model %>%
    # input_shape is 3 features and 2 subclasses
    layer_dense(units = 2, activation = 'sigmoid', input_shape = c(3, 2))

  model %>%
    compile(
      optimizer = "adam",
      loss = "binary_crossentropy",
      metrics = list("accuracy")
    )
}

# one hot encoding to A, B classes
labels = to_categorical(as.integer(df_list[[1]][, "class"]) - 1)

# drop factor columns
data = lapply(df_list, function(x) x[, -(1:2)])

# convert to array
data_array = array(unlist(c(data[[1]], data[[2]])), dim = c(10, 3, 2))

model = build_model()

# error appears in the following function:
history = model %>% fit(
  x = data_array,
  y = labels
)

错误:

py_call_impl 中的错误(可调用,dots$args,dots$keywords):

ValueError: 一个形状为 (10, 2) 的目标数组被传递给一个输出 形状 (None, 3, 2),同时用作损失 binary_crossentropy。这 loss 期望目标具有与输出相同的形状。

该错误与输入和输出数据的维度之间的差异有关,但我不知道它应该是什么样子正确。我的样本数据维度是 10 个观察值、3 个特征和 2 个子类。

型号信息:

Model: "sequential"
____________________________________________________________________
Layer (type)                Output Shape               Param #    
====================================================================
dense (Dense)               (None, 3, 2)               6          
====================================================================
Total params: 6
Trainable params: 6
Non-trainable params: 0
____________________________________________________________________

【问题讨论】:

  • 到底是什么问题?
  • 代码中哪里出现了错误?请记住minimal reproducible example 指南中的最小部分——这是您自己调试的良好第一步,并且可以让其他人更轻松地帮助您
  • 我根据给定的指南更正了问题

标签: r tensorflow keras


【解决方案1】:

您的错误表明您的模型输出形状为 (None, 3, 2),但您给他的输出形状为 (10,2)(标签)。 要解决此问题,您应该修复输入形状: 您的输入 shpt 是 3,而不是 (3,2),因为您有 3 个功能并且您希望有 2 个输出。

改变这一行:

layer_dense(units = 2, activation = 'sigmoid', input_shape = c(3, 2))

到这里:

layer_dense(units = 2, activation = 'sigmoid', input_shape = c(3))

我用python测试了一下,好像效果不错:

import keras
model = keras.Sequential()
model.add(keras.layers.Dense(units = 2,activation="sigmoid",input_shape=(3,)))
model.summary()


Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_4 (Dense)              (None, 2)                 8         
=================================================================
Total params: 8
Trainable params: 8
Non-trainable params: 0
_________________________________________________________________

【讨论】:

  • 你的答案不正确,因为我的输入形状是 10 x 3 x 2,所以不起作用。
【解决方案2】:

在 sigmoid 层之前,神经网络架构中需要一个 flatten 层。然后代码就可以工作了。

model %>%
  # input_shape is 3 features and 2 subclasses
  layer_flatten(input_shape = c(3, 2)) %>%
  layer_dense(units = 2, activation = 'sigmoid')

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2019-07-14
    • 2018-07-28
    • 2016-06-01
    • 2022-01-23
    • 2020-09-13
    • 2019-11-26
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多