Я делаю первые шаги в глубоком обучении, использую Keras с Tensorflow в качестве бэкэнда, с проблемой классификации изображений, использую предварительно обученную сеть Inception_v3 с весами imagenet и перенесу обучение в мою задачу с одним скрытым плотным слоем.Мой первый подход дал мне точность 92% на тренировках и 86% на тестовом наборе.
Поскольку обучение проводилось в ЦП, я решил установить tensorflow-gpu
для более быстрых вычислений.Но когда я сделал это, моя предыдущая сеть начала предсказывать всегда один и тот же класс по тестовому набору.Результаты обучения остались прежними (около 92%).Хотя после этого я избавился от установки gpu, сеть по-прежнему предсказывает всегда один и тот же класс.
Я пробовал свой код на других машинах с gpu и без него.Он работает на некоторых из них, но предсказывает тот же класс в других, независимо от использования gpu.Я пытался обновить и понизить тензор потока, keras и библиотеки CUDA, используя все возможные комбинации, которые я смог установить, используя conda или pip, но моя сеть никогда не предсказывала хорошие результаты на моем компьютере.Я также проверил на возможные проблемы в GitHub и другие вопросы SO.Единственное, что я видел, что может повлиять на мой код, это то, что я не использую функцию Inception preprocess_input()
, но это не объясняет, почему моя сеть достигает 86% на других машинах, и на моем компьютере в первый раз, когда япытался.В любом случае, я пытался использовать эту функцию, и результаты все еще плохие.Некоторые сайты также говорят, что проблема предсказания того же класса может быть вызвана дисбалансом класса, но в моем коде я использую увеличение данных (и это также не объясняет, как моя сеть достигла 86%).
Операционная система моего компьютера - Ubuntu 18.04.Вот код, который я использовал для построения сети, обучения и прогнозирования.Я использовал набор данных с 14 классами.
from keras.preprocessing.image import ImageDataGenerator,array_to_img, img_to_array, load_img
from keras.layers import Dense
from keras.models import Model
from keras.applications.inception_v3 import InceptionV3
import numpy as np
import pandas as pd
from PIL import Image
import os
# Fix seed
seed = 1234
# Load test data
generator = ImageDataGenerator()
iterator = generator.flow_from_directory('Test_Mixed',target_size=(299, 299),batch_size=146, shuffle=False)
test, y = iterator.next()
names = iterator.filenames
names = [ name[name.index('/')+1:] for name in names]
# Load pre-trained model
base_model = InceptionV3(weights='imagenet', include_top=False, pooling = 'avg',input_shape=(299, 299, 3))
for layer in base_model.layers:
layer.trainable = False
output_layer = base_model.output
# Hidden and output layers to train
hidden = Dense(100,input_dim=1000,activation='relu')(output_layer)
final = Dense(14,input_dim=32,activation='softmax')(hidden)
# Final model
model = Model(inputs=base_model.input,outputs=final)
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
# Data augmentation
generator = ImageDataGenerator(
#rescale=0.7,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True
)
iterator = generator.flow_from_directory('train/',target_size=(299, 299), batch_size=32, shuffle=True, seed = seed)
# Training
model.fit_generator(iterator,epochs=15,steps_per_epoch=20,verbose=True)
# Predictions
y_preds = model.predict(test)
labels = y_preds.argmax(axis=1)
Я действительно отчаянно нуждаюсь в этой проблеме.Я несколько дней искал решение и до сих пор не представляю, где может быть проблема (код, версии или что-то еще).Меня действительно смущают два совершенно разных результата прогнозов.Любая идея о том, что может быть причиной этого, будет оценена.