提取VGG16瓶颈特征时形状异常问题求助
Hey there, let's break down why your bottleneck features aren't matching the shape you expected and fix it step by step.
First, let's recap your setup
You're using VGG16 (without top layers) to extract bottleneck features from 9741 images across 15 classes, with a target size of (64,64) and hardcoding steps=19 in predict_generator. Here are the key issues to check:
1. Hardcoded steps parameter is likely causing incomplete features
When you use predict_generator, the steps argument tells the model how many batches to process. Your hardcoded value of 19 might not cover all your samples, leading to a smaller-than-expected first dimension in your features.
For example, if your batch_size is 512:
- 19 batches only process
19 * 512 = 9728images, leaving out 13 samples. This makes your feature array shape start with 9728 instead of 9741.
Fix it by calculating steps dynamically:
import numpy as np # Calculate exact steps needed to cover all samples total_samples = train_generator_bottleneck.samples steps = np.ceil(total_samples / train_generator_bottleneck.batch_size) # Generate features with the correct steps bottleneck_features_train = model_vgg.predict_generator(train_generator_bottleneck, steps=steps) # Verify the shape print(f"Bottleneck features shape: {bottleneck_features_train.shape}")
2. Target size mismatch with VGG16's default design
VGG16 was trained on (224,224) images, and its convolution/pooling layers are sized around that input. When you use (64,64) as your target size, the final feature map dimensions shrink more than you might expect:
- For (224,224) input: The final bottleneck feature shape is
(num_samples, 7, 7, 512)(since each pooling layer halves the spatial dimensions, 5 times) - For (64,64) input: The final shape becomes
(num_samples, 2, 2, 512)(64 → 32 → 16 → 8 → 4 → 2 after 5 pooling layers)
If you expected the classic (7,7,512) bottleneck shape, adjust your generator's target size to match VGG16's default:
train_generator_bottleneck = datagen.flow_from_directory( train_data_dir, target_size=(224, 224), # Use VGG16's native input size batch_size=batch_size, class_mode=None, shuffle=False)
3. Double-check your feature saving code
Make sure you're saving the full feature array without truncation. Your current save line is cut off, but ensure it looks like this to avoid issues:
np.save(open('bottleneck_features_train.npy', 'wb'), bottleneck_features_train)
Final Quick Checks
After making these changes, run the shape print statement. You should see:
- If using (224,224):
(9741, 7, 7, 512) - If sticking with (64,64):
(9741, 2, 2, 512)
Either shape is valid—just confirm it matches what you need for your downstream model!
内容的提问来源于stack exchange,提问作者MocTriPsy

