Моя точность cnn снижается после добавления еще одной функции - PullRequest
1 голос
/ 25 марта 2019

Итак, я сделал CNN, который классифицирует два типа птиц, и он работал нормально.После этого я попытался добавить еще один тип, но получил странные результаты.Я уже разместил это на бирже стека, но они сказали, что лучше спросить здесь, поэтому я предоставляю ссылку на этот пост.

https://ai.stackexchange.com/q/11444/23452

Вот код модели:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
import pickle
import time as time

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

pickle_in = open("C:/Users/Recep/Desktop/programlar/python/X.pickle","rb")
X = pickle.load(pickle_in)
pickle_in = open("C:/Users/Recep/Desktop/programlar/python/Y.pickle","rb")
Y = pickle.load(pickle_in)

X = X/255.0

node_size = 64

model_name = "agi_vs_golden-{}".format(time.time())


tensorboard = TensorBoard(log_dir='C:/Users/Recep/Desktop/programlar/python/logs/{}'.format(model_name))
file_writer = tf.summary.FileWriter('C:/Users/Recep/Desktop/programlar/python/logs/{}'.format(model_name, sess.graph))


model = Sequential()
model.add(Conv2D(node_size,(3,3),input_shape = X.shape[1:]))
#idk what that shape does except that and validation i have no problem 
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(node_size,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())

model.add(Dense(node_size))
model.add(Activation("relu"))

model.add(Dense(1))
model.add(Activation("sigmoid"))

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

model.fit(X,Y,batch_size=25,epochs=8,validation_split=0.1,callbacks=[tensorboard])
# idk what the validation is and how its used but dont think it caused the problem

model.save("agi_vs_gouldian.model")

Кстати, как я уже сказал в комментариях к моему оригинальному сообщению, я думаю, что, возможно, не хватает обучения сети, или у меня недостаточно данных.Поэтому я попытался увеличить количество эпох.Это вроде как проблема, но часть, которая меня интересует, это то, что случилось, когда у меня были более низкие эпохи?
Кто-нибудь может мне помочь?
Я даю приведенные ниже графики тензорных досок.
Кстати,мой массив данных rgb?
И как я могу избавиться от этого локального максимума% 70?
И поскольку я новичок в этом, я не знаю, что проверка действительно работает, но я видел, чтоГрафики валидации остаются теми же в первом обучении, с которым у меня были проблемы.

bach graphs epoch graphs validation graphs

1 Ответ

2 голосов
/ 25 марта 2019

Вы пытаетесь классифицировать трех птиц с сигмоидом.Сигмоид хорош для бинарной классификации.Попробуйте активационный слой softmax и посмотрите, как он работает.Я предлагаю заменить

model.add(Dense(1))
model.add(Activation("sigmoid"))

на

model.add(Dense(3, activation='softmax'))

Где 3 - это количество птиц, которое вы хотите классифицировать.

Посмотрите здесь, очень хорошоруководство по использованию softmax в качестве слоя активации для многоклассовой классификации

https://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/

...