我试图创建一个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 )
答案 0 :(得分:0)
在最后一个constructor() {
this.siteContent = new SiteContentStore(this).siteContent
}
@observable content = {
text: this.siteContent.property
}
层之前放置一个Flatten
层。因为您没有这样做,所以这就是为什么在为您提供类的层之前,张量不会减少为单一维度的张量。
在TensorFlow中,通常的模式是在输出该类的层之前使用Dense
。
我还删除了您放置的随机密集层中的Flatten
,BatchNormalization
层通常放置在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)