我正在尝试构建简单的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)
答案 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'))
更多尝试:
1e-4
或1e-5
那样降低您的学习速度,请尝试不同的batch_size,..