Методы повышения производительности моего VGG-16 UNet LSTM

#python #tensorflow #machine-learning #conv-neural-network #lstm

#питон #тензорный поток #машинное обучение #conv-нейронная сеть #lstm

Вопрос:

Задача состоит в том, чтобы мне был предоставлен набор данных в последовательном порядке, который относится к двоичной системе классификации. Вы видите дождевые облака над определенным городом, и над таким городом нет дождевых облаков. У меня есть набор тестовых данных, который я строю на основе алгоритма машинного обучения, который предполагает, что обучающий набор правильно классифицирован для классификации тестового набора. В конце концов я создаю две папки с реорганизованными и правильно классифицированными данными тестирования. Я читал много сообщений о том, как исправить проблему, с которой я сталкиваюсь, которая заключается в том, что точность остается постоянной, а потери остаются на уровне 0,0000 e 0,0. Поэтому я начну сначала с ImageDataGenerator:

 train_datagen = ImageDataGenerator( rescale = 1./255, samplewise_center=True, featurewise_center=True, horizontal_flip = True, fill_mode = "reflect", shear_range=0.1, zoom_range = 0.1, width_shift_range = 0.1, height_shift_range=0.1, rotation_range=5, preprocessing_function= preprocess_input )  test_datagen = ImageDataGenerator( preprocessing_function=preprocess_input )  train_generator = train_datagen.flow_from_directory( train_data_dir, target_size = (224, 224), #batch_size = 10, class_mode = "binary", shuffle=False)  validation_generator = test_datagen.flow_from_directory(  validation_data_dir,  target_size = (224, 224),  #batch_size = 10,  class_mode = "binary" )  

Я прочитал много сообщений о переполнении стека о нормализации и стандартизации набора данных изображений, а также о его перетасовке. Я реализовал многие из этих функций в своем алгоритме машинного обучения, и он не улучшился. Потеря при обучении остается на уровне 0,0000 e 0,0, точность составляет 0,5238, AUC-0,50, а проверка имеет val_AUC .50 и val_accuracy .7500, что также является постоянным. Мои мысли по этому поводу сводятся к тому, что моя модель либо недостаточно подходит, либо переоснащена, либо вообще не оценивает проблему. Вот журнал эпохи:

 Epoch 1/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00001: val_acc improved from -inf to 0.75000, saving model to weather1.h5 20/20 [==============================] - 74s 4s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 2/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00002: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 3/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00003: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 4/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00004: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 5/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00005: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 6/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00006: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 7/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00007: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 8/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00008: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 9/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00009: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 10/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00010: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 11/15 20/20 [==============================] - ETA: 0s - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 Epoch 00011: val_acc did not improve from 0.75000 20/20 [==============================] - 56s 3s/step - loss: 0.0000e 00 - auc: 0.5000 - acc: 0.5238 - val_loss: 0.0000e 00 - val_auc: 0.5000 - val_acc: 0.7500 Epoch 00011: early stopping   

Now comes the discussion pertaining to my model, I was doing research and saw that Semantic Segmentation could improve model performance however, I have never worked with the network that the tutorial showed. Furthermore, the model had the same issue before this implementation.

#My Model

 def Relu_Tanh_Function(input , number_of_loops):  x = Dense(512, activation = "relu")(input)  x = Dense(128, activation="tanh")(x)  for i in range(0,number_of_loops-1):  x = Dense(128, activation="relu")(x)  x = Dense(64, activation="tanh")(x)  return x      def conv_block(input, num_filters):  x = Conv2D(num_filters, 3, padding="same")(input)  x = BatchNormalization()(x)  x = Activation("relu")(x)   x = Conv2D(num_filters, 3, padding="same")(x)  x = BatchNormalization()(x)  x = Activation("relu")(x)   return x  def decoder_block(input, skip_features, num_filters):  x = Conv2DTranspose(num_filters, (2, 2), strides=2, padding="same")(input)  x = Concatenate()([x, skip_features])  x = conv_block(x, num_filters)  return x  def build_vgg16_unet(input_shape):  """ Input """  inputs = Input(input_shape)  inputs = GaussianNoise(.5)(inputs)   """ Pre-trained VGG16 Model """  vgg16 = VGG16(include_top=False, weights="imagenet", input_tensor=inputs)   """ Encoder """  s1 = vgg16.get_layer("block1_conv2").output ## (512 x 512)  s2 = vgg16.get_layer("block2_conv2").output ## (256 x 256)  s3 = vgg16.get_layer("block3_conv3").output ## (128 x 128)  s4 = vgg16.get_layer("block4_conv3").output ## (64 x 64)   """ Bridge """  b1 = vgg16.get_layer("block5_conv3").output ## (32 x 32)   """ Decoder """  d1 = decoder_block(b1, s4, 512) ## (64 x 64)  d2 = decoder_block(d1, s3, 256) ## (128 x 128)  d3 = decoder_block(d2, s2, 128) ## (256 x 256)  d4 = decoder_block(d3, s1, 64) ## (512 x 512)   """ Output """  cnn_outputs = Conv2D(1, 1, padding="same", activation="softmax")(d4)  rnn_input = TimeDistributed(Flatten()) (cnn_outputs)  rnn = LSTM(8,return_sequences=True)(rnn_input)  #outputs = Flatten()(outputs)  rnn = LSTM(1,return_sequences=False)(rnn)  code_block = Relu_Tanh_Function(rnn,2)  outputs = Dense(1, activation="softmax")(code_block)   model = Model(inputs, outputs, name="VGG16_U-Net")  return model def custom_loss(y_true, y_pred):  return SCE(y_true, y_pred)  

I burrowed code from a tutorial to see if implementing it with the VGG16 could help my case, and it has not worked at all. At times I believe the model can not be properly classified, and that it is not worth any more time. However, I have been reading that there is a reasonable effectiveness of implementing a VGG16 UNet LSTM model for classification.

Наконец, вот мой импорт TensorFlow:

 import tensorflow as tf from tensorflow.compat.v1.losses import softmax_cross_entropy as SCE from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint, LearningRateScheduler, EarlyStopping, CSVLogger from tensorflow.keras.layers import * from tensorflow.keras.metrics import Accuracy, AUC, BinaryAccuracy, CategoricalAccuracy  from tensorflow.keras.models import Sequential,Model from tensorflow.keras.optimizers import SGD as tf_SGD from tensorflow.keras.optimizers import RMSprop, Nadam from tensorflow.keras.optimizers.schedules import ExponentialDecay, InverseTimeDecay from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.regularizers import L1,L2  

Вот мои прогнозы:

 predictions = model.predict(validation_generator) predictions array([[1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.],  [1.]], dtype=float32)  

Комментарии:

1. похоже, что ваш y_pred равен нулю

2. Я читал книгу по машинному обучению, написанную Аурли Героном «Руки по машинному обучению», и я пробовал кое-что из книги и своих независимых исследований в Интернете. Я сделал это, чтобы прочитать, как другие ученые-компьютерщики используют эти типы моделей для двоичной классификации или даже классификации с изменяемыми метками.

3. что? все, что я хочу сказать, вы проверили, что y_pred не равен 0

4. Я сделаю это сейчас, когда он работает на процессоре.

5. @SobhanMohammadpour Все они-1…