использование vgg16 для извлечения функций для обучения LSTM - PullRequest
0 голосов
/ 19 апреля 2020

когда я использую свой vgg16 для извлечения объектов из моих изображений, я получаю список функций с большим количеством нулей, например: (0., 0., 0., 0., 0., 0., 0. , 0., 0., 0., 0.08844849, 0.40013123, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.59819716, 0., 0., 0., 0.03238258, 0., 0., 0., 0.32838312, 0.42723358, 0.10626598, 0., 0.1936072, 0.71200961, 0.38265556, 0.06889667, 0.3056691, 0.35969719, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.9093371, 0.17480908, 0., 0., 0.07098073, 0.41668156, 0., 0., 0., 0., 0.93668669, 0., 0., 0., 1.08008015, 0., 0.24190509, 1.52572215)

, и эти нули происходят из отрицательных значений в изображения, потому что функция активации relu не может иметь дело с отрицательными значениями, и результат становится нулевым, как вы видите.

Я спрашиваю, нормально ли это, чтобы обучить мой LSTM с помощью функции, которую я извлекаю с помощью vgg16 с этими нулями в нем или обучение не будет хорошо? и если нехорошо иметь много нулей в моих функциях, что мне делать в качестве альтернативного решения?

this is my code : 

import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Convolution2D, MaxPooling2D, Flatten, Dense, Dropout, GlobalAveragePooling2D
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Sequential 
from tensorflow.keras.layers import Conv2D, MaxPooling2D,MaxPool2D  
from tensorflow.keras.layers import Dense, Dropout 
from tensorflow.keras.layers import Flatten, BatchNormalization
import os, shutil
from keras.preprocessing.image import ImageDataGenerator
import keras 

img_width, img_height = 224, 224 

conv_base = VGG16(weights='imagenet', 
                  include_top=False,
                  input_shape=(img_width, img_height, 3))

train_dir = "/content/drive/My Drive/small_data/data/train"
valid_dir = "/content/drive/My Drive/small_data/data/validation"

datagen = ImageDataGenerator(rescale=1./255)
batch_size = 1


#this is the  function to extract the features

def extract_features(directory, sample_count):
    features = np.zeros(shape=(sample_count, 7, 7, 512))  # Must be equal to the output of the convolutional base
    labels = np.zeros(shape=(sample_count,6))
    # Preprocess data
    generator = datagen.flow_from_directory(directory,
                                            target_size=(img_width,img_height),
                                            batch_size = batch_size,
                                            class_mode='binary')
    # Pass data through convolutional base
    i = 0
    for inputs_batch, labels_batch in generator:
        features_batch = conv_base .predict(inputs_batch)
        features[i * batch_size: (i + 1) * batch_size] = features_batch
        labels[i * batch_size: (i + 1) * batch_size] = labels_batch
        i += 1
        if i * batch_size >= sample_count:
            break
    return features, labels

# here i call the function 
train_features, train_labels = extract_features(train_dir, 43)
validation_features, validation_labels = extract_features(valid_dir, 28)

#  when i print train_features variable i get list of features containing 
 numbers and zeros like what i wrote
...