keras 如何提高深度学习中的召回率?

jw5wzhpr  于 2022-11-30  发布在  其他
关注(0)|答案(2)|浏览(345)

我使用vgg 16作为特征提取方法,但是我的老师要求高召回率。(90%-95%)。我将解释我的数据集,我的数据是雾天交通标志的标记视频(它们被标记为可见、不可见生存能力差)我从视频中提取帧作为图像,并将数据随机存储在training & test/瓦尔文件夹中我正在尝试应用深度学习来对图像进行分类。正如你所看到的,我的模型做得很好,但不是很好。我不能从我的老师那里得到更多的视频。

  • 我怎么可能改进我的模型?
  • 我可以向我的模型添加更多层吗?
  • 我可以将基于特征提取模型提供给我创建的conv 2d模型吗?
  • 我可以将从vgg 16中提取的提要特征应用到迁移学习中吗?
  • 我如何将特征提取vgg 16输入svm?
BATCH = 50
    IMG_WIDTH = 224
    IMG_HEIGHT = 224
    
    from keras.applications import VGG16
    conv_base = VGG16(weights='imagenet',
    include_top=False,
    input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)) # This is the Size of the image
    
    conv_base.trainable= False
    
    
    datagen = ImageDataGenerator(rescale=1.0/255.0                  
                                      #  ,brightness_range=(1,1.5),
                                      #  zoom_range=0.1,
                                      #  rotation_range=45,
                                      #  horizontal_flip=True,
                                      #  vertical_flip=True,
    )
    
    train = datagen.flow_from_directory(train_path
                                                ,class_mode='categorical'
                                                ,batch_size = BATCH
                                                ,target_size=(IMG_HEIGHT, IMG_WIDTH))
    
    #test data val = datagen.flow_from_directory(val_path
                                              ,class_mode='categorical'
                                              ,batch_size = BATCH
                                              ,target_size=(IMG_HEIGHT, IMG_WIDTH))
    
    
    
    
    model = tf.keras.models.Sequential()
    #We now add the vggModel directly to our new model
    model.add(conv_base)
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(129, activation='relu'))
    model.add(tf.keras.layers.Dropout((0.5)))
    model.add(tf.keras.layers.Dense(5, activation='softmax'))
    
    
    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
                   ,loss='categorical_crossentropy'
                   , metrics=["accuracy",
                               tf.keras.metrics.Precision(),
                               tf.keras.metrics.Recall()]
                    )
    
    early_stopping = EarlyStopping(monitor='val_loss'
                                  ,patience=2
                                  )
    history_1 = model.fit(train
                           ,validation_data=val
                           ,epochs=10
                           ,steps_per_epoch=len(train)
                           ,validation_steps=len(val)
                           ,verbose=1
                           ,callbacks =[early_stopping]
                            )
    
    
    Training loss       : 0.5572120547294617
    Training accuracy   : 0.8088889122009277
    Training precision: 0.9959514141082764
    Training recall: 0.437333345413208
    Test loss       : 0.5427007079124451
    Test accuracy   : 0.8233333230018616
    Test precision: 1.0
    Test recall: 0.44333332777023315
os8fio9y

os8fio9y1#

识别率取决于许多变量,不仅是图像的噪声,当我们的识别率达到80%时,我们还使用了一些信息来进行识别。你谈到了交通标志和雾天图像,当你是当地人和外国人时,他们已经很好地识别了图像标志,你有一本驾驶指导手册。

  • 我怎么可能改进我的模型?

该模型没有指定,我使用一个小的简单模型与相机输入工作,我使用网格和多个输出作为一个序列,以帮助确定标签的输入作为对象1包含在{ P(对象|网格1)、P(对象|网格2)、P(对象|网格3)...}

  • 我可以向我的模型添加更多层吗?

这取决于你的应用实践,输入相机没有太多的信息相比,你可能会尝试级联模型或分辨率提取值的变化,VGG 16是一系列的卷积层和concat路径是你的应用程序在它上面。我只使用了几个密集层与卷积层,这是因为我的输入图像很小。

  • 我可以将基于特征提取模型提供给我创建的conv 2d模型吗?

答案相同,卷积层是提取函数,但您可以通过时间相关函数转换信息,这些函数不限于与声音或频率一起使用,例如MFCC特征提取,作为识别率、掩蔽符号或模型级联的扩展信息。

  • 我可以将从vgg 16中提取的提要特征应用到迁移学习中吗?

上面的答案也是一样的。

  • 我如何将特征提取vgg 16输入svm?

同样的答案VGG 16是卷积层,您可以使用级联模型或级联输入。
示例:工作模板,多情节动画是操作系统响应反馈之一,它不需要时间流逝。

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
def f1( picture ):
    return tf.constant( picture ).numpy()

def animate( i ):
    ret0, frame0 = video_capture_0.read()
    if (ret0):      
        
        frame0 = tf.image.resize(frame0, [29, 39]).numpy()
        
        temp = img_array = tf.keras.preprocessing.image.img_to_array(frame0[:,:,2:3])
        temp2 = img_array = tf.keras.preprocessing.image.img_to_array(frame0[:,:,1:2])
        temp3 = img_array = tf.keras.preprocessing.image.img_to_array(frame0[:,:,0:1])

        temp = tf.keras.layers.Concatenate(axis=2)([temp, temp2])
        temp = tf.keras.layers.Concatenate(axis=2)([temp, temp3])
        # 480, 640
        temp = tf.keras.preprocessing.image.array_to_img(
            temp,
            data_format=None,
            scale=True
        )
        temp = f1( temp )
        
        im.set_array( temp )
        result = predict_action( temp )
        print( result )
    return im,

def predict_action ( image ) :
    predictions = model.predict(tf.constant(image, shape=(1, 29, 39, 3) , dtype=tf.float32))
    result = tf.math.argmax(predictions[0])
    return result

输出:简单的摄像头和对象检测,我写了简单的代码与一个小模型(没有对象检测API),有更多的例子x1c 0d1x

j2datikz

j2datikz2#

你说

my data are labeled videos of traffic sign in a foggy weather (they are labeled as visible, not visible, poor viability)

从这里我假设你有3个类。2但是在你的模型中你有代码

model.add(tf.keras.layers.Dense(5, activation='softmax'))

which implies you have 5 classes?
In model.fit you have the code


,每个历元的步数=长度(训练),验证步数=长度(数值)

in your generators you set the batch size to 50. in which case you should have
steps_per_epoch =int(len(train/50) and validation_steps=int(len(val/50)

You are using the early stopping callback but you should add the parameter


restore_best_weights=True同时更改耐心=4

This way your model will be set to the weights for the epoch with the lowest validation loss. I also recommend you use the Keras callback ReduceLROnPlateau. Documentation is here. my recommended code for this callback is:


(监视器=“瓦尔_loss”,因子=0.4,耐心=2,详细=1)

In model.fit change callbacks to callbacks=[[early_stopping, rlronp]

Also run for more epochs

相关问题