Как инициализировать выборочные веса для мультиклассовой сегментации? - PullRequest
1 голос
/ 11 апреля 2020

Я работаю над мультиклассовой сегментацией с использованием Keras и U- net.

У меня есть выходные данные моих классов NN 12, использующих функцию soft max Activation. форма моего вывода (N, 288,288,12).

, чтобы соответствовать моей модели. Я использую sparse_categorical_crossentropy.

Я хочу инициализировать веса моей модели для моего несбалансированного набора данных.

Я нашел эту полезную ссылку и попробую ее реализовать; так как class_weight в Керасе не работает более чем для 2 классов, я использовал веса выборки

Мой код:

inputs = tf.keras.layers.Input((IMG_WIDHT, IMG_HEIGHT, IMG_CHANNELS))                                                                
smooth = 1.                                                                                                                          

s = tf.keras.layers.Lambda(lambda x: x / 255)(inputs)                                                                                
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    s)  # Kernelsize : start with some weights initial value                                                                         
c1 = tf.keras.layers.Dropout(0.1)(c1)                                                                                                
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    c1)  # Kernelsize : start with some weights initial value                                                                        
p1 = tf.keras.layers.MaxPool2D((2, 2))(c1)                                                                                           

c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    p1)  # Kernelsize : start with some weights initial value                                                                        
c2 = tf.keras.layers.Dropout(0.1)(c2)                                                                                                
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    c2)  # Kernelsize : start with some weights initial value                                                                        
p2 = tf.keras.layers.MaxPool2D((2, 2))(c2)                                                                                           

c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    p2)  # Kernelsize : start with some weights initial value                                                                        
c3 = tf.keras.layers.Dropout(0.1)(c3)                                                                                                
c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                          
    c3)  # Kernelsize : start with some weights initial value                                                                        
p3 = tf.keras.layers.MaxPool2D((2, 2))(c3)                                                                                           

c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                         
    p3)  # Kernelsize : start with some weights initial value                                                                        
c4 = tf.keras.layers.Dropout(0.1)(c4)                                                                                                
c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                         
    c4)  # Kernelsize : start with some weights initial value                                                                        
p4 = tf.keras.layers.MaxPool2D((2, 2))(c4)                                                                                           

c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                         
    p4)  # Kernelsize : start with some weights initial value                                                                        
c5 = tf.keras.layers.Dropout(0.1)(c5)                                                                                                
c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(                         
    c5)  # Kernelsize : start wi                                                                                                     

u6 = tf.keras.layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)                                                
u6 = tf.keras.layers.concatenate([u6, c4])                                                                                           
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(u6)                      
c6 = tf.keras.layers.Dropout(0.2)(c6)                                                                                                
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c6)                      

u7 = tf.keras.layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)                                                 
u7 = tf.keras.layers.concatenate([u7, c3])                                                                                           
c7 = tf.keras.layers.Conv2D(64, (2, 2), activation='relu', kernel_initializer='he_normal', padding='same')(u7)                       
c7 = tf.keras.layers.Dropout(0.2)(c7)                                                                                                
c7 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c7)                       

u8 = tf.keras.layers.Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)                                                 
u8 = tf.keras.layers.concatenate([u8, c2])                                                                                           
c8 = tf.keras.layers.Conv2D(32, (2, 2), activation='relu', kernel_initializer='he_normal', padding='same')(u8)                       
c8 = tf.keras.layers.Dropout(0.1)(c8)                                                                                                
c8 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c8)                       

u9 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)                                                 
u9 = tf.keras.layers.concatenate([u9, c1], axis=3)                                                                                   
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(u9)                       
c9 = tf.keras.layers.Dropout(0.1)(c9)                                                                                                
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c9)                       
outputs = tf.keras.layers.Conv2D(12, (1, 1), activation='softmax')(c9)                                                               
outputs = tf.keras.layers.Flatten(data_format=None)     (outputs)                                                                    
model = tf.keras.Model(inputs=[inputs], outputs=[outputs])                                                                           
cc = tf.keras.optimizers.Adam(learning_rate=0.0001, beta_1=0.9, beta_2=0.999, amsgrad=False)                                         
model.compile(optimizer=cc, loss='sparse_categorical_crossentropy',                                         
              metrics=['sparse_categorical_accuracy'],sample_weight_mode="temporal")  # metrics =[dice_coeff] model.summary()        
