我需要一些有关keras图像分类器项目的帮助

时间:2019-06-12 23:59:04

标签: python image tensorflow keras classification

我一直在做这个成像器,它不能编译。训练文档是否运行良好,但预测图像的文档效果不佳。

它由基于这些视频的图像分类器组成。

https://www.youtube.com/watch?v=EAqb20_4Rdg&t=450s

https://www.youtube.com/watch?v=FWz0N4FFL0U&t=53s

这是培训代码(可以正常工作)

import sys                                                                         # Lo vamos a hacer con TensorFLow pero dentro de este tenemos la posibilidad de usar Keras.
import os                                                                          # Vamos a importar las librerias que nos van a permitir movernos entre los directorios de nuestro sistema.
import tensorflow as tf
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator         # Libreria que nos va a pre-procesar las imagenes para entrenar a nuestro algoritmo:
from tensorflow.python.keras import optimizers                                     # Importo los optimizadores:
from tensorflow.python.keras.models import Sequential                              # Importo la libreria que nos permite hacer redes neurnales secueniales (Cada una de las capas está ordenada):
from tensorflow.python.keras.layers import Dropout, Flatten, Dense, Activation
from tensorflow.python.keras.layers import Convolution2D, MaxPooling2D             # Importo las capas en las cuales vamos a estar haciendo nuestras convoluciones y max-pooling:
from tensorflow.python.keras import backend as K                                   # Importo la libreria que nos va a ayudar a que si hay una sesión de queras que está corriendo en segundo plano, matarlo y empezar de 0:

K.clear_session()                                                                  # Empiezo una sesión nueva:

data_entrenamiento = r'C:\Users\JOSEA\Downloads\data\train'                           # La "r" al principio de la string la va a transformar en uns RAW string para que no detecte el comando especial "\".
data_validacion = r'C:\Users\JOSEA\Downloads\data\validation'


##Parametros:

epocas = 20                                                                        # Veces que vamos a iterar nuestro DataSet.
altura, longitud = 100, 100                                                        # Tamaño al que vamos a procesar nuestras imágenes.
batch_size = 32                                                                    # Número de imágenes que vamos a enviar para procesar en cada uno de las iteraciones. (Evitar sobrecarga de RAM).
pasos = 1000                                                                       # Número de veces que se va a procesar la información en cada una de las épocas.
pasos_validacion = 200                                                             # Al final de cada época se van a ejecutar 200 pasos con nuestro DataSet de validación (Comprobación).
filtrosConv1 = 32
filtrosConv2 = 64                                                                  # Número de filtros que va a haber en cada convolución. Profundidad de las capas ocultas.
tamano_filtro1 = (3,3)
tamano_filtro2 = (2,2)                                                             # Filtro(altura x longitud)
tamano_pool = (2,2)                                                                # Tamaño del filtro en MaxPooling
clases = 2                                                                         # "gato", "perro", "gorila"
lr = 0.0005                                                                        # Learning rate. Que tan grande va a ser el ajuste para acercarse a una solución óptima (numero pequeño)

##Pre-procesamiento de imagenes:

# Creo un generador al que le voy a indicar como preprocesar la información y después voy a hacer la transformación de las imágenenes.
# ----------------------------------------------------------------------------------------------------------------------

entrenamiento_datagen = ImageDataGenerator(
    rescale = 1./255,                          # Transforma cada pixel de un RANGO de 0-255 a un rango de 0-1 (Downnscale)
    shear_range = 0.3,                         # Va a INCLINAR y rotar cada imagen para que el algoritmo aprenda como es el objeto desde todas las perspectivas
    zoom_range = 0.3,                          # Va a hacer ZOOM a cada imagen para entrenar al algoritmo de forma alterna.
    horizontal_flip = True                     # Va a INVERTIR la imagen.
)

validacion_datagen = ImageDataGenerator(
    rescale = 1./255                           # Solo REESCALO estas imágenes de test para comparar con los resultados de entrenamiento.
)

# Creo las dos variables que van a contener a las imágenes procesadas de Training y Testing.
# ----------------------------------------------------------------------------------------------------------------------

imagen_entrenamiento = entrenamiento_datagen.flow_from_directory(
    data_entrenamiento,                        # Va a entrar al directorio "data".
    target_size = (altura, longitud),          # Va a preprocesar todas las imágenes que se encuentre a una altura y longitud (definidas arriba).
    batch_size = batch_size,                   # Va a tomar una cantidad de 32 imágenes para cada iteración.
    class_mode = 'categorical'                 # La clasificación va a ser categórica ["perro","gato","gorila"]
)

imagen_validacion = validacion_datagen.flow_from_directory(
    data_validacion,
    target_size = (altura, longitud),
    batch_size = batch_size,
    class_mode = 'categorical'
)

# Creo nuestra red neuronal convolucional:
#-----------------------------------------------------------------------------------------------------------------------

cnn = Sequential()                                                                                                      # Le vamos a decir que la Red sea seuencial, es decir, varias capas apiladas entre ellas.

cnn.add(Convolution2D(filtrosConv1, tamano_filtro1, padding='same', input_shape=(altura, longitud,3), activation='relu')) # Convolución(Filtros, Tamaño_Filtro, Filtro_esquinas, Tamaño_Imagen, Función_de_activación=RELU).
cnn.add(MaxPooling2D(pool_size = tamano_pool))                                                                          # Después de la capa de Convolución vamos a tener una capa de MaxPooling que va a tener un tamaño de (2,2) pixels.

