准确性问题,永远不会改变千分之一的人工神经网络

时间:2019-06-07 06:02:56

标签: python-3.x keras neural-network data-science

我正在尝试构建简单的ANN,以了解如何使用两个距离方程式来判断两个图像是否相似。所以这是我如何设置东西。我创建了3张图像之间的距离(1,锚点,2个正样本,3个负样本),然后创建了两个不同的距离测量值。 1个使用ResNet功能,另一个使用生猪功能。然后,将两个距离测量值与两个图像路径以及正确的标签一起保存(0/1)0 =相同1 =不相同。

现在,我正在尝试构建我的ANN,以了解两个值之间的差异,并查看是否可以让我查看两个图像是否相似。但是当我训练ANN时没有任何反应。我认为有两种可能性。

1:我没有正确设置Ann。

2:根本没有连接。

请帮助我看看问题是什么

这是我的代码:

# Load the Pandas libraries with alias 'pd' 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
# fix random seed for reproducibility
np.random.seed(7)
import csv
data = pd.read_csv("encoding.csv")
print(data.columns)
X = data[['resnet', 'hog','label']]
x = X[['resnet', 'hog']]
y = X[['label']]

model = Sequential()
#get number of columns in training data
n_cols = x.shape[1]
#add model layers
model.add(Dense(16, activation='relu', input_shape=(n_cols,)))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation= 'softmax'))

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

model.fit(x, y, 
      epochs=30,
      batch_size=32,
     validation_split=0.10)

现在所做的就是一遍又一遍:

167/167 [==============================] - 0s 3ms/step - loss: 8.0189 - acc: 0.4970 - val_loss: 7.5517 - val_acc: 0.5263

这是我正在使用的csv文件:

编辑 因此,我对设置进行了一些更改,现在它的反弹精度高达73%。但是,然后反弹并结束于40%,这意味着什么? 这是新模型:

model = Sequential()
#get number of columns in training data
n_cols = x.shape[1]
model.add(Dense(256, activation='relu', input_shape=(n_cols,)))
model.add(BatchNormalization())
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(Dense(1, activation= 'sigmoid'))

#sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#model.compile(loss = "binary_crossentropy", optimizer = sgd, metrics=['accuracy'])
model.compile(loss = "binary_crossentropy", optimizer = 'rmsprop', metrics=['accuracy'])
#model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, 
          epochs=100,
          batch_size=64,
         validation_split=0.10)

2 个答案:

答案 0 :(得分:3)

这没有道理:

model.add(Dense(1, activation= 'softmax'))
由于标准化,带有一个神经元的Softmax将产生一个恒定值1.0。对于丢失binary_crossentropy的二进制分类,应该使用一个激活了sigmoid的神经元。

model.add(Dense(1, activation= 'sigmoid'))

答案 1 :(得分:1)

尝试两件事:

  • 首先增加网络的复杂性,这非常简单,添加更多的层/神经元以从数据中捕获更多信息
    从类似的东西开始,看看它是否会改变:
model.add(Dense(256, activation='relu', input_shape=(n_cols,)))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation= 'sigmoid'))
  • 第二,考虑添加更多的纪元,ANN可能收敛很长

更新

更多尝试:

  • 规范化和扩展数据
  • 数据集可能太小->您获得的数据越多,您的模型就会越好
  • 尝试“差异”超级参数,可能会像1e-41e-5那样降低您的学习速度,请尝试不同的batch_size,..
  • 添加更多正则化:尝试在每一层之间删除
相关问题