model.summary()                                                                                                                      
checkpointer = tf.keras.callbacks.ModelCheckpoint('chek12class3.h5', verbose = 1, save_best_only = True)                             
#                                                                                                                                    
print('############## Initial weights ############## : ', model.get_weights())                                                       
#callbacks = [                                                                                                                       
  # tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'), tf.keras.callbacks.TensorBoard(log_dir='logs')]                
#history = model.fit(train_generator, validation_split=0.1, batch_size=4,epochs = 100 ,callbacks = callbacks) #,callbacks = callbacks

class_weights = np.zeros((82944, 12))                                                                                                
class_weights[:, 0] += 7                                                                                                             
class_weights[:, 1] += 10                                                                                                            
class_weights[:, 2] += 2                                                                                                             
class_weights[:, 3] += 3                                                                                                             
class_weights[:, 4] += 4                                                                                                             
class_weights[:, 5] += 5                                                                                                             
class_weights[:, 6] += 6                                                                                                             
class_weights[:, 7] += 50                                                                                                            
class_weights[:, 8] += 8                                                                                                             
class_weights[:, 9] += 9                                                                                                             
class_weights[:, 10] += 50                                                                                                           
class_weights[:, 11] += 11                                                                                                           

history = model.fit(X_train, Y_train, validation_split=0.18, batch_size=1,epochs = 60 ,sample_weight=class_weights) #class_weight=clas

82944 составляет 288 * 288 ч и w моей выборки и 12 число классов.

Я получаю эту ошибку:

ValueError: Found a sample_weight array with shape (82944, 12) for an input with shape (481, 288, 288). sample_weight cannot be broadcast.

по этой ссылке здесь sample_weight должен работать как (nbr_of_training_data, shape_of_training_data)

Затем я добавил Выровняйте слой перед выводом и он не станет работать

Архитектура моей модели:

Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 288, 288, 3) 0                                            
__________________________________________________________________________________________________
lambda (Lambda)                 (None, 288, 288, 3)  0           input_1[0][0]                    
__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 288, 288, 16) 448         lambda[0][0]                     
__________________________________________________________________________________________________
dropout (Dropout)               (None, 288, 288, 16) 0           conv2d[0][0]                     
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 288, 288, 16) 2320        dropout[0][0]                    
__________________________________________________________________________________________________
max_pooling2d (MaxPooling2D)    (None, 144, 144, 16) 0           conv2d_1[0][0]                   
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 144, 144, 32) 4640        max_pooling2d[0][0]              
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 144, 144, 32) 0           conv2d_2[0][0]                   
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 144, 144, 32) 9248        dropout_1[0][0]                  
__________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)  (None, 72, 72, 32)   0           conv2d_3[0][0]                   
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 72, 72, 64)   18496       max_pooling2d_1[0][0]            
__________________________________________________________________________________________________
dropout_2 (Dropout)             (None, 72, 72, 64)   0           conv2d_4[0][0]                   
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 72, 72, 64)   36928       dropout_2[0][0]                  
__________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)  (None, 36, 36, 64)   0           conv2d_5[0][0]                   
__________________________________________________________________________________________________
conv2d_6 (Conv2D)               (None, 36, 36, 128)  73856       max_pooling2d_2[0][0]            
__________________________________________________________________________________________________
dropout_3 (Dropout)             (None, 36, 36, 128)  0           conv2d_6[0][0]                   
__________________________________________________________________________________________________
conv2d_7 (Conv2D)               (None, 36, 36, 128)  147584      dropout_3[0][0]                  
__________________________________________________________________________________________________
max_pooling2d_3 (MaxPooling2D)  (None, 18, 18, 128)  0           conv2d_7[0][0]                   
__________________________________________________________________________________________________
conv2d_8 (Conv2D)               (None, 18, 18, 256)  295168      max_pooling2d_3[0][0]            
__________________________________________________________________________________________________
dropout_4 (Dropout)             (None, 18, 18, 256)  0           conv2d_8[0][0]                   
__________________________________________________________________________________________________
conv2d_9 (Conv2D)               (None, 18, 18, 256)  590080      dropout_4[0][0]                  
__________________________________________________________________________________________________
conv2d_transpose (Conv2DTranspo (None, 36, 36, 128)  131200      conv2d_9[0][0]                   
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 36, 36, 256)  0           conv2d_transpose[0][0]           
                                                                 conv2d_7[0][0]                   
