python - CNN 与 Keras - 准确度非常低且损失为负 - 显然是我的错误
问题描述
我正在尝试构建一个 CNN,将与皮肤癌相关的图像分为七类。我对 CNN 的概念相对较新,并且一直在调整狗/猫分类用例以适应已知的皮肤癌数据库挑战。问题是损失和准确性极低,并且在各个时期都是恒定的。不过,我不确定问题出在哪里——我的第一个假设是使用的图像数量太少:用于训练的 436 个样本和 109 个验证样本。我使用的图像数量从 10000+ 减少,因为我使用的是我的 macbook pro。
脚本:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sys
import os
import cv2
DATA_DIR = "/Users/namefolder/PycharmProjects/skin-cancer/HAM10000_images_part_1"
metadata = pd.read_csv(os.path.join(DATA_DIR, 'HAM10000_metadata.csv'))
lesion_type_dict = {'nv': 'Melanocytic nevi',
'mel': 'Melanoma',
'bkl': 'Benign keratosis-like lesions ',
'bcc': 'Basal cell carcinoma',
'akiec': 'Actinic keratoses',
'vasc': 'Vascular lesions',
'df': 'Dermatofibroma'}
metadata['cell_type'] = metadata['dx'].map(lesion_type_dict.get)
metadata['dx_code'] = pd.Categorical(metadata['dx']).codes
# save array of image-id and diagnosis-type (categorical)
metadata = metadata[['image_id', 'dx', 'dx_type', 'dx_code']]
training_data = []
IMG_SIZE=40
# preparing training data
def creating_training_data(path):
for img in os.listdir(path):
try:
img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
for index, row in metadata.iterrows():
if img == row['image_id']+'.jpg':
try:
training_data.append([new_array, row['dx_code']])
except Exception as ee:
pass
except Exception as e:
pass
return training_data
training_data = creating_training_data(DATA_DIR)
import random
random.shuffle(training_data)
# Splitting data into X features and Y label
X_train = []
y_train = []
for features, label in training_data:
X_train.append(features)
y_train.append(label)
# Reshaping of the data - required by Tensorflow and Keras (*necessary step of deep-learning using these repos)
X_train = np.array(X_train).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
# Normalize data - to reduce processing requirements
X_train = X_train/255.0
# model configuration
model = Sequential()
model.add(Conv2D(64, (3,3), input_shape = X_train.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Dense(1))
model.add(Activation("softmax"))
model.compile(loss="mean_squared_error",
optimizer="adam",
metrics=["accuracy"])
训练模型:
Model fitting output:
Train on 436 samples, validate on 109 samples
Epoch 1/20
436/436 [==============================] - 1s 2ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 2/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 3/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 4/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 5/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 6/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 7/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 8/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 9/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 10/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 11/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 12/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 13/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 14/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 15/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 16/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 17/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 18/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 19/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
Epoch 20/20
436/436 [==============================] - 1s 1ms/sample - loss: 11.7890 - acc: 0.0688 - val_loss: 13.6697 - val_acc: 0.0642
型号总结:
Model: "sequential_16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_30 (Conv2D) (None, 38, 38, 64) 640
_________________________________________________________________
activation_44 (Activation) (None, 38, 38, 64) 0
_________________________________________________________________
max_pooling2d_30 (MaxPooling (None, 19, 19, 64) 0
_________________________________________________________________
conv2d_31 (Conv2D) (None, 17, 17, 64) 36928
_________________________________________________________________
activation_45 (Activation) (None, 17, 17, 64) 0
_________________________________________________________________
max_pooling2d_31 (MaxPooling (None, 8, 8, 64) 0
_________________________________________________________________
flatten_14 (Flatten) (None, 4096) 0
_________________________________________________________________
dense_28 (Dense) (None, 64) 262208
_________________________________________________________________
dense_29 (Dense) (None, 1) 65
_________________________________________________________________
activation_46 (Activation) (None, 1) 0
=================================================================
Total params: 299,841
Trainable params: 299,841
Non-trainable params: 0
有人可以告诉我是否是这种情况或这样做。您看到我需要更改/修复的其他区域吗?
提前致谢!
解决方案
您正在使用
model.add(Dense(1))
model.add(Activation("softmax"))
即,只有一个具有 softmax 的神经元的 Dense 层?这不起作用,您至少需要输出维度为 2 才能使用 softmax。
您的标签是如何表示的?
推荐阅读
- java - MongoDb Spring boot,找不到用户实体
- swift - 向前传递数据时 Swift 有趣的 NSExceptionError
- schema.org - Schema.org 的首字母缩写词/缩写(在词汇表中)
- image - 灯光组件在 Unity 中的 Image 后面
- php - 将表单数据作为会话变量存储在多个页面上
- sql-server - 无法从数据源确定 jdbc url;无法获取用于提取元数据的连接
- javascript - 那么在一个 JS Promise 上有多条链?
- android - 在 Firebase 应用程序中安排考试日期和时间通知
- laravel - Laravel 按角色统计用户
- dart - 如何从飞镖中的字符串中提取双精度?