java写卷积神经网络---CupCnn简介

前言

在机器学习中,卷积神经网络是一种深度前馈人工神经网络,已成功地应用于图像识别。目前,很多的车牌识号识别,人脸识别等都采用卷积神经网络,可以说卷积神经网络在图像识别方面取得了巨大的成功。当前开源的深度学习框架有很多了,比如caffe,tensorflow,torch等,这些深度学习框架包含了完善的卷积神经网络的实现,那么,为什么我们还要自己写卷积神经网络?直接用这些开源的深度学习框架多好,又快又省事,性能好稳定,bug少。是的,如果你只是使用卷积神经网络做一些应用,并不在意它的工作原理,那你大可不必自己费神费力的写卷积神经网络,可如果你想完全掌握卷积神经网络的工作原理,古人云:纸上得来终觉浅,觉知此时要躬行。所以,你很有必要自己实现一遍卷积神经网络,从而加深对它的认识。

什么是CupCnn

CupCnn是个用java写的卷积神经网络,我在工作之余,为了加深对卷积神经网络的认识,实现了它。它足够简洁,表现也不错,非常适合初学者参考使用。它的源码可以从github下载:
CupCnn
你不用担心它的协议什么的限制,您可以用它来做任何事,任意修改它,如果它能对你有所帮助,希望能给个星星!!!
---

设计的思路

我希望它是以足够简单的神经网络,这样有利于初学者学习。所以我没有实现那些并发加速的东西,这保证的代码的简介性。设计的时候,我将卷积神经网络分为四个模块:Network(layer blob loss active),这点可以从包名中看出来。layer,loss,active都有一个基类,整个神经网络的编程都是面向基类的。Network是综合这四个模块,统筹和调度资源的中心,每个layer都会有一个Network的实例,这样可以轻松的通过Network获得各种数据,比如获取每一层的输出,diff等。
设计框图如下:
这里写图片描述

参数的保存对于java而言就非常简单了,实现Serializable接口就可以快速实现参数的序列化和反序列化。CupCnn只对data目录下的Blob和BlobParams两个实现了Serializable接口,所有的参数都由这两个实现。

目前的表现

全连接神经网络

目前,在mnist数据集上,全连接神经网络

  • 20
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
是的,Java 也可以用来实现卷积神经网络。在 Java 中,常用的深度学习框架包括 Deeplearning4j、TensorFlow Java 和 Keras Java 等。这里以 Deeplearning4j 为例,演示如何使用 Java 实现基于卷积神经网络的图像分类。 首先,我们需要定义一个数据集,这里使用 MNIST 手数字数据集: ``` // 加载 MNIST 手数字数据集 DataSetIterator trainData = new MnistDataSetIterator(batchSize, true, 12345); DataSetIterator testData = new MnistDataSetIterator(batchSize, false, 12345); ``` 接下来,我们定义一个卷积神经网络模型: ``` // 定义卷积神经网络模型 MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .weightInit(WeightInit.XAVIER) .updater(new Nesterovs(0.005, 0.9)) .list() .layer(new ConvolutionLayer.Builder(5, 5) .nIn(1) .stride(1, 1) .nOut(20) .activation(Activation.IDENTITY) .build()) .layer(new SubsamplingLayer.Builder(PoolingType.MAX) .kernelSize(2, 2) .stride(2, 2) .build()) .layer(new ConvolutionLayer.Builder(5, 5) .stride(1, 1) .nOut(50) .activation(Activation.IDENTITY) .build()) .layer(new SubsamplingLayer.Builder(PoolingType.MAX) .kernelSize(2, 2) .stride(2, 2) .build()) .layer(new DenseLayer.Builder().activation(Activation.RELU) .nOut(500).build()) .layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .nOut(outputNum) .activation(Activation.SOFTMAX) .build()) .setInputType(InputType.convolutionalFlat(28, 28, 1)) .build(); ``` 这个模型包含了两个卷积层、两个池化层和一个全连接层,最终输出 10 个类别的分类结果。 接着,我们使用模型对数据集进行训练和测试: ``` // 定义模型和训练参数 MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(new ScoreIterationListener(10)); // 训练模型 for (int i = 0; i < nEpochs; i++) { model.fit(trainData); trainData.reset(); } // 在测试集上评估模型 Evaluation eval = new Evaluation(outputNum); while (testData.hasNext()) { DataSet ds = testData.next(); INDArray output = model.output(ds.getFeatures()); eval.eval(ds.getLabels(), output); } System.out.println(eval.stats()); ``` 这个代码演示了如何使用 Deeplearning4j 框架在 Java 中实现卷积神经网络模型,以及如何使用 MNIST 手数字数据集进行训练和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值