机器学习 Softmax classifier (一个隐含层)

程序实现 softmax classifier, 含有一个隐含层的情况。activation function 是 ReLU : f(x)=max(0,x)
f1=w1x+b1

h1=max(0,f1)

f2=w2h1+b2

y=ef2ijef2j


function Out=Softmax_Classifier_1(train_x,  train_y, opts)

% setting learning parameters
step_size=opts.step_size;
reg=opts.reg;
batchsize = opts.batchsize;
numepochs = opts.numepochs;
K=opts.class;
h=opts.hidden;

D=size(train_x, 2);
W1=0.01*randn(D,h);
b1=zeros(1,h);
W2=0.01*randn(h, K);
b2=zeros(1,K);


loss(1 : numepochs)=0;

num_examples=size(train_x, 1);
numbatches = num_examples / batchsize;

for epoch=1:numepochs

    kk = randperm(num_examples);
    loss(epoch)=0;

    % %      tic;
    % %
    % %       sprintf('epoch %d:  \n' , epoch)


    for bat=1:numbatches

        batch_x = train_x(kk((bat - 1) * batchsize + 1 : bat * batchsize), :);
        batch_y = train_y(kk((bat - 1) * batchsize + 1 : bat * batchsize), :);

        %% forward
        f1=batch_x*W1+repmat(b1, batchsize, 1);
        hiddenval_1=max(0, f1);
        scores=hiddenval_1*W2+repmat(b2, batchsize, 1);

        %% the loss
        exp_scores=exp(scores);
        dd=repmat(sum(exp_scores, 2), 1, K);
        probs=exp_scores./dd;
        correct_logprobs=-log(sum(probs.*batch_y, 2));
        data_loss=sum(correct_logprobs)/batchsize;
        reg_loss=0.5*reg*sum(sum(W1.*W1))+0.5*reg*sum(sum(W2.*W2));
        loss(epoch) =loss(epoch)+ data_loss + reg_loss;

        %% back propagation
        dscores = probs-batch_y;
        dscores=dscores/batchsize;
        dW2=hiddenval_1'*dscores;
        db2=sum(dscores);

        dhiddenval_1=dscores*W2';
        mask=max(sign(hiddenval_1), 0);
        df_1=dhiddenval_1.*mask;
        dW1=batch_x'*df_1;
        db1=sum(df_1);

        %% update
        dW2=dW2+reg*W2;
        dW1=dW1+reg*W1;

        W1=W1-step_size*dW1;
        b1=b1-step_size*db1;

        W2=W2-step_size*dW2;
        b2=b2-step_size*db2;

    end

    loss(epoch)=loss(epoch)/numbatches;

    if (mod(epoch, 10)==0)
        sprintf('epoch: %d, training loss is  %f:  \n', epoch, loss(epoch))
    end

    toc;

end

Out.W1=W1;
Out.b1=b1;
Out.b2=b2;
Out.W2=W2;
Out.loss=loss;

end

### Softmax分类器理论与实现 Softmax分类器是一种广泛应用于多类分类问题中的模型,其核心思想是通过概率分布来表示不同类别的可能性。以下是关于Softmax分类器的理论基础以及其实现方式。 #### 背景知识 Softmax函数可以看作是一个广义化的Sigmoid函数,适用于多类分类场景。它将输入向量转换为一个概率分布形式的输出向量,其中每个元素代表对应类别的预测概率[^1]。具体来说,对于输入 \( z \)Softmax函数定义如下: \[ P(y=i | x) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \] 这里 \( K \) 表示类别总数,\( P(y=i|x) \) 是样本属于第 \( i \) 类的概率。 #### 数学原理 Softmax分类器的目标是最小化交叉熵损失函数 (Cross-Entropy Loss Function),该函数衡量了真实标签分布和预测分布之间的差异。假设我们有一个大小为 \( m \) 的训练集,则总损失可写成: \[ L = -\frac{1}{m}\sum_{i=1}^{m} \log(P(y^{(i)}|x^{(i)})) \] 这里的 \( y^{(i)} \) 和 \( x^{(i)} \) 分别表示第 \( i \) 个样本的真实标签及其特征向量[^2]。 #### 实现细节 下面展示了一个简单的Python实现例子,利用NumPy库完成Softmax分类器的核心功能。 ```python import numpy as np def softmax(z): """Compute the softmax function.""" exp_z = np.exp(z - np.max(z, axis=-1, keepdims=True)) # 防止数值溢出 return exp_z / np.sum(exp_z, axis=-1, keepdims=True) def cross_entropy_loss(X, W, Y_true): """ Compute the loss and gradient for softmax classification. Parameters: X: Input data of shape (N, D), where N is number of samples and D is dimensionality. W: Weights matrix of shape (D, C). Y_true: Ground truth labels encoded in one-hot form with shape (N, C). Returns: Tuple containing loss value and gradients w.r.t weights. """ scores = X.dot(W) probs = softmax(scores) log_probs = -np.log(probs[np.arange(len(Y_true)), Y_true.argmax(axis=1)] + 1e-8) loss = np.mean(log_probs) dscores = probs.copy() dscores[np.arange(len(Y_true)), Y_true.argmax(axis=1)] -= 1 dW = X.T.dot(dscores) / len(Y_true) return loss, dW ``` 上述代码片段实现了Softmax函数计算及基于梯度下降法更新权重矩阵的过程[^3]。 #### 训练过程概述 为了优化参数并最小化损失函数,在实际应用中通常采用随机梯度下降算法或其他更先进的优化方法(如Adam)。每次迭代过程中调整权值使得预测更加接近真实的标注情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值