__________________________________________________________________________________________________
conv2d_10 (Conv2D)              (None, 36, 36, 128)  295040      concatenate[0][0]                
__________________________________________________________________________________________________
dropout_5 (Dropout)             (None, 36, 36, 128)  0           conv2d_10[0][0]                  
__________________________________________________________________________________________________
conv2d_11 (Conv2D)              (None, 36, 36, 128)  147584      dropout_5[0][0]                  
__________________________________________________________________________________________________
conv2d_transpose_1 (Conv2DTrans (None, 72, 72, 64)   32832       conv2d_11[0][0]                  
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 72, 72, 128)  0           conv2d_transpose_1[0][0]         
                                                                 conv2d_5[0][0]                   
__________________________________________________________________________________________________
conv2d_12 (Conv2D)              (None, 72, 72, 64)   32832       concatenate_1[0][0]              
__________________________________________________________________________________________________
dropout_6 (Dropout)             (None, 72, 72, 64)   0           conv2d_12[0][0]                  
__________________________________________________________________________________________________
conv2d_13 (Conv2D)              (None, 72, 72, 64)   36928       dropout_6[0][0]                  
__________________________________________________________________________________________________
conv2d_transpose_2 (Conv2DTrans (None, 144, 144, 32) 8224        conv2d_13[0][0]                  
__________________________________________________________________________________________________
concatenate_2 (Concatenate)     (None, 144, 144, 64) 0           conv2d_transpose_2[0][0]         
                                                                 conv2d_3[0][0]                   
__________________________________________________________________________________________________
conv2d_14 (Conv2D)              (None, 144, 144, 32) 8224        concatenate_2[0][0]              
__________________________________________________________________________________________________
dropout_7 (Dropout)             (None, 144, 144, 32) 0           conv2d_14[0][0]                  
__________________________________________________________________________________________________
conv2d_15 (Conv2D)              (None, 144, 144, 32) 9248        dropout_7[0][0]                  
__________________________________________________________________________________________________
conv2d_transpose_3 (Conv2DTrans (None, 288, 288, 16) 2064        conv2d_15[0][0]                  
__________________________________________________________________________________________________
concatenate_3 (Concatenate)     (None, 288, 288, 32) 0           conv2d_transpose_3[0][0]         
                                                                 conv2d_1[0][0]                   
__________________________________________________________________________________________________
conv2d_16 (Conv2D)              (None, 288, 288, 16) 4624        concatenate_3[0][0]              
__________________________________________________________________________________________________
dropout_8 (Dropout)             (None, 288, 288, 16) 0           conv2d_16[0][0]                  
__________________________________________________________________________________________________
conv2d_17 (Conv2D)              (None, 288, 288, 16) 2320        dropout_8[0][0]                  
__________________________________________________________________________________________________
conv2d_18 (Conv2D)              (None, 288, 288, 12) 204         conv2d_17[0][0]                  
==================================================================================================

Я думаю, что это решение, возможно, будет работать:

sample_weights = np.zeros(len(Y_train))     
# your own weight corresponding here:       
sample_weights[Y_train[Y_train==0]] = 7     
sample_weights[Y_train[Y_train==1]] = 10    
sample_weights[Y_train[Y_train==2]] = 2     
sample_weights[Y_train[Y_train==3]] = 3     
sample_weights[Y_train[Y_train==4]] = 4     
sample_weights[Y_train[Y_train==5]] = 5     
sample_weights[Y_train[Y_train==6]] = 6     
sample_weights[Y_train[Y_train==7]] = 50    
sample_weights[Y_train[Y_train==8]] = 8     
sample_weights[Y_train[Y_train==9]] = 9     
sample_weights[Y_train[Y_train==10]] = 50   
sample_weights[Y_train[Y_train==11]] = 11   

I ' получаю эту ошибку:

ValueError: Found a sample_weight array with shape (481,). In order to use timestep-wise sample weighting, you should pass a 2D sample_weight array.

1 Ответ

2 голосов
/ 11 апреля 2020

Вы неправильно используете sample_weight. Как понятно из его названия, он присваивает вес каждой выборке ; Итак, несмотря на то, что у вас есть только 481 выборка, вы передаете что-то длиной 82944 (и дополнительно 2 измерения), отсюда и ожидаемая ошибка:

ValueError: Found a sample_weight array with shape (82944, 12) for an input with shape (481, 288, 288). sample_weight cannot be broadcast.

Итак, что вам действительно нужно, это sample_weight 1D - массив длины, равный вашему тренировочному образцу, причем каждый его элемент является весом соответствующего образца - который, в свою очередь, должен быть одинаковым для каждого класса, как вы показываете.

Вот как вы можно сделать это, используя несколько фиктивных данных y из 12 классов и только 30 выборок:

import numpy as np

y = np.random.randint(12, size=30) # dummy data, 12 classes
y
# array([ 8,  0,  6,  8,  9,  9,  7, 11,  6,  4,  6,  3, 10,  8,  7,  7, 11,
#        2,  5,  8,  8,  1,  7,  2,  7,  9,  5,  2,  0,  0])

sample_weights = np.zeros(len(y))
# your own weight corresponding here:
sample_weights[y==0] = 7                                                                                                             
sample_weights[y==1] = 10                                                                                                            
sample_weights[y==2] = 2                                                                                                             
sample_weights[y==3] = 3                                                                                                             
sample_weights[y==4] = 4                                                                                                             
sample_weights[y==5] = 5                                                                                                             
sample_weights[y==6] = 6                                                                                                             
sample_weights[y==7] = 50                                                                                                            
sample_weights[y==8] = 8                                                                                                             
sample_weights[y==9] = 9                                                                                                             
sample_weights[y==10] = 50                                                                                                           
sample_weights[y==11] = 11  

sample_weights
# result:
array([ 8.,  7.,  6.,  8.,  9.,  9., 50., 11.,  6.,  4.,  6.,  3., 50.,
        8., 50., 50., 11.,  2.,  5.,  8.,  8., 10., 50.,  2., 50.,  9.,
        5.,  2.,  7.,  7.])

Давайте поместим их в красивый фрейм данных для лучшего просмотра:

import pandas as pd
d = {'y': y, 'weight': sample_weights}
df = pd.DataFrame(d)
print(df.to_string(index=False))

# result:

  y  weight
  8     8.0
  0     7.0
  6     6.0
  8     8.0
  9     9.0
  9     9.0
  7    50.0
 11    11.0
  6     6.0
  4     4.0
  6     6.0
  3     3.0
 10    50.0
  8     8.0
  7    50.0
  7    50.0
 11    11.0
  2     2.0
  5     5.0
  8     8.0
  8     8.0
  1    10.0
  7    50.0
  2     2.0
  7    50.0
  9     9.0
  5     5.0
  2     2.0
  0     7.0
  0     7.0

и где конечно вы должны заменить sample_weight=class_weights в вашем model.fit на sample_weight=sample_weights.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...