CNN 结构扩展错误Error:Negative size based on减2 from 1 for '{{node max_pooling2d_2

问题描述

我想将CNN结构扩展到C-C-P-C-C-P-C-C-P结构。但是,我收到以下错误:我无法执行任何操作,因为它不起作用,我该如何解决此问题?任何帮助将不胜感激。

我的代码有问题吗?有没有其他办法?如何解决

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dense,Dropout
from tensorflow.keras.optimizers import Adam

# CIFAR-10 데이터셋을 읽고 신경망에 입력할 형태로 변환
(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train=x_train.astype(np.float32)/255.0
x_test=x_test.astype(np.float32)/255.0
y_train=tf.keras.utils.to_categorical(y_train,10)
y_test=tf.keras.utils.to_categorical(y_test,10)

# 신경망 모델 설계
cnn=Sequential()
cnn.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
cnn.add(Conv2D(32,activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Dropout(0.25))
cnn.add(Conv2D(64,activation='relu'))
cnn.add(Conv2D(64,2)))
cnn.add(Flatten())
cnn.add(Dense(512,activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(10,activation='softmax'))

# 신경망 모델 학습
cnn.compile(loss='categorical_crossentropy',optimizer=Adam(),metrics=['accuracy'])
hist=cnn.fit(x_train,y_train,batch_size=128,epochs=30,validation_data=(x_test,y_test),verbose=2)

# 신경망 모델 정확률 평가
res=cnn.evaluate(x_test,y_test,verbose=0)
print("정확률은",res[1]*100)

import matplotlib.pyplot as plt

# 정확률 그래프
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train','Validation'],loc='best')
plt.grid()
plt.show()

# 손실 함수 그래프
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train',loc='best')
plt.grid()
plt.show()

# Train data의 20%를 validation set으로 설정
# 성능 평가는 test data만 이용
split_percent = 0.2
split_index = int(x_train.shape[0]*(1-split_percent))
x_t = x_train[:split_index]  #x_train
y_t = y_train[:split_index]  #y_train
x_v = x_train[split_index:]  #x_val
y_v = y_train[split_index:]  #y_val

错误

Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 17s 0us/step
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph,node_def,inputs,control_inputs,op_def)
   1879   try:
-> 1880     c_op = pywrap_tf_session.TF_FinishOperation(op_desc)
   1881   except errors.InvalidArgumentError as e:

InvalidArgumentError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_2/MaxPool}} = MaxPool[T=DT_FLOAT,data_format="NHWC",explicit_paddings=[],ksize=[1,2,1],padding="VALID",strides=[1,1]](Placeholder)' with input shapes: [?,1,64].

During handling of the above exception,another exception occurred:

ValueError                                Traceback (most recent call last)
15 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph,op_def)
   1881   except errors.InvalidArgumentError as e:
   1882     # Convert to ValueError for backwards compatibility.
-> 1883     raise ValueError(str(e))
   1884 
   1885   return c_op

ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_2/MaxPool}} = MaxPool[T=DT_FLOAT,64].

这是我添加代码

# C-C-P-C-C-P
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,2)))
cnn.add(Flatten())
cnn.add(Dropout(0.25))
cnn.add(Dense(10,loc='best')
plt.grid()
plt.show()

# Train data의 20%를 validation set으로 설정
# 성능 평가는 test data만 이용
split_percent = 0.2
split_index = int(x_train.shape[0]*(1-split_percent))
x_t = x_train[:split_index]  #x_train
y_t = y_train[:split_index]  #y_train
x_v = x_train[split_index:]  #x_val
y_v = y_train[split_index:]  #y_val




# C-C-P-C-C-P-C-C-P 구조
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,activation='relu'))
cnn.add(MaxPooling2D(pool_size=(1,1)))
cnn.add(Flatten())
cnn.add(Dense(512,loc='best')
plt.grid()
plt.show()

# Train data의 20%를 validation set으로 설정
# 성능 평가는 test data만 이용
split_percent = 0.2
split_index = int(x_train.shape[0]*(1-split_percent))
x_t = x_train[:split_index]  #x_train
y_t = y_train[:split_index]  #y_train
x_v = x_train[split_index:]  #x_val
y_v = y_train[split_index:]  #y_val

解决方法

输入形状是 (32,32,3) 并且您有多个卷积和池化层。在每一层,输入的大小都会缩小。因此,您应该注意通过层进行输入的过程。例如,每个池化层 (2,2) 使输入的大小减半。

在您的情况下,在 C-C-P-C-C-P 之后输入的大小将是 (None,5,64) 并将具有 (5,5) 大小的输入提供给另外两个卷积,然后最大池化使其大小减小to (1,1) 和 maxpooling 不能对大小为 (1,1) 的输入采取任何行动。因此,请重新组织您的图层并注意您的输入大小及其变化。

例如,您可以删除最后的 C-C-P 层以避免使输入变得更小。

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dense,Dropout
from tensorflow.keras.optimizers import Adam

# CIFAR-10 데이터셋을 읽고 신경망에 입력할 형태로 변환
(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train=x_train.astype(np.float32)/255.0
x_test=x_test.astype(np.float32)/255.0
y_train=tf.keras.utils.to_categorical(y_train,10)
y_test=tf.keras.utils.to_categorical(y_test,10)

# 신경망 모델 설계
cnn=Sequential()
cnn.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,3)))
cnn.add(Conv2D(32,activation='relu'))
cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Dropout(0.25))
cnn.add(Conv2D(64,activation='relu'))
cnn.add(Conv2D(64,2)))
cnn.add(Dropout(0.25))
#cnn.add(Conv2D(64,activation='relu'))
#cnn.add(Conv2D(64,activation='relu'))
#cnn.add(MaxPooling2D(pool_size=(2,2)))
cnn.add(Flatten())
cnn.add(Dense(512,activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(10,activation='softmax'))

您可以通过model.summary()检查尺寸变化:

model.summary()

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None,30,32)        896       
_________________________________________________________________
conv2d_7 (Conv2D)            (None,28,32)        9248      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None,14,32)        0         
_________________________________________________________________
dropout_2 (Dropout)          (None,32)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None,12,64)        18496     
_________________________________________________________________
conv2d_9 (Conv2D)            (None,10,64)        36928     
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None,64)          0         
_________________________________________________________________
dropout_3 (Dropout)          (None,64)          0         
_________________________________________________________________
flatten (Flatten)            (None,1600)              0         
_________________________________________________________________
dense (Dense)                (None,512)               819712    
_________________________________________________________________
dropout_4 (Dropout)          (None,512)               0         
_________________________________________________________________
dense_1 (Dense)              (None,10)                5130      
=================================================================
Total params: 890,410
Trainable params: 890,410
Non-trainable params: 0
_________________________________________________________________