Несбалансированность набора данных мультикласса - PullRequest
0 голосов
/ 05 февраля 2020
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf

train_path = 'Skin/Train'
test_path = 'Skin/Test'

train_gen = ImageDataGenerator(rescale=1./255)
train_generator = train_gen.flow_from_directory(train_path,target_size= 
                                         (300,300),batch_size=30,class_mode='categorical')

model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 300x300 with 3 bytes color
# This is the first convolution
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(600, 450, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
# The second convolution
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The third convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The fourth convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The fifth convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
# 512 neuron hidden layer
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(9, activation='softmax')
])

from tensorflow.keras.optimizers import RMSprop

model.compile(loss='categorical_crossentropy',
          optimizer=RMSprop(lr=0.001),
          metrics=['acc'])

history = model.fit_generator(
  train_generator,
  steps_per_epoch=8,  
  epochs=15,
  verbose=2, class_weight = ? )

У меня проблема с достижением точности, я тренирую набор данных из 9 классов, в котором классы 1, 4 и 5 имеют только 100, 96, 90 изображений, в то время как остальные классы имеют более 500 изображений. Из-за этого я не могу достичь более высокой точности, так как вес перекошен в сторону изображений с большим числом. Я хочу, чтобы во время обучения все классы считались равными, т. Е. 500. Было бы полезно, если бы я мог увеличить выборку классов с помощью tenorflow или любого кода функции keras. вместо того, чтобы вручную повышать или понижать выборку изображений в папках.

1 Ответ

0 голосов
/ 05 февраля 2020

Вместо этого вы можете использовать class_weight аргумент в вашем методе подгонки. Для повышения дискретизации вам нужно много ручной работы, это неизбежно.

Предполагая, что у вас есть выход с формой (anything, 9), и вы знаете итоги каждого класса:

totals = np.array([500,100,500,500,96,90,.......])
totalMean = totals.mean()
weights = {i: totalMean / count for i, count in enumerate(totals)]

model.fit(....., class_weight = weights)
...