如何使 input_shape 参数适应 R 中的表格尺寸

Posted

技术标签:

【中文标题】如何使 input_shape 参数适应 R 中的表格尺寸【英文标题】:How to adapt input_shape parameter to table dimensions in R 【发布时间】:2021-10-14 19:02:18 【问题描述】:

到目前为止,我的网络是这样的:

data <- data2018

# Splitting data into train and test
set.seed(101)
sample <- sample.int(n = nrow(data), size = floor(.75 * nrow(data)), replace = F)
train <- as.data.table(data[sample, ])
test <- as.data.table(data[-sample, ])

# Preparing the training set
cols <- c(names(train))
train %<>% mutate_at(cols, as.factor)
train %<>% mutate_at(cols, as.numeric)
train %<>% mutate_at(cols,~(scale(.) %>% as.vector))
train[is.na(train) ] <- 0

# Splitting train into x (parameters) and y (prediction values)
x_train <- data.matrix(train[,-"1"])
y_train <- data.matrix(train[, "1"])

# Designing model
model <- keras_model_sequential() %>%
layer_dense(units = 128, activation = 'tanh', input_shape = dim(x_train)[-1]) %>%
layer_dropout(rate = 0.4) %>%
layer_dense(units = 64, activation = 'tanh') %>%
layer_dropout(rate = 0.3) %>%
layer_dense(units = 32, activation = 'tanh') %>%
layer_dropout(rate = 0.2) %>%
layer_dense(units = 16, activation = 'tanh') %>%
layer_dropout(rate = 0.1) %>%
layer_dense(units = length(unique(data$`1`)), activation = 'softmax')

# Summarize model layers and units
summary(model)

# Compile model
model %>% compile(
loss = 'categorical_crossentropy',
optimizer = optimizer_rmsprop(),
metrics = c('accuracy')
)

# Train model
history <- model %>% fit(
x_train, y_train,
epochs = 100, batch_size = 32,
validation_split = 0.2
)

由于保密问题,我无法显示原始数据表,但它是一个由 7 行和 34 列组成的简单表(只是一个小的模拟块)。

输入 (x_train) 已经标准化和矢量化。这是一个包含行和列的简单表格。

dim(x_train)

结果:

> dim(x_train)
[1]  5 33

但是,如果我尝试训练模型,keras 会打印出这条神秘的错误消息。

Error in py_call_impl(callable, dots$args, dots$keywords) : 
ValueError: in user code:

/home/seschlbeck/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-   packages/tensorflow/python/keras/engine/training.py:855 train_function  *
    return step_function(self, iterator)
/home/seschlbeck/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py:845 step_function  **
    outputs = model.distribute_strategy.run(run_step, args=(data,))
/home/seschlbeck/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:1285 run
    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/home/seschlbeck/.local/share/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages/tensorflow/python/distribute/distribute_lib.py:2833 call_for_each_replica
    return self._call_for_each_replica(fn, args, kwargs)
/home/seschlbeck/.local/share/r-miniconda/envs/r-reticulate/lib/python3

我猜这与我的输入形状有关。但我就是想不通为什么... 我已经尝试了以下几种(都不起作用)

dim(x_train)
c(5, 33)
c(None, 5, 33)
dim(x_train)[1]

有人知道我在这里做错了什么吗?任何帮助表示赞赏...

【问题讨论】:

所以你无法显示原始数据。您是否考虑过向那些想在发布之前尝试其假定答案的人提供玩具数据? 我刚刚添加了原始表格和 x_train(矢量化)的图片。 【参考方案1】:

input_shape 应该没问题。当“输出”层中的单元数指定错误时,会出现这种错误消息。您的训练样本中可能只有两个类别,即二进制分类,但您的代码适用于 n-class 案例,您需要 n 单位和分类交叉熵损失。尝试在最后一个密集层中设置一个单个单元:

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

【讨论】:

感谢您的回复。不幸的是,我需要尽可能多的输出神经元,因为我在该列中有不同的值。该列中的每个代码都代表一种特定的疾病,我想给出一个介于 0 和 1 之间的百分比,说明该疾病对该人的可能性有多大... 我明白了。不过,认为这与类别的数量有关:据我了解,您的训练数据有 5 行,其中 2 行用于验证,如果您有两个以上的类别,这听起来很麻烦。为了获得更好的帮助,我们需要一些允许重现错误的模拟数据。 不幸的是,我还没有弄明白,但是你的赏金也让我把注意力转向了输出层......

以上是关于如何使 input_shape 参数适应 R 中的表格尺寸的主要内容,如果未能解决你的问题,请参考以下文章

如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?

如何根据自适应布局和情节提要使 uitableviewcell 中的 uilabel 相对于设备进行包装

如何使 HTML 表格中的一列缩小以适应?

“input_shape”的格式是keras.Sequential()?

如何使div中的图片自适应宽度和高度,图片不变形,可以超出div,超出部分隐藏

如何使div中的图片自适应宽度和高度,图片不变形,可以超出div,超出部分隐藏