Сеть Keras работает только на некоторых машинах и предсказывает тот же класс на других - PullRequest
0 голосов
/ 26 марта 2019

Я делаю первые шаги в глубоком обучении, использую 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)

Я действительно отчаянно нуждаюсь в этой проблеме.Я несколько дней искал решение и до сих пор не представляю, где может быть проблема (код, версии или что-то еще).Меня действительно смущают два совершенно разных результата прогнозов.Любая идея о том, что может быть причиной этого, будет оценена.

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