如何修复张量流图像分类中的平坦精度和NaN损失

时间:2019-07-29 19:56:30

标签: tensorflow machine-learning artificial-intelligence

我目前正在尝试TensorFlow和机器学习,作为挑战,我决定尝试在Kaggle网站上编写一种机器学习软件,该软件可以分析脑部MRI扫描并预测是否存在肿瘤。我使用下面的代码执行了此操作,并开始训练该模型。但是,在训练过程中显示的文字表明,损失值(训练或验证)均不具有适当的值,并且精度在两个数字(每次相同)之间呈线性变化或波动。

我看过其他帖子,但找不到任何可以给我提示的内容。我更改了损失函数(从sparse_categorical_crossentropy更改为binary_crossentropy)。但是这些都没有改变值。

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os


import tensorflow as tf
from tensorflow import keras

import numpy as np
import cv2
import pandas as pd
from random import shuffle

IMG_SIZE = 50

data_path = "../input/brain_tumor_dataset"
data = []
folders = os.listdir(data_path)
for folder in folders:
    for file in os.listdir(os.path.join(data_path, folder)):
        if file.endswith("jpg") or file.endswith("jpeg") or file.endswith("png") or file.endswith("JPG"):
            data.append(os.path.join(data_path, folder, file))

shuffle(data)
images = []
labels = []
for file in data:
    img = cv2.imread(file)
    img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
    images.append(img)
    if "Y" in file:
        labels.append(1)
    else:
        labels.append(0)

union_list = list(zip(images, labels))
shuffle(union_list)
images, labels = zip(*union_list)
images = np.array(images)
labels = np.array(labels)

train_img = images[:200]
train_lbl = labels[:200]

val_img = images[200:]
val_lbl = labels[200:]


train_img = np.array(train_img)
val_img = np.array(val_img)
train_img = train_img.astype("float32") / 255.0
val_img = val_img.astype("float32") / 255.0

model = keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), padding='same', activation=tf.nn.relu, input_shape=(IMG_SIZE, IMG_SIZE, 3)),
    tf.keras.layers.MaxPooling2D((2,2), strides=2),

    tf.keras.layers.Conv2D(64, (3, 3), padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D((2,2), strides=2),

    tf.keras.layers.Dropout(0.8),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(1, activation=tf.nn.sigmoid)
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])



history = model.fit(train_img, train_lbl, epochs = 100, validation_data=(val_img, val_lbl))

这应该给出精度更高,损耗减少的结果,但是损耗是微不足道的,精度是平坦的。

2 个答案:

答案 0 :(得分:0)

很可能是因为NaN损失是造成整平精度的原因。我试图找出损耗在什么时候变为NaN(推断是在损耗计算中是在优化器中还是在损耗中)。 This post详细介绍了输出这些中间值的一些方法。

答案 1 :(得分:0)

我设法解决了这个问题。我再次查看代码,意识到我的输出层只有一个节点。但是,它需要输出两种不同类别的概率(无论是否为肿瘤,为“是”或“否”)。一旦将其更改为2个节点,网络便开始正常工作,并且在训练和验证集上的准确性均达到95%。 我的验证准确性仍在几个值之间波动,但这很可能是因为我在验证集中只有23张图像。但是,为了减少波动,我也将纪元数减少到了10。现在一切似乎都很好。