когда я использую свой 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