不兼容的形状:[128,1]与[128,3,3]

时间:2020-07-27 05:14:40

标签: python image tensorflow deep-learning cnn

我试图创建一个CNN来对SVHN数据集进行分类,但是在创建模型时遇到了不兼容的形状错误:不兼容的形状:[128,3,3,10]与[128,1]。我该如何解决?

         model = Sequential([
                          Conv2D(filters=8, kernel_size=(3, 3), 
                           activation='relu', input_shape=(32, 32,3 
                           name='conv_1'),
                            
                           Conv2D(filters=8, kernel_size=(3, 3), 
                          activation='relu', padding= 'SAME',  
                                   `name='conv_2'),
                           MaxPooling2D(pool_size=(8, 8), name='pool_1'),
                            Dense(64,  kernel_regularizer = 
                            regularizers.l2(0.5),bias_initializer='ones',
                            activation='relu' , name='dense_1'),
                            Dropout(0.3),  
                            Dense(64,kernel_regularizer = 
                            regularizers.l2(0.5) , activation='relu' 
                           ,name='dense_2'),
                            BatchNormalization(),  
                            Dense(64,  kernel_regularizer = 
                            regularizers.l2(0.5) ,  activation='relu' 
                             ,name='dense_3'),
                             Dense(10,  activation='softmax' 
                             ,name='dense_4')
             ])


           model.compile(
           optimizer = 'adam',
           loss = 'sparse_categorical_crossentropy',
           metrics= ['accuracy' ])
   

           history = model.fit(train_images,train_labels , epochs = 30 
           ,validation_split = 0.15,
                batch_size= 128, verbose = False )

2 个答案:

答案 0 :(得分:0)

在最后一个constructor() { this.siteContent = new SiteContentStore(this).siteContent } @observable content = { text: this.siteContent.property } 层之前放置一个Flatten层。因为您没有这样做,所以这就是为什么在为您提供类的层之前,张量不会减少为单一维度的张量。

在TensorFlow中,通常的模式是在输出该类的层之前使用Dense

我还删除了您放置的随机密集层中的FlattenBatchNormalization层通常放置在Conv层之后,您可以将它们放置在BatchNormalization层之后,虽然。如果您是BatchNormalization,请确保整个网络或相关网络都具有它。不要只放置一个随机的Dense层。

这是更改代码的方式。

BatchNormalization

答案 1 :(得分:0)

我认为您的代码中有两个问题。

首先,请检查train_labels的形状。 如果张量的形状不正确,将出现Incompatible shapes错误。我认为[128, 1]的形状意味着train_label不是一种单向矢量。如果train_label形状为[1,3,8,..],则应将形状更改为[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], ...]

第二,您应该如上所述在Flatten层之前添加Dense层。

 model = Sequential([
       Conv2D(filters=8, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3), name='conv_1'),
       ...
       MaxPooling2D(pool_size=(8, 8), name='pool_1'),
       
       Flatten(),

       Dense(64,  kernel_regularizer ...
             ])

(32, 32, 1)的形状表示输入形状的最后一个暗度应为1。因此您应该将Conv2D的input_shape更改为(32, 32, 1)

Conv2D(filters=8, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 1) ...

此外,train_images也应更改为(32, 32, 1),因为图像的通道是一个。

train_images = tf.expand_dims(train_images, -1)

此外,您还可以像这样获得train_labels的一个热向量:

train_labels = tf.squeeze(train_labels)
train_labels = tf.one_hot(train_labels, depth=10)