【问题标题】:Neural Network with Softmax Output具有 Softmax 输出的神经网络
【发布时间】:2018-02-28 10:48:15
【问题描述】:

我目前正在学习多层感知的编码。对于这个 MLP,我尝试使用逻辑 sigmoidal 作为隐藏层,使用 Softmax 作为输出,并假设两个类标签。

import theano
from theano import tensor as T
import numpy as np
import matplotlib.pyplot as plt


alpha = 0.1
#Alpha value
alpha = 2*alpha/2
no_iters = 1 #Trying to get 1 iteration to work first.

#Weight matrix to hidden layer (2 input into 2 neuron)
w_h = np.array([ [1.0, 2.0],
              [-2.0, 0.0] ])

#Bias to hidden layer need ( 2 Hidden Layer neurons)
b_h = np.array([3.0, -1])

#Weight matrix to output layer (2 input into 1 neuron)
w_o = np.array([[1.0],
                [1.0]])

#Bias to output layer (Only 1 bias for one output neuron)
b_o = np.array([-2.0])

# X Input Array (No of data rows, No of inputs)
x = np.array([[1.0, 2.0],
              [-2.0, 3.0]])

#Desired Outputs(2 data row = 2 desired output (Rows))
d = np.array([[0.0],
             [1.0]])

#Assume 2 class labels for the 2 data rows
k = np.array([[1.0, 0.0],
             [0.0, 1.0]])

for iter in range(no_iters):
    #Hidden Layer Functions
    s = np.dot(x,w_h)+ b_h
    z = 1.0/(1 + np.exp(-s))


    #Output Layer Functions (Softmax)
    u = np.dot(z, w_o)+b_o
    u_max = np.max(u, axis=1, keepdims=True)
    p = np.exp(u-u_max)/np.sum(np.exp(u-u_max), axis=1, keepdims=True)
    y = np.argmax(p, axis=1)

    #SoftMax Delta O
    delta_o = k - p

    #Delta for input layer (DZ = differentiation of function)
    dz = z*(1-z)
    delta_h = np.dot(delta_o, np.transpose(w_o))*dz

    #Assign new weight and bias to output layer
    dw = -np.dot(np.transpose(z),delta_o)
    db = -np.sum(delta_o, axis=0)
    w_o = w_o - dw * alpha
    b_o = b_o - db * alpha

    #Assign new weight and bias to hidden layer
    w_h = w_h + alpha*np.dot(np.transpose(x), delta_h)
    b_h = b_h + alpha*np.sum(np.transpose(delta_h), axis=1)

    print(z)
    print(y)

执行代码时,delta_h = np.dot(delta_o, np.transpose(w_o))*dz 的矩阵点积会出现问题。由于 delta_o 是 2x2 矩阵,而 transpose(w_o) 是 1x2 矩阵。

我是否使用了错误的公式来解决这个问题?

【问题讨论】:

  • 您是否应该使用w_o 而不是np.transpose(w_o)?它不会给出错误,但我不确定结果是否如您所料。不过,它看起来对我来说是正确的。
  • @norok2 我用 'delta_h = np.dot(delta_o, np.transpose(w_o))*dz' 来计算我的 delta_h 所以我肯定转置了我的 w_o。除非我错误地声明了我的 w_o。通常,我尝试使用具有 2 个神经元的隐藏层和输出 softmax 层的 3 层前馈网络进行简单分类。所需的输出在“d”中,所需的类输出在“k”中。
  • 这就是我的意思,在delta_h = np.dot(delta_o, np.transpose(w_o))*dz 中用w_o 替换np.transpose(w_o) 应该可以修复代码,我尝试了几次迭代,它似乎对我有用。
  • @norok2 wow 确实修复了它。但是会影响计算吗?我还在学习,所以我不确定改变这样的公式是否会影响任何事情。正如我发现的公式,它们在计算 delta_h 时转置了 w_o。
  • 转置是为了确保矩阵乘法有效,也许您尝试转录的公式与您的定义有一些小的不一致,例如如果您想保持delta_h = ... 行不变,您也可以将w_o 的定义和w_o 的用法转置在u = np.dot(z, w_o)+b_o 中。在不知道您的来源的情况下很难找到确切的问题所在,但作为一般原则,矩阵乘法维度必须一致;-)

标签: python numpy machine-learning neural-network softmax


【解决方案1】:

你不能将两个不同大小的张量相乘。你可以做的是你可以得到你得到的误差向量的平均值,并在权重中进行元素修改。这不会影响性能,会解决我希望的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2015-02-23
    • 2020-03-15
    • 2018-05-02
    • 2014-04-13
    • 2017-11-16
    相关资源
    最近更新 更多