我目前正在尝试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))
这应该给出精度更高,损耗减少的结果,但是损耗是微不足道的,精度是平坦的。
答案 0 :(得分:0)
很可能是因为NaN损失是造成整平精度的原因。我试图找出损耗在什么时候变为NaN(推断是在损耗计算中是在优化器中还是在损耗中)。 This post详细介绍了输出这些中间值的一些方法。
答案 1 :(得分:0)
我设法解决了这个问题。我再次查看代码,意识到我的输出层只有一个节点。但是,它需要输出两种不同类别的概率(无论是否为肿瘤,为“是”或“否”)。一旦将其更改为2个节点,网络便开始正常工作,并且在训练和验证集上的准确性均达到95%。 我的验证准确性仍在几个值之间波动,但这很可能是因为我在验证集中只有23张图像。但是,为了减少波动,我也将纪元数减少到了10。现在一切似乎都很好。