预训练CNN中特征提取的有效方法

2024-10-03 11:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有更有效的方法从数据集中提取特征,如下所示:

def extract_features(directory, sample_count):
    features = np.zeros(shape=(sample_count, 6, 6, 512))
    labels = np.zeros(shape=(sample_count, 6))

    generator = 
    ImageDataGenerator(rescale=1./255).flow_from_directory(directory, 
    target_size=(Image_Size, Image_Size), batch_size = batch_size, 
    class_mode='categorical')

    i = 0

    print('Entering for loop...');

    for inputs_batch, labels_batch in generator:
        features_batch = conv_base.predict(inputs_batch)
        features[i * 20 : (i + 1) * 20] = features_batch
        labels[i * 20 : (i + 1) * 20] = labels_batch
        i += 1
        print(i);

        if (i * 20) >= sample_count:
            break

    return features, labels

由于我的数据集太大,这个过程需要相当长的时间,我想知道是否有更好的方法来完成这个过程?在

提前感谢:)

完整代码:

^{pr2}$

iPython控制台输出

Layer (type)                 Output Shape              Param #   
=================================================================
input_19 (InputLayer)        (None, 200, 200, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 200, 200, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 200, 200, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 100, 100, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 100, 100, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 100, 100, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 50, 50, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 50, 50, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 50, 50, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 50, 50, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 25, 25, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 25, 25, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 25, 25, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 25, 25, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 12, 12, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 12, 12, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 12, 12, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 12, 12, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 6, 6, 512)         0         
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
_________________________________________________________________
Conv_Base Summary
Found 6000 images belonging to 6 classes.
Entering for loop...
1
2
3
4
5
6
7
8
9
10
11
12...

Tags: samplenonelabelscountbatchdirectoryfeaturespool
1条回答
网友
1楼 · 发布于 2024-10-03 11:22:27

我要说不,我认为没有比这更有效的方法了。计算必须发生,尤其是在CPU上计算速度很慢。您所能做的最好的方法是通过转换数据集、保存数组,然后在每次训练时加载它们来避免重新计算。

我也经历了同样的事情,直到我崩溃,买了一个GPU。。。从那以后,我的生活就没有那么紧张了。我强烈建议你投资,如果你买不起其他东西,即使是1050。你可能要想办法处理有限的GPU内存,但它会让事情变得更顺利。在

相关问题 更多 >