cnn.add(Convolution2D(filtrosConv2, tamano_filtro2, padding='same', activation='relu'))                                 # Convolución(Filtros, Tamaño_Filtro, Filtro_esquinas, Función_de_activación=RELU).
cnn.add(MaxPooling2D(pool_size = tamano_pool))                                                                          # Después de la capa de Convolución vamos a tener una capa de MaxPooling que va a tener un tamaño de (2,2) pixels.

cnn.add(Flatten())                                                                                                      # Vamos a transformar la imagen que es muy profunda y pequeña a una muy grando plana de una sola dimensión.
cnn.add(Dense(256, activation = 'relu'))                                                                                # Añade una capa de 256 neuronas donde van a estar todas las neuronas de las capas anteriores. Función de activación es relu.
cnn.add(Dropout(0.5))                                                                                                   # Le voy a "apagar" el 50% de las neuronas para que no esté demasiado ajustado. No quiero que encuentre un único camino para "perros" sino que encuentre varios.
cnn.add(Dense(clases, activation = 'softmax'))

cnn.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=lr), metrics=['accuracy'])

cnn.fit_generator(imagen_entrenamiento, steps_per_epoch=pasos, epochs=epocas, validation_data=imagen_validacion, validation_steps=pasos_validacion)

dir = r'C:\Users\JOSEA\Downloads\data\modelos'

if not os.path.exists(dir):
    os.mkdir(dir)
cnn.save(r'C:\Users\JOSEA\Downloads\data\modelos\modelo.h5')
cnn.save_weights(r'C:\Users\JOSEA\Downloads\data\modelos\pesos.h5')


这是验证码(不编译)

底部错误

import os
import sys
import tensorflow as tf
import numpy as np
import keras
from keras.preprocessing.image import load_img, img_to_array
from keras.models import load_model

longitud, altura = 150, 150
modelo=r'C:\Users\JOSEA\Downloads\data\modelos\modelo.h5'
pesos=r'C:\Users\JOSEA\Downloads\data\modelos\pesos.h5'
cnn = load_model(modelo)
cnn.load_weights(pesos)

def predict(file):
    x = load_img(file, target_size=(longitud, altura))                           # Le paso a la x nuestro valor de longitud y altura de la imagen.
    x = img_to_array(x)                                                          # Convierto la imagen en un array de valores.
    x = np.expand_dims(x, axis=0)                                                # En el eje 0 (primera dimensión del array) quiero que me añada otra dimensión para procesar la imagen sin problema.
    arreglo = cnn.predict(x)                 ## [[1, 0, 0]]                      # Llamo a la red neuronal para haga una predicción y nos da un array de dos dimensiones tal que #[[1, 0, 0]] de la que solo se va a tomar el 1 como acierto.
    resultado = arreglo[0]                   ## [[0, 0, 1]]                      # Solo me interesa la primera dimensión como resultado.
    respuesta = np.argmax(resultado)         ## 2                                # Va a tomar como output la posición en el vector del valor mas alto.
    if respuesta == 0:
        print('perro')
    if respuesta == 1:
        print('gato')
    return respuesta

predict(r'C:\Users\JOSEA\Downloads\data\Extra_Dataset\cat.1440')

错误:

C:\Users\JOSEA\Anaconda3\envs\Ajedrez\python.exe C:/Users/JOSEA/PycharmProjects/Image_Classifier_TF/predicciones.py
Using TensorFlow backend.
Traceback (most recent call last):
  File "C:/Users/JOSEA/PycharmProjects/Image_Classifier_TF/predicciones.py", line 12, in <module>
    cnn = load_model(modelo)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\engine\saving.py", line 419, in load_model
    model = _deserialize_model(f, custom_objects, compile)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\engine\saving.py", line 225, in _deserialize_model
    model = model_from_config(model_config, custom_objects=custom_objects)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\engine\saving.py", line 458, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\layers\__init__.py", line 55, in deserialize
    printable_module_name='layer')
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\utils\generic_utils.py", line 145, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\engine\sequential.py", line 300, in from_config
    custom_objects=custom_objects)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\layers\__init__.py", line 55, in deserialize
    printable_module_name='layer')
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\utils\generic_utils.py", line 147, in deserialize_keras_object
    return cls.from_config(config['config'])
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\engine\base_layer.py", line 1109, in from_config
    return cls(**config)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\layers\convolutional.py", line 490, in __init__
    **kwargs)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\layers\convolutional.py", line 117, in __init__
    self.kernel_initializer = initializers.get(kernel_initializer)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\initializers.py", line 508, in get
    return deserialize(identifier)
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\initializers.py", line 503, in deserialize
    printable_module_name='initializer')
  File "C:\Users\JOSEA\Anaconda3\envs\Ajedrez\lib\site-packages\keras\utils\generic_utils.py", line 138, in deserialize_keras_object
    ': ' + class_name)
ValueError: Unknown initializer: GlorotUniform

Process finished with exit code 1

2 个答案:

答案 0 :(得分:1)

您正在使用var fieldValueSet = new FieldValueSet { Color = "Fuchsia", Quantity = 934 }; await graphClient.Sites["yourtenant.sharepoint.com:/sites/ITOddeleni:"].Lists["TeamsRequest"].Items[item.Id].Fields .Request() .UpdateAsync(fieldValueSet); 训练模型,然后将其加载到keras中来混合tf.kerastf.keras。这是行不通的,因为这两个框架都不兼容。

选择一种实现并完全使用它,不要混用。

答案 1 :(得分:0)

更改:

from keras.models import load_model

收件人:

from tensorflow.keras.models import load_model

对我有用。您可以找到其他信息here