ValueError: Ошибка при проверке цели: ожидалось, что активация_1 будет иметь форму (3,), но получен массив с формой (2,) - PullRequest
0 голосов
/ 21 июня 2020

Это система, которая используется для обнаружения кожных заболеваний, где я использовал два набора данных для обучения модели. Я столкнулся с вышеупомянутой ошибкой. Я приложил полный процесс выполнения, модель способна классифицировать изображения на основе обученной модели и обнаруживать болезнь, но я пытаюсь переобучить модель и сталкиваюсь с ошибкой.

Miniconda использовалась для выполнения, в котором была настроена новая среда.

Версия Tensorflow - 1.8, keras - 2.1.5, python 3.6 также появляется некоторое предупреждение

C:\Users\nisch\miniconda3\envs\tf1.8\lib\site-packages\tensorflow\python\framework\dtypes.py:528: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.

np_resource = np.dtype([("resource", np.ubyte, 1)])
2020-06-21 02:39:19.652112: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

Список установленных пакетов указан ниже


(tf1.8) C:\Users\nisch\Desktop\Dermis-master>conda list
# packages in environment at C:\Users\nisch\miniconda3\envs\tf1.8:
#
# Name                    Version                   Build  Channel
absl-py                   0.9.0                    pypi_0    pypi
asgiref                   3.2.7                    pypi_0    pypi
astor                     0.8.1                    pypi_0    pypi
bleach                    1.5.0                    pypi_0    pypi
certifi                   2020.4.5.1               py36_0
django                    3.0.7                    pypi_0    pypi
gast                      0.3.3                    pypi_0    pypi
grpcio                    1.29.0                   pypi_0    pypi
h5py                      2.10.0                   pypi_0    pypi
html5lib                  0.9999999                pypi_0    pypi
image                     1.5.32                   pypi_0    pypi
importlib-metadata        1.6.1                    pypi_0    pypi
keras                     2.1.5                    pypi_0    pypi
keras-applications        1.0.8                    pypi_0    pypi
keras-preprocessing       1.1.2                    pypi_0    pypi
markdown                  3.2.2                    pypi_0    pypi
numpy                     1.18.5                   pypi_0    pypi
pillow                    7.1.2                    pypi_0    pypi
pip                       20.0.2                   py36_3
protobuf                  3.12.2                   pypi_0    pypi
python                    3.6.10               h9f7ef89_2
pytz                      2020.1                   pypi_0    pypi
pyyaml                    5.3.1                    pypi_0    pypi
scipy                     1.4.1                    pypi_0    pypi
setuptools                47.1.1                   py36_0
six                       1.15.0                   pypi_0    pypi
sqlite                    3.31.1               h2a8f88b_1
sqlparse                  0.3.1                    pypi_0    pypi
tensorboard               1.8.0                    pypi_0    pypi
tensorflow                1.8.0                    pypi_0    pypi
termcolor                 1.1.0                    pypi_0    pypi
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.16.27012          hf0eaf9b_2
werkzeug                  1.0.1                    pypi_0    pypi
wheel                     0.34.2                   py36_0
wincertstore              0.2              py36h7fe50ca_0
zipp                      3.1.0                    pypi_0    pypi
zlib                      1.2.11               h62dcd97_4

Это выполнение сценария python, упомянутого ниже

Когда выполняется код python

Ниже приведен сценарий python, запущенный

from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers.normalization import BatchNormalization
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Activation
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
from PIL import ImageFile
import os
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint

ImageFile.LOAD_TRUNCATED_IMAGES = True

