简体   繁体   English

弄清楚如何为自己的数据集在Keras的Conv2D层中定义input_shape

[英]Trouble figuring out how to define the input_shape in the Conv2D layer in Keras for my own dataset

TL,DR TL,DR

I get these errors when defining my input shape 定义输入形状时出现这些错误

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (4000, 20, 20)

or 要么

ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5

Long Explicit Version: 长显式版本:

I am using different Keras NN to try classification on my own dataset. 我正在使用不同的Keras NN尝试对自己的数据集进行分类。

So far I had succes with my ANN, but I am having trouble with my CNN. 到目前为止,我的ANN取得了成功,但是CNN遇到了麻烦。

DataSet 数据集

Complete Code 完整的代码

The dataset consists of matrices of specified size and filled with 0's which contain a submatrix of specified size and filled with 1's. 数据集由指定大小的矩阵组成,并填充有0,其中包含指定大小的子矩阵,并填充有1。 The submatrix is optional and the goal is to train the NN to predict whether a matrix contains the submatrix or whether it doesnt. 子矩阵是可选的,目标是训练NN以预测矩阵是否包含子矩阵。 To make it more difficult to detect, I am adding various types of noise to the matrices. 为了使检测更加困难,我将各种噪声添加到矩阵中。

Here is a picture of what an individual matrix loosk like, the black parts are 0's and the white part are 1's. 这是单个矩阵散乱的图片,黑色部分为0,白色部分为1。 There is a 1:1 correspondance between the pixels of the image and the entries in the matrix. 图像的像素与矩阵中的条目之间存在1:1的对应关系。

在此处输入图片说明

I save them in a text while, using numpy savetxt and loadtxt. 我同时使用numpy savetxt和loadtxt将它们保存为文本。 It then looks like this: 然后看起来像这样:

#________________Array__Info:__(4000, 20, 20)__________
#________________Entry__Number__1________
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1
0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1
0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1
0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
#________________Entry__Number__2________
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1
0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0
0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1
0 1 0 0 0 0. . . . . . (and so on)

Complete Dataset 完整的数据集

CNN code CNN代码

Github Github上

Code: (imports left out) 代码:(不包括进口商品)

# data

inputData = dsg.loadDataset("test_input.txt")
outputData = dsg.loadDataset("test_output.txt")
print("the size of the dataset is: ", inputData.shape, " of type: ", type(inputData))


# parameters

# CNN

cnn = Sequential()

cnn.add(Conv2D(32, (3, 3), input_shape = inputData.shape, activation = 'relu'))

cnn.add(MaxPooling2D(pool_size = (2, 2)))

cnn.add(Flatten())

cnn.add(Dense(units=64, activation='relu'))

cnn.add(Dense(units=1, activation='sigmoid'))

cnn.compile(optimizer = "adam", loss = 'binary_crossentropy', metrics = ['accuracy'])

cnn.summary()

cnn.fit(inputData,
        outputData,
        epochs=100,
        validation_split=0.2)

Problem: 问题:

I get this output error message 我收到此输出错误消息

Using TensorFlow backend.
the size of the dataset is:  (4000, 20, 20)  of type:  <class 'numpy.ndarray'>
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 3998, 18, 32)      5792      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 1999, 9, 32)       0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 575712)            0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                36845632  
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 65        
=================================================================
Total params: 36,851,489
Trainable params: 36,851,489
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):
  File "D:\GOOGLE DRIVE\School\sem-2-2018\BSP2\BiCS-BSP-2\CNN\matrixCNN.py", line 47, in <module>
    validation_split=0.2)
  File "C:\Code\Python\lib\site-packages\keras\models.py", line 963, in fit
    validation_steps=validation_steps)
  File "C:\Code\Python\lib\site-packages\keras\engine\training.py", line 1637, in fit
    batch_size=batch_size)
  File "C:\Code\Python\lib\site-packages\keras\engine\training.py", line 1483, in _standardize_user_data
    exception_prefix='input')
  File "C:\Code\Python\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (4000, 20, 20)

I really do not know how I can solve this. 我真的不知道该如何解决。 I looked into the documentation of Conv2D which says to to put it in such a form: (batch, height, width, channels). 我查看了Conv2D文档,文档说要以这样的形式放置:(批处理,高度,宽度,通道)。 In my case that is ( i think): 在我的情况下(我认为):

input_shape=(4000, 20, 20, 1)

,as I have4000 20*20 matrices with only 1's and 0's ,因为我只有4000个20 * 20矩阵,且只有1和0

But then I get this error message: 但是然后我收到此错误消息:

Using TensorFlow backend.
the size of the dataset is:  (4000, 20, 20)  of type:  <class 'numpy.ndarray'>
Traceback (most recent call last):
  File "D:\GOOGLE DRIVE\School\sem-2-2018\BSP2\BiCS-BSP-2\CNN\matrixCNN.py", line 30, in <module>
    cnn.add(Conv2D(32, (3, 3), input_shape = (4000, 12, 12, 1), activation = 'relu'))
  File "C:\Code\Python\lib\site-packages\keras\models.py", line 467, in add
    layer(x)
  File "C:\Code\Python\lib\site-packages\keras\engine\topology.py", line 573, in __call__
    self.assert_input_compatibility(inputs)
  File "C:\Code\Python\lib\site-packages\keras\engine\topology.py", line 472, in assert_input_compatibility
    str(K.ndim(x)))
ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5

In which exact shape should I pass the data into the CNN? 我应以哪种精确形状将数据传递到CNN?

All the files are available here Thank you for your time. 所有文件都在这里可用谢谢您的宝贵时间。

Your CNN expects a shape of (num_samples, 20, 20, 1) , while your data is in the format (num_samples, 20, 20) . 您的CNN期望形状为(num_samples, 20, 20, 1) ,而数据的格式为(num_samples, 20, 20)

Since you only have 1 channel you can just reshape the data to (4000, 20, 20, 1) 由于您只有1个通道,因此您可以将数据重塑为(4000, 20, 20, 1)

inputData = inputData.reshape(-1, 20, 20, 1)

If you want to do the reshaping inside of the model you can just add a Reshape layer. 如果要在模型内部进行重塑,只需添加一个Reshape图层即可。 As your first layer: 作为第一层:

model.add(Reshape(input_shape = (20, 20), target_shape=(20, 20, 1)))

Thanks to the help of Primusa and this other thread I found , I got it to work. 多亏了Primusa的帮助和我发现的另一个线程 ,我才开始工作。 Here is what I added: 这是我添加的内容:

inputData = inputData.reshape(4000, 20, 20, 1)
outputData = outputData.reshape(4000, 1)

with the conv2D layer being 与conv2D层是

cnn.add(Conv2D(32, (3, 3), input_shape = (20, 20, 1), activation = 'relu'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM