深度神经网络从零开始,准确性停滞不前



与tensorflow相比,我总是得到相同的精度,精度很差

首先,我为我糟糕的英语道歉。

代码如下:

y_temp= []
y_temp2 = []
for i in range(len(y_train)):
temp = ([y_train.iloc[i]])
y_temp.append(temp)
y = np.array((y_temp), dtype=np.float128)
for i in range(len(y_test)):
temp2= ([y_test.iloc[i]])
y_temp2.append(temp2)
y2 = np.array((y_temp2), dtype=np.float128)

def sigmoid(self, x):
t = t.astype(np.float128)
return 1/(1+np.exp(-t))
def sigmoid_derivative(self, x):
t = t.astype(np.float128)
return sigmoid(t) * (1-sigmoid(t))
def relu(t):
t = t.astype(np.float128)
return np.maximum(0, t)
def relu_derivative(t):
t = t.astype(np.float128)
t[t <= 0] = 0
t[t > 0] = 1
return t

class DeepNeuralNetwork:
def __init__(self, perceptron, x, y, hidden_layer, lr, bias):
np.random.seed(42)
self.hl = hidden_layer
self.weights = {}
self.input = x
self.perceptron_input = self.input.shape[1]
self.perceptron_output = 1
self.lr = lr
self.y = y
# inisialisasi weight for each neuron 
for i in range(hidden_layer): 
self.weights[i] = np.random.rand(self.perceptron_input,perceptron) * sqrt(2.0 / self.perceptron_input)  
self.weights[hidden_layer] = np.random.randn(perceptron, self.perceptron_output) * np.sqrt(1. / perceptron) 
self.y = y
self.output = np.zeros(y.shape)

#forward propagation
def forward_prop(self, hidden_layer):
self.layer = {}

self.layer[0] = relu(np.dot(self.input, self.weights[0])) 
for i in range(hidden_layer+1): 
if i != 0: 
#perhitungan activation function relu
self.layer[i] = relu(np.dot(self.layer[i-1], self.weights[i]))
if i == hidden_layer:
self.layer[i] = sigmoid(np.dot(self.layer[i-1], self.weights[i]))
return self.layer[i]

def backward_prop(self, hidden_layer):
dW = {}
E = {}
#backpropagation output layer
E[hidden_layer] = (self.y - self.output) * sigmoid_derivative(self.output)
self.layer[hidden_layer-1] = np.multiply(E[hidden_layer], np.int64(self.layer[hidden_layer]>0))
dW[hidden_layer] = np.dot(self.layer[hidden_layer-1].T, E[hidden_layer]) #turunan dari weight
for i in reversed(range(hidden_layer)): 
if i != 0:
E[i] = np.dot(E[i+1], self.weights[i+1].T) * relu_derivative(self.layer[i])
self.layer[i] = np.multiply(E[i], np.int64(self.layer[i]>0))
dW[i] = np.dot(self.layer[i-1].T,E[i])
if i == 0:
E[0]= np.dot(E[1], self.weights[1].T) * relu_derivative(self.layer[0])
self.layer[i] = np.multiply(E[i], np.int64(self.layer[i]>0))
dW[0] = np.dot(self.input.T, E[0])
for i in range(hidden_layer+1):
self.weights[i] += self.lr * dW[i]  #lr

def train(self, epoch):
for i in range(epoch):
self.output = self.forward_prop(self.hl) 
self.backward_prop(self.hl)
self.hitung_akurasi(self.input, self.y)

def hitung_akurasi(self, X, y):
predictions = []
counter = 0
for i in range(len(y)): #loop
if self.output[i] >= 0.5: #if output greaterthan 0.5
prediksi = 1 
else:
prediksi = 0
predictions.append(prediksi)

if predictions[i] == y[i]:
counter = counter+1
akurasi = (counter/len(y)) * 100    
cm = confusion_matrix(predictions, y)
true_positive = cm[1,1]
true_negative = cm[0,0]
false_positive = cm[0,1]
false_negative = cm[1,0]
print('Accuracy: '+ str(akurasi))

hl = 4
epoch = 50
lr = 0.01
nn = DeepNeuralNetwork(6, x_train_scaled, y, hl, lr, 0)
nn.train(epoch)

我得到如下输出:

Output: Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 Accuracy: 50.00835414342936 ...........................

我总是得到相同的精度,直到最后一个epoch。如果我一开始有40%的准确率,直到最后准确率一直是40%,以此类推。我希望精确度根据它所运行的纪元而变化。

我尝试使用tensorflow,我得到了大约70%到79%的准确率。请帮我修复我的代码。这个代码是我本科毕业论文用的。

你可以试试:

你的backward_prop函数有一个问题。您正在使用np.int64(self.layer[hidden_layer]>0),这对于梯度计算是不正确的。你应该用激活函数的导数。替换:

自我。Layer [hidden_layer-1] = np。乘(E [hidden_layer], np.int64 (self.layer [hidden_layer]在0))

:

自我。Layer [hidden_layer-1] = np。乘(E [hidden_layer], sigmoid_derivative (self.layer [hidden_layer]))和替换:

:自我。Layer [i] = np。乘(E[我],np.int64 (self.layer[我]在0))

:自我。Layer [i] = np。乘(E[我],relu_derivative (self.layer[我]))

请记住,不能保证您的自定义模型的性能与TensorFlow模型一样好,因为有许多因素会影响模型的性能。

最新更新