Untitled
unknown
plain_text
3 years ago
8.3 kB
4
Indexable
# -*- coding: utf-8 -*- """Untitled0.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/173DAOLC4qtF-AwGc_T59qgbYsbivco8C """ #otworzymy archiwum do katalogu tmp import os import zipfile local_zip = 'C:/Users/Pepsi/Downloads/cats_and_dogs_face.zip' zip_ref = zipfile.ZipFile(local_zip, 'r') zip_ref.extractall('tmp') zip_ref.close() #bazowy katalog: base_dir = 'tmp/cats_and_dogs_filtered' #katolog ze zbiorem treningowym: train_dir = os.path.join(base_dir, 'train') #katolog ze zbiorem walidacyjnym: validation_dir = os.path.join(base_dir, 'validation') #katalog ze zbiorem trenognowym zdjęć kotów train_cats_dir = os.path.join(train_dir, 'cats') #katalog ze zbiorem trenognowym zdjęć psów train_dogs_dir = os.path.join(train_dir, 'dogs') #katalog ze zbiorem trenognowym zdjęć psów train_face_dir = os.path.join(train_dir, 'face') #katalog ze zbiorem walidacyjnym zdjęć kotów validation_cats_dir = os.path.join(validation_dir, 'cats') #katalog ze zbiorem walidacyjnym zdjęć psów validation_dogs_dir = os.path.join(validation_dir, 'dogs') #katalog ze zbiorem walidacyjnym zdjęć psów validation_face_dir = os.path.join(validation_dir, 'face') #test: czy katalogi zawietają odpowiednie zdjęcia? sprawdzenie nazw train_cat_fnames = os.listdir(train_cats_dir) print(train_cat_fnames[:10]) train_dog_fnames = os.listdir(train_dogs_dir) train_dog_fnames.sort() print(train_dog_fnames[:10]) train_face_fnames = os.listdir(train_face_dir) train_face_fnames.sort() print(train_face_fnames[:10]) #sprawdzenie liczby plików w katalogach print('total training cat images:', len(os.listdir(train_cats_dir))) print('total training dog images:', len(os.listdir(train_dogs_dir))) print('total training face images:', len(os.listdir(train_face_dir))) print('total validation cat images:', len(os.listdir(validation_cats_dir))) print('total validation dog images:', len(os.listdir(validation_dogs_dir))) print('total validation face images:', len(os.listdir(validation_face_dir))) # Commented out IPython magic to ensure Python compatibility. #wyświetlnie przykładowych 16 zdjęć ze zbioru treningowego # %matplotlib inline import matplotlib.pyplot as plt import matplotlib.image as mpimg #Liczba wierszy i kolumn nrows = 4 ncols = 8 #indeks do pętli pic_index = 0 #ustawienia matplotlib fig, ramka o wymiarze 4x4 fig = plt.gcf() fig.set_size_inches(ncols * 4, nrows * 4) pic_index += 8 next_cat_pix = [os.path.join(train_cats_dir, fname) for fname in train_cat_fnames[pic_index-8:pic_index]] next_dog_pix = [os.path.join(train_dogs_dir, fname) for fname in train_dog_fnames[pic_index-8:pic_index]] next_face_pix = [os.path.join(train_face_dir, fname) for fname in train_face_fnames[pic_index-8:pic_index]] for i, img_path in enumerate(next_cat_pix+next_dog_pix+next_face_pix): #przejście pętlą po obrazach sp = plt.subplot(nrows, ncols, i + 1) sp.axis('Off') #nie pokazuj osi img = mpimg.imread(img_path) plt.imshow(img) plt.show() from tensorflow.keras import layers from tensorflow.keras import Model from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras.optimizers import Adam # define cnn model def define_model(): # load model model = VGG16(include_top=False, input_shape=(150, 150, 3)) # mark loaded layers as not trainable for layer in model.layers: layer.trainable = False # add new classifier layers flat1 = layers.Flatten()(model.layers[-1].output) class1 = layers.Dense(128, activation='relu')(flat1) output = layers.Dense(3, activation='softmax')(class1) # define new model model = Model(inputs=model.inputs, outputs=output) # compile model #opt = SGD(lr=0.001, momentum=0.9) opt = Adam(lr=0.01) model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) return model model = define_model() #wyświetlnie podsumowania modelu model.summary() from tensorflow.keras.preprocessing.image import ImageDataGenerator # skalowanie wartości pikseli obrazka poprzez podzielenie ich przez 255 train_datagen = ImageDataGenerator(rescale=1./255) val_datagen = ImageDataGenerator(rescale=1./255) # wykonanie zbioru treningowego na podstawie zdjęć z katalogu train_generator = train_datagen.flow_from_directory( train_dir, # katalog ze zdjęciami target_size=(150, 150), # wszystkie obrazki będą zeskalowane do rozmiaru 150x150 batch_size=20, #rozmiar batcha shuffle=True, # ponieważ używamy binarycrossentropy, używamy binarnych etykiet klas class_mode='categorical') # wykonanie zbioru walidacyjnego na podstawie zdjęć z katalogu validation_generator = val_datagen.flow_from_directory( validation_dir, target_size=(150, 150), shuffle=True, batch_size=20, class_mode='categorical') #uruchomienie treningu, 15 epok po 100 kroków na epokę history = model.fit_generator( train_generator, steps_per_epoch=120, # 2000 images = batch_size * steps epochs=15, validation_data=validation_generator, validation_steps=62, # 1000 images = batch_size * steps verbose=True) import numpy as np import random from tensorflow.keras.preprocessing.image import img_to_array, load_img # Wyświetlenie wyników z poszczególnych warstw dla losowego obrazka successive_outputs = [layer.output for layer in model.layers[1:]] visualization_model = Model(model.inputs[0], successive_outputs) # pobranie losowego obrazka cat_img_files = [os.path.join(train_cats_dir, f) for f in train_cat_fnames] dog_img_files = [os.path.join(train_dogs_dir, f) for f in train_dog_fnames] face_img_files = [os.path.join(train_fece_dir, f) for f in train_face_fnames] img_path = random.choice(cat_img_files + dog_img_files + face_img_files) img = load_img(img_path, target_size=(150, 150)) # obrazek wygenerowany prz klasę PIL x = img_to_array(img) # przerobienie na numpy o rozmiarze 150x150x3 x = x.reshape((1,) + x.shape) # dodanie dodatkowego wymiaru na początku (1, 150, 150, 3) # przeskalowanie do 1/255 x /= 255 # dokonanie predykcji na successive_feature_maps = visualization_model.predict(x) # These are the names of the layers, so can have them as part of our plot layer_names = [layer.name for layer in model.layers[1:]] # Now let's display our representations for layer_name, feature_map in zip(layer_names, successive_feature_maps): if len(feature_map.shape) == 4: # Just do this for the conv / maxpool layers, not the fully-connected layers n_features = feature_map.shape[-1] # number of features in feature map # mapa cech ma rozmiar (1, size, size, n_features) size = feature_map.shape[1] # We will tile our images in this matrix display_grid = np.zeros((size, size * n_features)) for i in range(n_features): # przeskalowanie obrazków do 0-255, aby można je było wyświetlić x = feature_map[0, :, :, i] x -= x.mean() x /= x.std() x *= 64 x += 128 x = np.clip(x, 0, 255).astype('uint8') # wynik każdego filtru idzie do poprzecznej siatki display_grid[:, i * size : (i + 1) * size] = x # wyświetl jedną warstwę scale = 20. / n_features plt.figure(figsize=(scale * n_features, scale)) plt.title(layer_name) plt.grid(False) plt.imshow(display_grid, aspect='auto', cmap='viridis') # pobranie acc dla treningowego i walidacyjnego zbioru danych acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] # pobranie loss dla treningowego i walidacyjnego zbioru danych loss = history.history['loss'] val_loss = history.history['val_loss'] # liczba epok epochs = range(len(acc)) # wykres dokładności dla zbioru treningowego i walidacyjnego plt.plot(epochs, acc) plt.plot(epochs, val_acc) plt.title('Training and validation accuracy') plt.figure() # wykres loss dla zbioru treningowego i walidacyjnego plt.plot(epochs, loss) plt.plot(epochs, val_loss) plt.title('Training and validation loss')
Editor is loading...