当前位置: 首页 > 知识库问答 >
问题:

ValueError:检查目标时出错:预期dense_10有形状(1,),但得到了带有形状(19316,)的数组

壤驷涛
2023-03-14

我正在运行一个CNN,检查图像,但不分类。事实上,输出层是一个密集层,其参数为1d中标签中图像的大小。

如下面的代码所示,我使用model.fit_generator()而不是model.fit,当开始训练模型时,会出现以下错误:

ValueError: Error when checking target: expected dense_10 to have shape 
(1,) but got array with shape (19316,)

为什么这是一个错误?我的密度的输出是一个19316元素的数组,为什么它期望它有一个(1,)的形状?

此处还附上了模型的摘要:

conv2d_28(Conv2D)(无,26, 877, 32) 544

激活37(激活)(无,26877,32)0

最大池2D池28(最大池(无、13、438、32)0

conv2d_29(conv2d)(无、12437、16)2064

activation_38(激活)(无,12, 437, 16) 0

最大池2D池29(最大池(无、6218、16)0

conv2d_30(conv2d)(无、5217、8)520

激活39(激活)(无,5217,8)0

最大池2D池30(最大池(无、2、108、8)0

activation_40(激活)(无,2, 108, 8) 0

flatten_10(压平)(无,1728)0

辍学10(辍学)(无,1728)0

密级(密级)(无,19316)33397364

=================================================================

总参数:33400492可培训参数:33400492不可培训参数:0

有什么建议吗?

提前多谢!

def generator(data_arr, batch_size = 10):

num = len(data_arr) 

if num % batch_size != 0 : 
    num = int(num/batch_size)

# Loop forever so the generator never terminates
while True: 

for offset in range(0, num, batch_size):

    batch_samples = (data_arr[offset:offset+batch_size])

    samples = []
    labels = []

    for batch_sample in batch_samples:

        samples.append(batch_sample[0])
        labels.append((np.array(batch_sample[1].flatten)).transpose())

    X_ = np.array(samples)
    Y_ = np.array(labels)

    X_ = X_[:, :, :, newaxis]

    print(X_.shape)
    print(Y_.shape)

    yield (X_, Y_)

# compile and train the model using the generator function
train_generator = generator(training_data, batch_size = 10)
validation_generator = generator(val_data, batch_size = 10)

run_opts = tf.RunOptions(report_tensor_allocations_upon_oom = True)

model = Sequential()

model.add(Conv2D(32, (4, 4), strides=(2, 2), input_shape = (55, 1756, 
1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

model.add(Conv2D(16, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

model.add(Conv2D(8, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))

model.add(Activation('softmax'))
model.add(Flatten())  # this converts our 3D feature maps to 1D feature 
vectors
model.add(Dropout(0.3))
model.add(Dense(19316))

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

model.summary()

batch_size = 20
nb_epoch = 6

model.fit_generator(train_generator, 
                    steps_per_epoch = len(training_data) ,
                    epochs = nb_epoch,
                    validation_data = validation_generator,
                    validation_steps = len(val_data))

共有1个答案

郜卓君
2023-03-14

您当前使用的是sparse\u categorical\u crossentropyloss,它需要整数标签并在内部执行一个热编码,但您的标签已经是一个热编码。

因此,对于这种情况,您应该返回到分类交叉熵损失。

 类似资料: