【问题标题】:CNN accuracy doesn't change through multiple epochsCNN 准确性不会在多个时期内发生变化
【发布时间】:2020-11-21 23:58:13
【问题描述】:

我正在尝试创建一个 CNN,它可以区分有/没有糖尿病视网膜病变症状的眼睛的黑白照片。当我尝试运行我的模型时,准确性根本没有提高。我尝试使用不同的学习率,但没有奏效。由于这是我第一次制作 CNN,我想我可能在其他地方犯了错误。如果您在我的代码中发现问题,请告诉我,非常感谢您的帮助。

Train on 980 samples, validate on 327 samples
Epoch 1/5
980/980 [==============================] - 777s 792ms/step - loss: 8.1986 - accuracy: 0.4653 - val_loss: 8.8154 - val_accuracy: 0.4251
Epoch 2/5
980/980 [==============================] - 666s 679ms/step - loss: 8.1986 - accuracy: 0.4653 - val_loss: 8.8154 - val_accuracy: 0.4251
Epoch 3/5
980/980 [==============================] - 672s 686ms/step - loss: 8.1986 - accuracy: 0.4653 - val_loss: 8.8154 - val_accuracy: 0.4251

这是我的代码:

DATADIR = "C:\\Users.."
CATEGORIES = ["nosymptoms", "symptoms"]
training_data = []
IMG_SIZE = 512
for category in CATEGORIES:
    path = os.path.join(DATADIR, category) #brings us to folder with categories
    class_num = CATEGORIES.index(category)
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE)
        new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) #img resized and becomes array
        training_data.append([new_array, class_num]) #classification is appended to image 
import random
random.shuffle(training_data)
for sample in training_data[:10]:
    print(sample[1])#0 is the image array, 1 is the label
X = [] #features set
y = [] #labels
X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)#shape of features (-1 means any), img size, 1 (b/c it is a grayscale) 
#Save data
import pickle
pickle_out = open("X.pickle","wb")
pickle.dump(X, pickle_out)
pickle_out.close()

pickle_out = open("y.pickle","wb")
pickle.dump(y, pickle_out)
pickle_out.close()

X = pickle.load(open("X.pickle", "rb"))
y = pickle.load(open("y.pickle", "rb"))

X = X/255.0
model = Sequential()

model.add(Convolution2D(32, (3,3),input_shape=(X.shape[1:]),activation='relu'))
model.add(Convolution2D(32, (3,3),activation='relu'))
model.add(Convolution2D(32, (3,3),activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(16, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(1, activation='softmax'))

from keras.optimizers import SGD
opt = SGD(lr=0.01)
model.compile(loss = "binary_crossentropy", optimizer = opt, metrics=['accuracy'])
print(model.summary())

model.fit(X, y, batch_size = 16, epochs = 5, validation_split=.25)

【问题讨论】:

  • 你能用一些东西更新你的问题吗?一,运行 15 个 epoch 并发布输出,而不是 3 个 epoch。其次,你能发布 X 和 y 的样子吗?
  • 发生这种情况是因为您使用带有一个神经元的 softmax,这会产生恒定的输出,这里有数百个问题与相同的问题。只需将激活更改为 sigmoid。

标签: python machine-learning keras deep-learning conv-neural-network


【解决方案1】:

因为你有 2 个类,所以将你的最后一层更改为 2 个神经元

model = Sequential() 
model.add(Convolution2D(32, (3,3),input_shape=(X.shape[1:]),activation='relu'))
model.add(Convolution2D(32, (3,3),activation='relu'))
model.add(Convolution2D(32, (3,3),activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(16, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(2, activation='softmax'))

from keras.optimizers import SGD
opt = SGD(lr=0.01)
model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics=['accuracy'])
print(model.summary())

model.fit(X, y, batch_size = 16, epochs = 5, validation_split=.25)

【讨论】:

  • 对于二进制标签,您可以将 1 输出用于 0 或 1,或者您可以将 2 用于 one-hot 01 和 10,这取决于您的实现。这不是问题。也为了你的答案,你必须使用categorical_crossentropy for loss
猜你喜欢
  • 2020-11-06
  • 1970-01-01
  • 2019-12-17
  • 2020-06-09
  • 1970-01-01
  • 2023-03-16
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多