检查目标时出错:预期 dense_3 有 2 个维度,但得到形状为 (5, 200, 200, 1) 的数组
Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (5, 200, 200, 1)
我刚刚开始使用 Python 3.7.7 学习 Tensorflow (2.1.0) 和 Keras (2.3.7)。
我有这个网络:
def vgg16(input_size = (224,224,3)):
inputs = Input(input_size, name='input')
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)
flatten = Flatten(name = 'flatten')(pool5)
dense1 = Dense(units = 4096,activation = "relu", name = 'dense_1')(flatten)
dense2 = Dense(units = 4096,activation = "relu", name = 'dense_2')(dense1)
dense3 = Dense(units = 2, activation = "softmax", name = 'dense_3')(dense2)
opt = Adam(lr=0.001)
model = Model(inputs = inputs, outputs = dense3, name ='vgg-16')
model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
return model
这是使用它的代码:
model = vgg16(input_size=(200, 200, 1))
for episode in range(num_episodes):
selected = np.random.permutation(no_of_samples)[:num_shot + num_query]
# Create our Support Set.
support_set = np.array(D[selected[:num_shot]])
# Create our Query Set.
query_set = np.array(D[selected[num_query:]])
X_train = support_set[:,0,:]
y_train = support_set[:,1,:]
X_valid = query_set[:,0,:]
y_valid = query_set[:,1,:]
results = model.fit(X_train, y_train, epochs=20, batch_size=5,
validation_data=(X_valid, y_valid))
X_train
、y_train
、X_valid
和 y_valid
有这样的形状:(5, 200, 200, 1)
.
但是我得到这个错误:
Error when checking target: expected dense_3 to have 2 dimensions, but
got array with shape (5, 200, 200, 1)
我不明白为什么。我更改了 fit
调用,删除了 batch_size
:
results = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))
但我得到同样的错误:
我该如何解决这个错误?
也许,问题是我正在使用 一个 频道图像。
模型摘要:
Model: "vgg-16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 200, 200, 1) 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 200, 200, 64) 640
_________________________________________________________________
conv1_2 (Conv2D) (None, 200, 200, 64) 36928
_________________________________________________________________
pool_1 (MaxPooling2D) (None, 100, 100, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 100, 100, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 100, 100, 128) 147584
_________________________________________________________________
pool_2 (MaxPooling2D) (None, 50, 50, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 50, 50, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
pool_3 (MaxPooling2D) (None, 25, 25, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 25, 25, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
pool_4 (MaxPooling2D) (None, 12, 12, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
pool_5 (MaxPooling2D) (None, 6, 6, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 18432) 0
_________________________________________________________________
dense_1 (Dense) (None, 4096) 75501568
_________________________________________________________________
dense_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dense_3 (Dense) (None, 2) 8194
=================================================================
Total params: 107,004,610
Trainable params: 107,004,610
Non-trainable params: 0
_________________________________________________________________
你的训练数据有5
、(200,200,1)
张图片,没错,但目标数据(y
)应该是5
个对应的标签,形状为(2,)
。所以y_train
的形状应该是(5,2)
。现在他们的形状不对。
X_train
, y_train
, X_valid
and y_valid
have a this shape: (5, 200, 200,1)
.
根据您网络的总结
>> vvg16().summary()
Model: "vgg-16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
conv1_2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
pool_1 (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
pool_2 (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
pool_3 (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
pool_4 (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
pool_5 (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
dense_1 (Dense) (None, 4096) 102764544
_________________________________________________________________
dense_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dense_3 (Dense) (None, 2) 8194
=================================================================
Total params: 134,268,738
Trainable params: 134,268,738
Non-trainable params: 0
_________________________________________________________________
您的 X_train
和 X_valid
需要具有 (224,224,3)
的形状
由于 keras.losses.categorical_crossentropy
,您的 y_train
和 y_valid
需要总计 2 classes
并且是单热编码
编辑:
当输出为N的数组时类:
- 最后一层应该是
Dense(N,"softmax")
- 损失应该是
keras.losses.sparse_categorical_crossentropy
当输出是one-hot编码时N 类:
- 如果还没有编码使用
keras.utils.to_categorical(array, N)
- 最后一层应该是
Dense(N,"softmax")
- 损失应该是
keras.losses.categorical_crossentropy
当目的不是分类时:
- 你的最后一层应该产生相同的形状
- 您需要使用正确的激活方式
- 你不需要使用展平
- 检查
autoencoder
概念以了解如何生成与输入具有相同形状的输出
我刚刚开始使用 Python 3.7.7 学习 Tensorflow (2.1.0) 和 Keras (2.3.7)。
我有这个网络:
def vgg16(input_size = (224,224,3)):
inputs = Input(input_size, name='input')
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)
flatten = Flatten(name = 'flatten')(pool5)
dense1 = Dense(units = 4096,activation = "relu", name = 'dense_1')(flatten)
dense2 = Dense(units = 4096,activation = "relu", name = 'dense_2')(dense1)
dense3 = Dense(units = 2, activation = "softmax", name = 'dense_3')(dense2)
opt = Adam(lr=0.001)
model = Model(inputs = inputs, outputs = dense3, name ='vgg-16')
model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
return model
这是使用它的代码:
model = vgg16(input_size=(200, 200, 1))
for episode in range(num_episodes):
selected = np.random.permutation(no_of_samples)[:num_shot + num_query]
# Create our Support Set.
support_set = np.array(D[selected[:num_shot]])
# Create our Query Set.
query_set = np.array(D[selected[num_query:]])
X_train = support_set[:,0,:]
y_train = support_set[:,1,:]
X_valid = query_set[:,0,:]
y_valid = query_set[:,1,:]
results = model.fit(X_train, y_train, epochs=20, batch_size=5,
validation_data=(X_valid, y_valid))
X_train
、y_train
、X_valid
和 y_valid
有这样的形状:(5, 200, 200, 1)
.
但是我得到这个错误:
Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (5, 200, 200, 1)
我不明白为什么。我更改了 fit
调用,删除了 batch_size
:
results = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))
但我得到同样的错误:
我该如何解决这个错误?
也许,问题是我正在使用 一个 频道图像。
模型摘要:
Model: "vgg-16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 200, 200, 1) 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 200, 200, 64) 640
_________________________________________________________________
conv1_2 (Conv2D) (None, 200, 200, 64) 36928
_________________________________________________________________
pool_1 (MaxPooling2D) (None, 100, 100, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 100, 100, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 100, 100, 128) 147584
_________________________________________________________________
pool_2 (MaxPooling2D) (None, 50, 50, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 50, 50, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
pool_3 (MaxPooling2D) (None, 25, 25, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 25, 25, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
pool_4 (MaxPooling2D) (None, 12, 12, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
pool_5 (MaxPooling2D) (None, 6, 6, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 18432) 0
_________________________________________________________________
dense_1 (Dense) (None, 4096) 75501568
_________________________________________________________________
dense_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dense_3 (Dense) (None, 2) 8194
=================================================================
Total params: 107,004,610
Trainable params: 107,004,610
Non-trainable params: 0
_________________________________________________________________
你的训练数据有5
、(200,200,1)
张图片,没错,但目标数据(y
)应该是5
个对应的标签,形状为(2,)
。所以y_train
的形状应该是(5,2)
。现在他们的形状不对。
X_train
,y_train
,X_valid
andy_valid
have a this shape:(5, 200, 200,1)
.
根据您网络的总结
>> vvg16().summary()
Model: "vgg-16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
conv1_2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
pool_1 (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
pool_2 (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
pool_3 (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
pool_4 (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
pool_5 (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
dense_1 (Dense) (None, 4096) 102764544
_________________________________________________________________
dense_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dense_3 (Dense) (None, 2) 8194
=================================================================
Total params: 134,268,738
Trainable params: 134,268,738
Non-trainable params: 0
_________________________________________________________________
您的 X_train
和 X_valid
需要具有 (224,224,3)
的形状
由于 keras.losses.categorical_crossentropy
y_train
和 y_valid
需要总计 2 classes
并且是单热编码
编辑:
当输出为N的数组时类:
- 最后一层应该是
Dense(N,"softmax")
- 损失应该是
keras.losses.sparse_categorical_crossentropy
当输出是one-hot编码时N 类:
- 如果还没有编码使用
keras.utils.to_categorical(array, N)
- 最后一层应该是
Dense(N,"softmax")
- 损失应该是
keras.losses.categorical_crossentropy
当目的不是分类时:
- 你的最后一层应该产生相同的形状
- 您需要使用正确的激活方式
- 你不需要使用展平
- 检查
autoencoder
概念以了解如何生成与输入具有相同形状的输出