class Interface():
    
    def __init__(self):
        try:
            Interface.CarregarModelo(self)
        except:
            pass
        
        self.root = Tk()

        self.root.title("D E R M I S")
        
        Button(self.root, text='Select a image', command = self.CaptureImage).grid(row=0,column=0, pady=5)
        
        Button(self.root, text='Train', command = self.TrainModel, width=10, height=2).grid(row=0,column=1)
        
        Button(self.root, text='Classify', command = self.ClassifyImage, width = 10, height = 2).grid(row=1, column = 1)
        
        Button(self.root, text='Save model', command= self.SaveModel, width=10, height=2).grid(row=2, column=1)

        self.root.mainloop()
        
    def CaptureImage(self):
        self.filename = askopenfilename()
        
        self.image = Image.open(self.filename)
        self.image = self.image.resize((400,400), Image.ANTIALIAS)
        self.photo = ImageTk.PhotoImage(self.image)
        
        label = Label(self.root, image = self.photo).grid(row=1,column = 0, padx = 15, pady = 5, rowspan= 3)
    
    def TrainModel(self):
        
        self.rede = Sequential()
        
        self.rede.add(Conv2D(16, (2, 2), input_shape = (64,64,3), activation='relu')) 
        self.rede.add(MaxPooling2D(pool_size =(2, 2))) 
          
        self.rede.add(Conv2D(16, (2, 2), activation='relu')) 
        self.rede.add(MaxPooling2D(pool_size =(2, 2))) 
          
        self.rede.add(Conv2D(32, (2, 2), activation='relu')) 
 
        self.rede.add(MaxPooling2D(pool_size =(2, 2))) 
        self.rede.add(Dropout(0.5)) 
          
        self.rede.add(Flatten()) 
        self.rede.add(Dense(units= 16, activation='relu')) 
        self.rede.add(Dropout(0.4)) 
        self.rede.add(Dense(units = 16, activation='relu')) 
        self.rede.add(Dropout(0.4))
        self.rede.add(Dense(3)) 
        self.rede.add(Activation('sigmoid')) 
        
        self.rede.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        
        EarlyStop = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)
        ModelSaving = ModelCheckpoint('best_model.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only = True)
        
        gerador_treinamento = ImageDataGenerator(rescale=1. / 255, rotation_range = 7, horizontal_flip = True, shear_range = 0.2, height_shift_range = 0.07, zoom_range = 0.2)
        
        gerador_teste = ImageDataGenerator(rescale= 1. / 255, )
        
        base_treinamento = gerador_treinamento.flow_from_directory('Dataset/Train', target_size = (64, 64), batch_size = 32, class_mode = 'categorical')
        base_teste = gerador_teste.flow_from_directory('Dataset/Test', target_size = (64, 64), batch_size = 32, class_mode = 'categorical')
        
        self.rede.fit_generator(base_treinamento, steps_per_epoch=50, epochs=100, validation_data = base_teste, validation_steps = 20, callbacks =[ModelSaving])
        
        Interface.SalvarModelo(self)
            
    def ClassifyImage(self):
       
        
        imagem_teste = image.load_img(self.filename, target_size = (64,64))
        
        imagem_teste = image.img_to_array(imagem_teste)
        
        imagem_teste /= 255
        
        imagem_teste = np.expand_dims(imagem_teste, axis = 0)
        
        previsao = self.rede.predict(imagem_teste)
        
        print(previsao)
        resultado = np.argmax(previsao,axis=1)[0]
        
       
        Classes = ['Sifilis','Melanoma','Pele normal']
        Resultado = str(Classes[resultado])
        Porcentagem = "{:.1f}%".format(previsao[0][resultado] * 100)
        
        Label(self.root, text=Porcentagem).grid(row=2,column=0)
        Label(self.root, text=Resultado).grid(row=1,column=0)
        
            
    def SaveModel(self):
        model = self.rede
        model_json = model.to_json()
        with open('best_model.json', 'w') as json_file:
            json_file.write(model_json)
        model.save_weights("best_model.h5")
        print("Modelo saved successfuly")
            
    def CarregarModelo(self):
        json_file = open('best_model.json', 'r')
        loaded_model_json = json_file.read()
        json_file.close()
        loaded_model = model_from_json(loaded_model_json)
        
        loaded_model.load_weights("best_model.h5")
        print("Modelo changes sucessfuly")
        
        loaded_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        self.rede = loaded_model
    
Interface()

Я новичок ie здесь пытаюсь исследовать, но я вижу, что я лажаю с весами, которые я принял за модель. Нужна помощь в этом разобраться. заранее спасибо.

...