【问题标题】:Multinomial logistic softmax regression with SGD使用 SGD 的多项逻辑 softmax 回归
【发布时间】:2017-10-23 16:53:37
【问题描述】:

我正在尝试从头开始构建一个可以对 MNIST 图像(手写数字)进行分类的模型。该模型需要输出一个概率列表,表示输入图像是某个数字的可能性有多大。

这是我目前的代码:

from sklearn.datasets import load_digits
import numpy as np


def softmax(x):
    return np.exp(x) / np.sum(np.exp(x), axis=0)


digits = load_digits()

features = digits.data
targets = digits.target

train_count = int(0.8 * len(features))
train_x = features[: train_count]
train_y = targets[: train_count]

test_x = features[train_count:]
test_y = targets[train_count:]

bias = np.random.rand()
weights = np.random.rand(len(features[0]))
rate = 0.02

for i in range(1000):
    for i, sample in enumerate(train_x):

        prod = np.dot(sample, weights) - bias
        soft = softmax(prod)
        predicted = np.argmax(soft) + 1

        error = predicted - train_y[i]
        weights -= error * rate * sample
        bias -= rate * error
        # print(error)

我正在尝试构建模型,以便它使用随机梯度下降,但对于将什么传递给 softmax 函数我有点困惑。我知道它应该期望一个数字向量,但我习惯(在构建一个小型 NN 时)是模型应该产生一个数字,该数字被传递给一个激活函数,进而产生预测。在这里,我觉得我错过了一步,我不知道它是什么。

【问题讨论】:

    标签: python machine-learning neural-network logistic-regression gradient-descent


    【解决方案1】:

    在最简单的实现中,您的最后一层(就在 softmax 之前)确实应该输出一个 10 维向量,该向量将被 softmax 压缩到 [0, 1]。这意味着weights 应该是一个形状为[features, 10] 的矩阵,而bias 应该是一个[10] 向量。

    除此之外,您应该one-hot encode 您的train_y 标签,即将每个项目转换为[0, 0, ..., 1, ..., 0] 向量。因此train_y 的形状为[size, 10]

    看看logistic regression example - 它在 tensorflow 中,但模型可能与您的相似:它们使用 768 个特征(所有像素)、标签的 one-hot 编码和单个隐藏层。他们还使用小批量来加速学习。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多