Python 什么是;损失:0.0000e+;00-会计科目:1.0000-价值损失:0.0000e和x2B;00-val_acc:1.0000“;什么意思?

Python 什么是;损失:0.0000e+;00-会计科目:1.0000-价值损失:0.0000e和x2B;00-val_acc:1.0000“;什么意思?,python,transfer-learning,vgg-net,image-classification,Python,Transfer Learning,Vgg Net,Image Classification,我试图将皮肤病分为4类。我尝试使用VGG16进行迁移学习。无论我做了什么改变,它都不是分类。精度为1,损耗为0。但我认为它也不过分,因为通过混淆矩阵,我知道它将所有事物都分类为单个类 import json import math import os import cv2 from PIL import Image import numpy as np from keras import layers from keras.callbacks import Callback, ModelChec

我试图将皮肤病分为4类。我尝试使用VGG16进行迁移学习。无论我做了什么改变,它都不是分类。精度为1,损耗为0。但我认为它也不过分,因为通过混淆矩阵,我知道它将所有事物都分类为单个类

import json
import math
import os
import cv2
from PIL import Image
import numpy as np
from keras import layers
from keras.callbacks import Callback, ModelCheckpoint, ReduceLROnPlateau, TensorBoard
from keras.models import Model
from keras.applications.vgg16 import VGG16, preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.utils.np_utils import to_categorical
from keras.models import Sequential
from keras.optimizers import Adam
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import cohen_kappa_score, accuracy_score
import scipy
import tensorflow as tf
from keras import backend as K
import gc
from functools import partial
from tqdm import tqdm
from sklearn import metrics
from collections import Counter
import json
import itertools
from keras.optimizers import Adam
from keras.applications.vgg16 import VGG16, preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint, EarlyStopping
from keras.layers import Dense, Dropout, Flatten

#loading data and data preparation

def Dataset_loader(DIR, RESIZE, sigmaX=10):
    IMG = []
    read = lambda imname: np.asarray(Image.open(imname).convert("RGB"))
    for IMAGE_NAME in tqdm(os.listdir(DIR)):
        PATH = os.path.join(DIR,IMAGE_NAME)
        _, ftype = os.path.splitext(PATH)
        if ftype == ".jpg":
            img = read(PATH)

            img = cv2.resize(img, (RESIZE,RESIZE))

            IMG.append(np.array(img))
    return IMG

eczema_train = np.array(Dataset_loader('/content/medical-image-analysis/train/Eczema Photos', 224))
melanoma_train = np.array(Dataset_loader('/content/medical-image-analysis/train/Melanoma Skin Cancer Nevi and Moles',224))
psoriasis_train = np.array(Dataset_loader('/content/medical-image-analysis/train/Psoriasis pictures Lichen Planus and related diseases',224))

#labelling 
eczema_train_label = np.zeros(len(eczema_train))
melonoma_train_label = np.zeros(len(melanoma_train))
psoriasis_train_label = np.zeros(len(psoriasis_train))

X_train = np.concatenate((eczema_train, melanoma_train, psoriasis_train), axis=0,)
Y_train = np.concatenate((eczema_train_label, melonoma_train_label, psoriasis_train_label), axis=0,)

#train and evaluation split
X_train = (X_train-np.mean(X_train))/np.std(X_train)
X_train, X_test, Y_train, Y_test = train_test_split(
    X_train, Y_train, 
    test_size=0.3, 
    random_state=1
)
X_test, X_val, Y_test, Y_val = train_test_split(
    X_test, Y_test, 
    test_size=0.3, 
    random_state=1
)

s = np.arange(X_train.shape[0])
np.random.shuffle(s)
X_train = X_train[s]
Y_train = Y_train[s]

pre_trained_model = VGG16(input_shape=(224, 224, 3), include_top=False, weights="imagenet")

for layer in pre_trained_model.layers:
    print(layer.name)
    layer.trainable = False
    
print(len(pre_trained_model.layers))

last_layer = pre_trained_model.get_layer('block5_pool')
print('last layer output shape:', last_layer.output_shape)
last_output = last_layer.output

# Flatten the output layer to 1 dimension
x = layers.GlobalMaxPooling2D()(last_output)
# Add a fully connected layer with 512 hidden units and ReLU activation
x = layers.Dense(128, activation='softmax')(x)
# Add a dropout rate of 0.5
x = layers.Dropout(0.5)(x)
# Add a final sigmoid layer for classification
x = layers.Dense(4, activation='softmax')(x)

# Configure and compile the model

model = Model(pre_trained_model.input, x)
optimizer = Adam(lr=0.0001, beta_1=0.9, beta_2=0.9999, epsilon=None, decay=0.0, amsgrad=True)
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(rotation_range=60,
                    shear_range=0.2,
                    zoom_range=0.2,
                    width_shift_range=0.2,
                    height_shift_range=0.2,
                    horizontal_flip=True,
                    fill_mode='nearest')

train_datagen.fit(X_train)

val_datagen = ImageDataGenerator()
val_datagen.fit(X_val)

batch_size = 64
epochs = 3
history = model.fit(train_datagen.flow(X_train,Y_train, batch_size=batch_size),
                              epochs = epochs, validation_data = val_datagen.flow(X_val, Y_val),
                              verbose = 1, steps_per_epoch=(X_train.shape[0] // batch_size), 
                              validation_steps=(X_val.shape[0] // batch_size))
这是密码,你能帮我们找出哪里出了问题吗。提前感谢:)

所有这些numpy数组都用零填充。无论图像是代表湿疹、黑色素瘤还是牛皮癣,您都将其基本真理标签定义为0,因此您的模型“学习”无条件输出0。使至少两个类的标签为非零


此外,您使用的是CategoricalCrossentropy,它只适用于一种热标签编码或二进制分类。改用稀疏分类(或稀疏softmax)交叉熵。(请注意,代码中可能还有其他问题,但这是一个常见的错误,可以看到)。

我会要求您在将图像传递给模型之前打印图像,因为在我早期,我犯了一个愚蠢的错误,在处理阶段将图像变黑,请检查:Dan另一件事标签部分中的
np.zeros
是什么?我可以知道我们如何做标签吗?为每个类指定一个唯一的整数值,例如:我们有以下类{Dog,Horse,Cat,Pig}表示它们如下{0,1,2,3}因此,模型可以在培训/预测时指定一个课程,您能告诉我我是如何做的吗labelling@Sneha为它们指定不同的值(例如0、1、2),而不是零。我不知道为什么最后一层的输出向量中有一个额外的元素。是的,实际上我们后来决定再添加一个类,我没有添加代码。我很抱歉。但班级数量不是问题。顺便说一句,非常感谢。不用担心。请尝试为每个皮肤状况指定一个唯一的值0/1/2,看看您现在是否能够获得合理的准确性和损失。当然,我会试试
#labelling 
eczema_train_label = np.zeros(len(eczema_train))
melonoma_train_label = np.zeros(len(melanoma_train))
psoriasis_train_label = np.zeros(len(psoriasis_train))