【问题标题】:Neural Network under fitting - breast cancer dataset拟合下的神经网络 - 乳腺癌数据集
【发布时间】:2019-02-20 19:59:43
【问题描述】:

我正在尝试为乳腺癌数据集的二元分类创建一个神经网络:

https://www.kaggle.com/uciml/breast-cancer-wisconsin-data

我的神经网络由 3 层组成(不包括输入层):

第一层:6 个具有 tanh 激活的神经元。

第二层:6 个具有 tanh 激活的神经元。

最后一层:1 个具有 sigmoid 激活的神经元。

不幸的是,我在训练示例中的准确率只有 44% 左右,在测试示例中只有 23% 左右。

这是我的python代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv("data.csv")
data = data.drop(['id'], axis = 1)
data = data.drop(data.columns[31], axis = 1)
data = data.replace({'M': 1, 'B': 0})

X = data
X = X.drop(['diagnosis'], axis = 1)
X = np.array(X)

X_mean = np.mean(X, axis = 1, keepdims = True)
X_std = np.std(X, axis = 1, keepdims = True)
X_n = (X - X_mean) / X_std
y = np.array(data['diagnosis'])
y = y.reshape(569, 1)
m = 378
y_train = y[:m, :]
y_test = y[m:, :]

X_train = X_n[:m, :]
X_test = X_n[m:, :]

def sigmoid(z):
  return 1 / (1 + np.exp(-z))

def dsigmoid(z):
  return np.multiply(z, (1 - z))

def tanh(z):
  return (np.exp(z) - np.exp(-z)) / (np.exp(z) + np.exp(-z))

def dtanh(z):
  return 1 - np.square(tanh(z))

def cost(A, Y):
  m = Y.shape[0]
  return -(1.0/m) *np.sum( np.dot(Y.T, np.log(A)) + np.dot((1 - Y).T, np.log(1-A)))

def train(X, y ,model, epocs, a):
  W1 = model['W1']
  W2 = model['W2']
  W3 = model['W3']

  b1 = model['b1']
  b2 = model['b2']
  b3 = model['b3']

  costs = []

  for i in range(epocs):

    #forward propagation

    z1 = np.dot(X, W1) + b1
    a1 = tanh(z1)

    z2 = np.dot(a1, W2) + b2
    a2 = tanh(z2)

    z3 = np.dot(a2, W3) + b3
    a3 = sigmoid(z3)

    costs.append(cost(a3, y))

    #back propagation

    dz3 = z3 - y
    d3 = np.multiply(dz3, dsigmoid(z3))
    dW3 = np.dot(a2.T, d3)
    db3 = np.sum(d3, axis = 0, keepdims=True)

    d2 = np.multiply(np.dot(d3, W3.T),  dtanh(z2))
    dW2 = np.dot(a1.T, d2)
    db2 = np.sum(d2, axis = 0, keepdims=True)

    d1 = np.multiply(np.dot(d2, W2.T), dtanh(z1))
    dW1 = np.dot(X.T, d1)
    db1 = np.sum(d1, axis = 0, keepdims=True)

    W1 -= (a / m) * dW1
    W2 -= (a / m) * dW2
    W3 -= (a / m) * dW3

    b1 -= (a / m) * db1
    b2 -= (a / m) * db2
    b3 -= (a / m) * db3

  cache = {'W1': W1, 'W2': W2, 'W3': W3, 'b1': b1, 'b2': b2, 'b3': b3}
  return cache, costs

np.random.seed(0)

model = {'W1': np.random.rand(30, 6) * 0.01, 'W2': np.random.rand(6, 6) * 0.01, 'W3': np.random.rand(6, 1) * 0.01, 'b1': np.random.rand(1, 6), 'b2': np.random.rand(1, 6), 'b3': np.random.rand(1, 1)}

model, costss = train(X_train, y_train, model, 1000, 0.1)

plt.plot([i for i in range(1000)], costss)
print(costss[999])
plt.show()



def predict(X,y ,model):
  W1 = model['W1']
  W2 = model['W2']
  W3 = model['W3']

  b1 = model['b1']
  b2 = model['b2']
  b3 = model['b3']

  z1 = np.dot(X, W1) + b1
  a1 = tanh(z1)

  z2 = np.dot(a1, W2) + b2
  a2 = tanh(z2)

  z3 = np.dot(a2, W3) + b3
  a3 = sigmoid(z3)

  m = a3.shape[0]
  y_predict = np.zeros((m, 1))

  for i in range(m):
    y_predict = 1 if a3[i, 0] > 0.5 else 0
  return y_predict

感谢您的帮助:)

【问题讨论】:

  • 当您更好地理解深度学习的理论工作原理时,它真的很有帮助。它将帮助您更轻松地识别错误。在这种情况下,@abcdaire 的回答指出了需要纠正的多个问题,这表明可能缺乏对概念的理解。除非您急于运行此代码,否则我建议您通过学习课程或阅读书籍来强化您的深度学习概念。

标签: python machine-learning neural-network deep-learning classification


【解决方案1】:

我认为你的反向传播存在问题(我做了一个快速测试并在 Tensorflow 上试用了你的模型,它在训练和测试数据上的准确率都达到了 92% 左右)。

我对您的代码做了以下修改:

dz3 = a3 - y

d3 = np.multiply(dz3, dsigmoid(a3))

此外,您的函数 predict 只返回一个数字,而它应该返回与示例一样多的数字,而不是

y_predict = np.zeros((m, 1)) for i in range(m): y_predict = 1 if a3[i, 0] > 0.5 else 0 return y_predict

我把这部分改成

y_predict[a3[:,0] > 0.5] = 1 return y_predict

我进行了 2000 个 epoch 的训练并将学习率提高到 1 (a=1)

【讨论】:

  • 您好,感谢您的快速回复!事实上,dz3 的错误是一个错字。不幸的是,我不明白您为什么将 dsigmoid 从 z3 更改为 a3,就我了解反向传播的地方而言,它说它应该是 g'(z3) 而不是 g'(a3):neuralnetworksanddeeplearning.com/chap2.html,谢谢 :)
  • 您好,因为您的def dsigmoid(z),我更改了它,您有两个选择,您就这样离开它,就像我一样,您输入 sigmoid(z3)(例如 a3)而不是 z3,或者如果您想让它与你写 sigmoid(z) wrt 到 z 的真正导数的其余部分一致:def dsigmoid(z): np.multiply(sigmoid(z), (1-sigmoid(z))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2021-07-07
  • 2018-12-09
相关资源
最近更新 更多