我试图在Haskell中实现一个神经网络架构,并在MNIST上使用它。

我在线性代数中使用hmatrix包。 我的训练框架是使用pipes包构建的。

我的代码编译并没有崩溃。但问题是,某些层大小(比如1000)、小批大小和学习率的组合会在计算中产生NaN值。经过一些检查,我看到非常小的值(1e-100的顺序)最终出现在激活中。但是,即使这种情况没有发生,培训仍然不起作用。它的损失和准确性都没有改善。

我检查了又检查了我的代码,我不知道问题的根源可能是什么。

下面是反向传播训练,它计算每一层的增量:

backward lf n (out,tar) das = do
    let δout = tr (derivate lf (tar, out)) -- dE/dy
        deltas = scanr (\(l, a') δ ->
                         let w = weights l
                         in (tr a') * (w <> δ)) δout (zip (tail $ toList n) das)
    return (deltas)

Lf是损失函数,n是网络(每一层的权重矩阵和偏置向量),out和tar是网络的实际输出和目标(期望)输出,das是每一层的激活导数。

在批处理模式下,out、tar是矩阵(行是输出向量),das是矩阵列表。

下面是实际的梯度计算:

  grad lf (n, (i,t)) = do
    -- Forward propagation: compute layers outputs and activation derivatives
    let (as, as') = unzip $ runLayers n i
        (out) = last as
    (ds) <- backward lf n (out, t) (init as') -- Compute deltas with backpropagation
    let r  = fromIntegral $ rows i -- Size of minibatch
    let gs = zipWith (\δ a -> tr (δ <> a)) ds (i:init as) -- Gradients for weights
    return $ GradBatch ((recip r .*) <$> gs, (recip r .*) <$> squeeze <$> ds)

这里,lf和n和上面一样,i是输入,t是目标输出(都是以批处理的形式,作为矩阵)。

通过对每一行求和,Squeeze将一个矩阵转换为一个向量。也就是说,ds是一个增量矩阵的列表,其中每一列都对应于小批中一行的增量。偏差的梯度是所有小批量中增量的平均值。g也是一样的,它对应于权重的梯度。

下面是实际的更新代码:

move lr (n, (i,t)) (GradBatch (gs, ds)) = do
    -- Update function
    let update = (\(FC w b af) g δ -> FC (w + (lr).*g) (b + (lr).*δ) af)
        n' = Network.fromList $ zipWith3 update (Network.toList n) gs ds
    return (n', (i,t))

Lr是学习率。FC是该层的构造函数,af是该层的激活函数。

梯度下降算法确保为学习率传递一个负值。梯度下降的实际代码只是一个围绕grad和move组合的循环,并带有参数化的停止条件。

最后,这是一个均方误差损失函数的代码:

mse :: (Floating a) => LossFunction a a
mse = let f (y,y') = let gamma = y'-y in gamma**2 / 2
          f' (y,y') = (y'-y)
      in  Evaluator f f'

Evaluator只是捆绑了一个损失函数及其导数(用于计算输出层的delta)。

其余的代码在GitHub: NeuralNetwork上。

所以,如果有人对这个问题有见解,或者只是检查一下我是否正确地实现了算法,我会很感激。

我开始使用Visual Studio Code,我试图将我的测试项目保存到GitHub,但Visual Studio Code总是要求我的GitHub凭据。

我已经在我的PC上安装了GitHub Desktop和Git。我已经跑了:

 git config --global credential.helper wincred

但是Visual Studio Code仍然在要求凭证。

我该如何解决这个问题?

下面是我的.gitconfig文件,位于用户配置文件文件夹中:

    [filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = ddieppa
[user]
    email = fake@live.com
[credential]
    helper = wincred

下面是弹出窗口要求凭据:

我在弹出窗口中输入了我的GitHub凭证,但仍然在Visual Studio Code中的Git输出窗口中得到这个错误:

remote: Anonymous access to ddieppa/LineOfBizApp.git denied.
fatal: Authentication failed for 'https://github.com/ddieppa/LineOfBizApp.git/'

给定一个一维下标数组:

a = array([1, 0, 3])

我想把它编码成一个2D数组:

b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])

我想添加一个新文件夹到我新创建的GitHub存储库,而不安装Git设置(Mac, Linux和Windows)。可以这样做吗?

当我在不同的系统/机器上工作时,我不能一直带着Git。我知道如何在github.com/[USER]/[REPO]上直接添加文件。我们也可以创建一个文件夹吗?

我有一个小开源库的分支,我正在github上工作。我希望通过maven让其他开发人员可以使用它,但我不想运行自己的Nexus服务器,而且因为它是一个分支,所以我不能轻松地将它部署到oss.sonatype.org。

我想做的是将它部署到github,以便其他人可以使用maven访问它。最好的方法是什么?

我正在为我的github项目写一个自述文件。md格式。有什么方法可以测试我的自述。Md文件在提交到github之前会是什么样子?

我正在为我的github项目写一个自述文件。md格式。有什么方法可以测试我的自述。Md文件在提交到github之前会是什么样子?

time模块可以使用从epoch开始的秒数初始化:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

是否有一种优雅的方法来初始化datetime。Datetime对象?

让我们假设在GitHub上有一个存储库someone/foobar,我把它分叉到me/foobar。

我如何从父库直接将新提交拉到我的fork,而不需要添加一个单独的远程并记得定期从那里拉?

目标是:

Git从父存储库中获取 Git推送把所有东西都送到我的叉子上

我在GitHub上有一个私人存储库,我想让它公开。但是,一些初始提交包含我不想公开的信息(硬编码的凭证等)。

在不包含部分或全部提交历史的情况下,使最近的提交公开(我真的不需要或不希望在公共存储库中保存以前的提交)的最简单方法是什么?