Napisałem minimalny przykład prostej sieci neuronowej, która pasuje do danej funkcji (wielowarstwowy perceptron do regresji).

Podczas treningu strata maleje zgodnie z oczekiwaniami, a model działa dobrze. Jednak dokładność pozostaje stała i zawsze wynosi 0,0 i nie rozumiem dlaczego. Czego tu brakuje?

Myślę, że jest jakiś szczegół techniczny, który uniemożliwia aktualizację dokładności?

Proces uczenia i wynikowy model można zobaczyć pod tym linkiem

Bardzo dziękuję za wszelką pomoc! ;)

PS - Oto minimalny przykład odtworzenia tego wyniku:

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec

# Create TRAINING data
noise = 0.1
N=500
Xt = np.random.uniform(-np.pi, np.pi, size=(N,))
Yt = np.sin(Xt) + noise * np.random.uniform(-1,1,size=Xt.shape)
# Create VALIDATION data
Nv = int(0.1*N)
Xv = np.random.uniform(-np.pi, np.pi, size=(Nv,))
Yv = np.sin(Xv) + noise * np.random.uniform(-1,1,size=Xv.shape)

# Create model
model = Sequential()
model.add( Dense(10, activation='tanh',input_shape=(1,)) )
model.add( Dense(5, activation='tanh') )
model.add( Dense(1, activation=None) )

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

# Fit & evaluate
history = model.fit(Xt, Yt, validation_data=(Xv,Yv),
                            epochs=100,
                             verbose=2)

results = model.evaluate(Xv, Yv,verbose=0)
print('\n\nEvaluating model, loss/acc:', results)


## PLOTS
fig = plt.figure()
gs = gridspec.GridSpec(2, 2)
ax1 = plt.subplot(gs[0,0])              # losses
ax2 = plt.subplot(gs[1,0], sharex=ax1)  # accuracies
ax3 = plt.subplot(gs[:,1])              # data & model

# Plot learning curve
err = history.history['loss']
val_err = history.history['val_loss']
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
ax1.plot(err,label='loss')
ax1.plot(val_err,label='val_loss')
ax2.plot(acc,label='accuracy')
ax2.plot(val_acc,label='val_accuracy')
ax1.set_ylim(bottom=0)
ax2.set_ylim(bottom=-0.01)
ax1.legend()
ax2.legend()

# Plot test
# Generate "continous" data for pretty test
x = np.linspace(np.min(Xt),np.max(Xt),1000)
y = model.predict(x)

ax3.scatter(Xt, Yt, label='Training')
ax3.scatter(Xv, Yv, c='C2', label='Validation')
ax3.plot(x, y, 'C3-', lw=4, label='Model')
ax3.legend()

fig.tight_layout()
plt.show()
0
B4dWo1f 17 grudzień 2019, 22:58
1
„dokładność” ma znaczenie tylko w przypadku zadania klasyfikacyjnego, w którym cele są binarne. Twoje cele są ciągłe, a Twój model nigdy nie uzyskuje dokładnie wartości docelowej, więc ma dokładność 0.
 – 
Swier
17 grudzień 2019, 23:03

1 odpowiedź

Jak zauważył Świer w komentarzu, trafność ma na celu klasyfikację. Niemniej jednak pomyślałem, że niektóre punkty powinny dać dokładną wartość docelową, dlatego spodziewałem się acc> 0. W każdym razie odwzorowałem problem na problem tylko z liczbami całkowitymi iw tym scenariuszu dokładność jest różna od zera. Oczywiście nie jest to użyteczna miara, ale przynajmniej ma (matematyczny) sens. Dzięki!!

0
B4dWo1f 17 grudzień 2019, 23:40