【问题标题】:ValueError: Error when checking target: expected flatten_1 to have shape (2048,) but got array with shape (2,)ValueError:检查目标时出错:预期 flatten_1 的形状为 (2048,) 但得到的数组的形状为 (2,)
【发布时间】:2019-10-10 03:04:59
【问题描述】:

我正在尝试运行此代码,但出现此错误:

ValueError: 检查目标时出错:预期 flatten_4 的形状为 (2048,) 但得到的数组的形状为 (2,)

NUM_CLASSES = 2
CHANNELS = 3
IMAGE_RESIZE = 224
RESNET50_POOLING_AVERAGE = 'avg'
DENSE_LAYER_ACTIVATION = 'softmax'
OBJECTIVE_FUNCTION = 'categorical_crossentropy'
NUM_EPOCHS = 10
EARLY_STOP_PATIENCE = 3
STEPS_PER_EPOCH_TRAINING = 10
STEPS_PER_EPOCH_VALIDATION = 10
BATCH_SIZE_TRAINING = 100
BATCH_SIZE_VALIDATION = 100
BATCH_SIZE_TESTING = 1
resnet_weights_path = '../input/resnet50/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'
model = Sequential()
train_data_dir = "C:\\Users\\Desktop\\RESNET"
model = ResNet50(include_top=True, weights='imagenet')
model.layers.pop() 
model = Model(input=model.input,output=model.layers[-1].output)
model.summary()
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9), metrics=  ['binary_accuracy'])
data_dir = "C:\\Users\\Desktop\\RESNET"
batch_size = 32
from keras.applications.resnet50 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
image_size = IMAGE_RESIZE
data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)
def append_ext(fn):
    return fn+".jpg"
from os import listdir
from os.path import isfile, join
dir_path = os.path.dirname(os.path.realpath(__file__))
train_dir_path = dir_path + '\data'
onlyfiles = [f for f in listdir(dir_path) if isfile(join(dir_path, f))]
data_labels = [0, 1]
t = []
maxi = 25145
LieOffset = 15799
i = 0
while i < maxi: # t = tuple
if i <= LieOffset:
    t.append(label['Lie'])
else:
    t.append(label['Truth'])
i = i+1
train_datagenerator = ImageDataGenerator(rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        validation_split=0.2) 
train_generator = train_datagenerator.flow_from_directory(
        train_data_dir,
        target_size=(image_size, image_size), 
        batch_size=BATCH_SIZE_TRAINING,
        class_mode='categorical', shuffle=False, subset='training')
validation_generator = train_datagenerator.flow_from_directory(
        train_data_dir, # same directory as training data kifkif
        target_size=(image_size, image_size), 
        batch_size=BATCH_SIZE_TRAINING,
        class_mode='categorical', shuffle=False, subset='validation') 
(BATCH_SIZE_TRAINING, len(train_generator), BATCH_SIZE_VALIDATION, len(validation_generator))
from tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpoint
cb_early_stopper = EarlyStopping(monitor = 'val_loss', patience = EARLY_STOP_PATIENCE)
cb_checkpointer = ModelCheckpoint(filepath = '../working/best.hdf5', monitor = 'val_loss',    save_best_only = True, mode = 'auto')
from sklearn.grid_search import ParameterGrid
param_grid = {'epochs': [5, 10, 15], 'steps_per_epoch' : [10, 20, 50]}
grid = ParameterGrid(param_grid)
val_loss as final model
for params in grid:
    print(params)
fit_history = model.fit_generator(
        train_generator,
        steps_per_epoch=STEPS_PER_EPOCH_TRAINING,
        epochs = NUM_EPOCHS,
        validation_data=validation_generator,
        validation_steps=STEPS_PER_EPOCH_VALIDATION,
        callbacks=[cb_checkpointer, cb_early_stopper])
model.load_weights("../working/best.hdf5")

【问题讨论】:

  • 请正确缩进您的代码。将其复制并粘贴到您的问题中,然后选择它并按 Ctrl+K 将其格式化为代码。

标签: python tensorflow machine-learning keras


【解决方案1】:

错误表明您的模型输出层应该有 2 个节点,而您有 2048 个节点,因为您使用 ResNet50 模型的avg_pool 层的输出作为模型输出。因此,您可以在 avg_pool 层之上添加一个具有 2 个节点的 Dense 层来解决问题。

model = ResNet50(include_top=True, weights='imagenet')
print(model.summary())
x = model.get_layer('avg_pool').output
predictions = Dense(2, activation='sigmoid')(x)
model = Model(input = model.input, output = predictions)
print(model.summary())

由于我不太确定您要解决什么类型的问题,所以我假设作为数据标签形状的多标签 (2) 分类是 (2,)。

但是,如果要解决二进制分类问题,则需要更改标签,使其为 1 或 0。因此,将 train_generatorvalidation_generator 中的 class_mode='categorical' 更改为 class_mode='binary'。在这种情况下,模型输出层应该有1 节点。

predictions = Dense(1, activation='sigmoid')(x)

【讨论】:

  • 感谢您的帮助。我正在做一个二进制分类,如果我添加: x = model.get_layer('avg_pool').output predictions = Dense(2, activation='sigmoid')(x) model = Model(input = model.input, output =预测)正如你所建议的那样它不起作用。我还是卡住了......再次感谢
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 2020-08-09
  • 2021-03-15
  • 2021-08-12
  • 2023-03-25
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
相关资源
最近更新 更多