我在Kaggle上实现resnet-50
,我得到一个值错误。请帮帮我吧
train_dir='../input/project/data/train'
test_dir='../input/project/data/test'
train_datagen=ImageDataGenerator(rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
test_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
color_mode='grayscale',
target_size=(28,28),
class_mode='binary',
batch_size=32,
)
test_generator = test_datagen.flow_from_directory(
test_dir,
color_mode='grayscale',
target_size=(28,28),
class_mode='binary',
batch_size=32,
shuffle='False',
)
model = Sequential()
model.add(ResNet50(include_top=False, pooling='avg', weights=resnet_weights_path,input_tensor=Input(shape=(224,224,3))))
model.add(Flatten())
model.add(BatchNormalization())
model.add(Dense(2048, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1024, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(2, activation='sigmoid'))
model.layers[0].trainable = False
我正在训练一个二元分类器,我得到的误差低于
ValueError:不能赋值给变量conv3_block1_0_conv/kernel:0,因为变量shape(1,1,256, 512)和值shape(512, 128, 1,1)不兼容
看起来你在你的模型上使用预训练的权重。skip_mismatch=True
关键字需要在model.load_weights
函数中设置。返回模型变量后,请设置以下代码:
model.load_weights(weights, by_name=True, skip_mismatch=True)
其中weight为预训练的模型权重。它应该忽略你的模型和预训练的权重的任何不匹配。
在定义ResNet50
基本模型时,您已经给出了input_tensor=Input(shape=(224,224,3))
。但是你在train_generator
和test_generator
中给出了target_size=(28,28)
。ResNet50
接收到的训练图像形状(即target_size
)与其期望的训练图像形状(即input_tensor
)不同。更改target_size
以匹配input_tensor
中提到的形状。此外,ResNet50
期望color_mode
是rgb
而不是grayscale
。
这是因为您正在使用的权重(weights=resnet_weights_path)。你必须使用最新的训练模型。根据预训练的模型指南,图像大小可以是任意的
n_h, n_w, n_c =(256, 256, 3)
weights_path = '../input/d/aeryss/keras-pretrained- models/ResNet50_NoTop_ImageNet.h5'
ResNet50 = keras.applications.ResNet50(weights=weights_path ,include_top=False, input_shape=(n_h, n_w, n_c))