#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…