我在R中的图像分类世界中潜水,我对用于分类图像的神经网络存在问题。主要的问题是我的神经网络的预测是非常无稽之谈,但让我们继续进行秩序。我的数据都是二进制的,所有依赖变量和独立变量。
我的项目正在以这种方式发展:
- 导入图片,并将其翻译成数字(使用
{EBImage}
)- 向神经网络提供这些数字(使用
{neuralnet}
)- 对新照片做一些预测(使用
醇>{neuralnet}
)
对于第一点,我将图像的所有路径放在.csv中,我在R中读取它们,我将它们转换了一下,并创建了一个很好的数据帧。
# source("http://bioconductor.org/biocLite.R")
# biocLite("EBImage")
library(EBImage)
library(neuralnet)
# dataset
data <- read.csv("... path/images.csv", sep = ",")
u <- as.vector(as.factor(data[,1])) # input the path as vector
To be clear, the dataset is something like:
images result type
path1 s circle
path2 n square
path3 n bolt
path4 s square
图像是用油漆完成的一些非常简单的图像,类似于:它们总共21个,而且大多数只是以下形状的旋转。 我的目标是找到正方形。
所以我用这种方式输入图像,即列表的第1点。
# import the data and transformation
for(i in 1:length(u)){
tau <- cbind(u, # bind by column
data.frame( # put in a data frame
t( # trasp into column
as.vector( # coerce as vector
getFrame( # take the first frame of the images (param. 1 last row)
(imageData # extract data from image
(resize # resize (parameters w, h)
(readImage(u[i]),w = 200, h= 50))),1))))) # read images
}
现在所有图像都具有相同的尺寸,并且每个像素在数据帧的列中变为值0 -1。
# useful result of the dataframe
data_0 <- data.frame(risultato = data$result,tau[,-1])
我已经读过,对于神经网络,二进制输出应该用作对比。
# Binarize the categorical output
data_0 <- cbind(data_0$risultato == 's',data_0)
data_0 <- cbind(data_0$risultato == 'n',data_0)
names(data_0)[1:2] <- c('n', 's')
data_0 <- data_0[,-3]
And here the training data (`data_1`) and the test data (`data_2`)
data_1 <- data_0[-12,]
data_2 <- data_0[12,]
str(data_1)
现在第2点:训练神经网络:
# first, let's dummyze the variables (to be sure)
set.seed(500)
n <- names(data_1) # columns' name
f <- as.formula(paste("~ ", paste(n, collapse = " + "))) # here the formula
# dummy
m <- model.matrix(
f,
data = data_1
)[,-1]
# now let's write the formula for the neural network
mm <- colnames(m[,3:ncol(m)])
class(mm) # check the class
form.in<- as.formula(paste("sTRUE + nTRUE ~ ", paste(mm, collapse = "+"))) # here the neural network formula
最后神经网络:
mod2<-neuralnet(form.in,data=m,hidden=20)
过了一段时间,让我们做点3,预测:
compute(mod2,data_2[,-(1:2)])
结果是
compute(mod2,data_2[,-(1:2)])$net.result
[,1] [,2]
12 0.5502895567 0.4499845316 But weirdly, the result is not correct, but the weird thing is that putting all the values of the training dataset:
> compute(mod2,data_1[,-(1:2)])$net.result
[,1] [,2]
1 0.5502895567 0.4499845316
2 0.5502895567 0.4499845316
3 0.5502895567 0.4499845316
4 0.5502895567 0.4499845316
5 0.5502895567 0.4499845316
6 0.5502895567 0.4499845316
7 0.5502895567 0.4499845316
8 0.5502895567 0.4499845316
9 0.5502895567 0.4499845316
10 0.5502895567 0.4499845316
11 0.5502895567 0.4499845316
13 0.5502895567 0.4499845316
14 0.5502895567 0.4499845316
15 0.5502895567 0.4499845316
16 0.5502895567 0.4499845316
17 0.5502895567 0.4499845316
18 0.5502895567 0.4499845316
19 0.5502895567 0.4499845316
20 0.5502895567 0.4499845316
21 0.5502895567 0.4499845316
结果都一样!
我无法想象哪个是问题所在。我没有放太多的照片,认为你可以实现相同的结果旋转上面的三个样本并放置&#34; s&#34;在圆圈上,&#34; n&#34;在适当的专栏中的其他人。我不知道如何分享所有的照片,如果你需要它们,请告诉我如何,我很乐意将它们交给你。谢谢你的时间。