Нейронная сеть VGG-16 хорошо предсказывает юпитер, но не гугл колаб - PullRequest
0 голосов
/ 05 апреля 2020

Я экспериментирую с моделью VGG-16 в Python. Я работал над ноутбуком jupyter, но поскольку я хочу запустить код на своем графическом процессоре, Google Colab кажется лучшей идеей. Сеть обучается и достаточно хорошо предсказывает на jupyter, но как только я копирую его в Colab, часть предсказания перестает работать (я получаю результаты не лучше, чем шанс). Единственное различие между обоими кодами состоит в том, что в Google Colab я загружаю изображения с Google Drive, но они одинаковые.

Это полный код, который я использую: (Код работает То же самое в обоих приложениях, пока не произойдет предсказание. Там, когда я запускаю его на Google Colab, я получаю в среднем точность 0,25)

import numpy as np
import keras
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.metrics import categorical_crossentropy
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from sklearn.metrics import confusion_matrix
import itertools
import matplotlib.pyplot as plt
%matplotlib inline
cant_clases = 4
train_path = 'perros_gatos_conejos_ratas/train'
valid_path = 'perros_gatos_conejos_ratas/valid'
test_path = 'perros_gatos_conejos_ratas/test'
clases = ['perro','gato','conejo','rata']
batch_size_train = 10
batch_size_test = 20
batch_size_valid = 4
size_train = 20
size_test = 5
size_valid = 8
train_batches = ImageDataGenerator().flow_from_directory(directory=train_path, target_size=(224,224),
    classes=clases, batch_size=batch_size_train)
valid_batches = ImageDataGenerator().flow_from_directory(directory=valid_path, target_size=(224,224),
    classes=clases, batch_size=batch_size_valid)
test_batches = ImageDataGenerator().flow_from_directory(directory=test_path, target_size=(224,224),
    classes=clases, batch_size=batch_size_test)
imgs, labels = next(train_batches)
plots(imgs, titles=labels)
vgg16_model = tf.keras.applications.vgg16.VGG16()
model = tf.keras.Sequential()
for layer in vgg16_model.layers[:-1]:
    model.add(layer)
for layer in model.layers:
    layer.trainable = False
model.add(Dense(cant_clases, activation='softmax'))
model.compile(optimizer=Adam(lr=.0001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(generator=train_batches, steps_per_epoch=size_train*cant_clases/batch_size_train, 
                    validation_data=valid_batches, validation_steps=size_valid*cant_clases/batch_size_valid, epochs=5, verbose=2)
test_imgs, test_labels_aux = next(test_batches)
predictions = model.predict_generator(generator=test_batches, steps=size_test*cant_clases/batch_size_test, verbose=0)
print(predictions)
test_labels = np.nonzero(test_labels_aux)[1]

idx=np.argmax(predictions, axis=1)
print(idx) 
print(test_labels)

right = 0 
wrong = 0 
for i in range(len(test_labels)): 
    if idx[i] == test_labels[i]: 
        right = right + 1 
    else: 
        wrong = wrong + 1

acc = right/(right+wrong) 
print(acc)

Спасибо!

...