Проблема с точностью, никогда не меняющей ANN в Креас - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь построить простой ANN, чтобы узнать, как определить, похожи ли эти два изображения или нет, используя два уравнения расстояния. Итак, вот как я все устроил. Я создал расстояние между 3 изображениями (1, якорь, 2 положительный образец, 3 отрицательный образец), а затем создал два разных измерения расстояния. 1 с использованием функций ResNet, а другой с использованием функций свиней Затем два измерения расстояния сохраняются с двумя путями изображения, а также с правильной меткой (0/1) 0 = одинаковые 1 = не одинаковые.

Теперь я пытаюсь построить свой ANN, чтобы узнать разницу между двумя значениями и посмотреть, позволит ли это мне увидеть, если два изображения похожи. Но ничего не происходит, когда я тренирую ANN. Я думаю, что есть две возможности.

1: я неправильно настроил Энн.

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, который я использую:

EDIT Таким образом, я немного изменил настройку, и теперь она показывает точность до 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 ]

3 голосов
/ 07 июня 2019

Это не имеет смысла:

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

Softmax с одним нейроном даст постоянное значение 1,0 из-за нормализации. Для двоичной классификации с потерей binary_crossentropy вы должны использовать один нейрон с активацией sigmoid.

model.add(Dense(1, activation= 'sigmoid'))
1 голос
/ 07 июня 2019

Две вещи, чтобы попробовать:

  • Сначала добавьте сложности в вашу сеть, это довольно просто, добавьте больше слоев / нейронов, чтобы получить больше информации из ваших данных
    Начните с чего-то подобного и посмотрите, изменит ли это что-то:
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-4 или 1e-5, попробуйте дифференциалы batch_size, ..
  • Добавить больше регуляризации: попробуйте выпадение между каждым слоем
...