Machine learning 我的cnn准确度在增加一个功能后下降

Machine learning 我的cnn准确度在增加一个功能后下降,machine-learning,keras,neural-network,conv-neural-network,Machine Learning,Keras,Neural Network,Conv Neural Network,所以我制作了一个CNN,对两种鸟类进行分类,效果很好。在那之后,我试着再添加一种类型,但我得到了奇怪的结果。我已经在ai stack exchange上发布了这篇文章,但他们说最好在这里问一下,所以我提供了一个链接到这篇文章 以下是型号代码: import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Acti

所以我制作了一个CNN,对两种鸟类进行分类,效果很好。在那之后,我试着再添加一种类型,但我得到了奇怪的结果。我已经在ai stack exchange上发布了这篇文章,但他们说最好在这里问一下,所以我提供了一个链接到这篇文章

以下是型号代码:

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?
由于我是这方面的初学者,我不知道什么样的验证真正有效,但我看到验证图在我遇到问题的第一次培训中保持不变


你试着将三种鸟分为乙状结肠。Sigmoid适合于二元分类。试试softmax激活层,看看效果如何。我建议更换

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

其中3是要分类的鸟类类型的数量

看看这里,这是一个很好的使用softmax作为多类分类激活层的教程


即使很难,它的精确度最高可达%75,但无法正确预测我展示的图片。获得最大%30-%40的准确度,如果我使用较低的历元,如10,它会随着时间的推移变得更糟,但不会提高准确度。但如果我给它10分左右,它会变好而不会变差。我不明白为什么?为什么当它有70%的准确度时仍然很糟糕,我只记得我们仍然在使用二进制交叉熵,我想我需要将它分类,因为最后一个密集层的输入数组被缩小到(1,0)的形状,但因为我们有3个节点,所以它需要(3,)大小的数组。所以我找不到为什么我的数组缩小到1个大小。在试图解决形状问题时,我遇到了稀疏的交叉熵,它与3节点softmax一起使用,工作和训练都很好,但它提供了一个热输出数组,所以我在网络中查找,它说你需要使用正则化。行吗?还是固定形状并使用正常的分类更有意义?
model.add(Dense(3, activation='softmax'))