【发布时间】:2018-04-28 17:22:11
【问题描述】:
这是我在深度学习课程中对 Andrew NG 的神经网络之一的自定义扩展,我正在尝试为二进制分类而不是生成 0 或 1 对多个示例进行分类。
输入和输出都是热编码的。
没有太多的训练,我得到了'train accuracy: 67.51658067499625 %'的准确率
如何分类单个训练示例而不是分类所有训练示例?
我认为我的实现中存在一个错误,因为该网络的问题是训练示例 (train_set_x) 和输出值 (train_set_y) 都需要具有相同的维度或收到与矩阵维度相关的错误。 例如使用:
train_set_x = np.array([
[1,1,1,1],[0,1,1,1],[0,0,1,1]
])
train_set_y = np.array([
[1,1,1],[1,1,0],[1,1,1]
])
返回错误:
ValueError Traceback (most recent call last)
<ipython-input-11-0d356e8d66f3> in <module>()
27 print(A)
28
---> 29 np.multiply(train_set_y,A)
30
31 def initialize_with_zeros(numberOfTrainingExamples):
ValueError: 操作数不能与形状一起广播 (3,3) (1,4)
网络代码:
import numpy as np
import matplotlib.pyplot as plt
import h5py
import scipy
from scipy import ndimage
import pandas as pd
%matplotlib inline
train_set_x = np.array([
[1,1,1,1],[0,1,1,1],[0,0,1,1]
])
train_set_y = np.array([
[1,1,1,0],[1,1,0,0],[1,1,1,1]
])
numberOfFeatures = 4
numberOfTrainingExamples = 3
def sigmoid(z):
s = 1 / (1 + np.exp(-z))
return s
w = np.zeros((numberOfTrainingExamples , 1))
b = 0
A = sigmoid(np.dot(w.T , train_set_x))
print(A)
np.multiply(train_set_y,A)
def initialize_with_zeros(numberOfTrainingExamples):
w = np.zeros((numberOfTrainingExamples , 1))
b = 0
return w, b
def propagate(w, b, X, Y):
m = X.shape[1]
A = sigmoid(np.dot(w.T , X) + b)
cost = -(1/m)*np.sum(np.multiply(Y,np.log(A)) + np.multiply((1-Y),np.log(1-A)), axis=1)
dw = ( 1 / m ) * np.dot( X, ( A - Y ).T ) # consumes ( A - Y )
db = ( 1 / m ) * np.sum( A - Y ) # consumes ( A - Y ) again
# cost = np.squeeze(cost)
grads = {"dw": dw,
"db": db}
return grads, cost
def optimize(w, b, X, Y, num_iterations, learning_rate, print_cost = True):
costs = []
for i in range(num_iterations):
grads, cost = propagate(w, b, X, Y)
dw = grads["dw"]
db = grads["db"]
w = w - (learning_rate * dw)
b = b - (learning_rate * db)
if i % 100 == 0:
costs.append(cost)
if print_cost and i % 10000 == 0:
print(cost)
params = {"w": w,
"b": b}
grads = {"dw": dw,
"db": db}
return params, grads, costs
def model(X_train, Y_train, num_iterations, learning_rate = 0.5, print_cost = False):
w, b = initialize_with_zeros(numberOfTrainingExamples)
parameters, grads, costs = optimize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost = True)
w = parameters["w"]
b = parameters["b"]
Y_prediction_train = sigmoid(np.dot(w.T , X_train) + b)
print("train accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))
model(train_set_x, train_set_y, num_iterations = 20000, learning_rate = 0.0001, print_cost = True)
更新:此实现中存在一个错误,即训练示例对 (train_set_x , train_set_y) 必须包含相同的维度。可以指出线性代数应该如何修改的方向吗?
更新 2:
我修改了@Paul Panzer 的答案,使学习率为 0.001 并且 train_set_x 和 train_set_y 对是唯一的:
train_set_x = np.array([
[1,1,1,1,1],[0,1,1,1,1],[0,0,1,1,0],[0,0,1,0,1]
])
train_set_y = np.array([
[1,0,0],[0,0,1],[0,1,0],[1,0,1]
])
grads = model(train_set_x, train_set_y, num_iterations = 20000, learning_rate = 0.001, print_cost = True)
# To classify single training example :
print(sigmoid(dw @ [0,0,1,1,0] + db))
此更新产生以下输出:
-2.09657359028
-3.94918577439
[[ 0.74043089 0.32851512 0.14776077 0.77970162]
[ 0.04810012 0.08033521 0.72846174 0.1063849 ]
[ 0.25956911 0.67148488 0.22029838 0.85223923]]
[[1 0 0 1]
[0 0 1 0]
[0 1 0 1]]
train accuracy: 79.84462279013312 %
[[ 0.51309252 0.48853845 0.50945862]
[ 0.5110232 0.48646923 0.50738869]
[ 0.51354109 0.48898712 0.50990734]]
print(sigmoid(dw @ [0,0,1,1,0] + db)) 是否应该生成一个经过四舍五入后匹配 train_set_y 对应值的向量:[0,1,0]?
修改以产生一个向量(将[0,0,1,1,0]添加到numpy数组并进行转置):
print(sigmoid(dw @ np.array([[0,0,1,1,0]]).T + db))
返回:
array([[ 0.51309252],
[ 0.48646923],
[ 0.50990734]])
同样,当需要[0,1,0] 时,将这些值四舍五入到最接近的整数会生成向量[1,0,1]。
这些是为单个训练示例生成预测的错误操作?
【问题讨论】:
标签: python numpy tensorflow neural-network linear-algebra