问题描述
我想将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
_________________________________________________________________