{"id":24838975,"url":"https://github.com/monitor1379/hamaa","last_synced_at":"2025-10-10T00:44:32.344Z","repository":{"id":118275060,"uuid":"67903951","full_name":"monitor1379/hamaa","owner":"monitor1379","description":"Hamaa: a Simple and Naive Deep Learning library.","archived":false,"fork":false,"pushed_at":"2016-12-08T15:41:17.000Z","size":12362,"stargazers_count":51,"open_issues_count":1,"forks_count":11,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-06-01T20:00:22.468Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://hamaa.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monitor1379.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-11T01:44:37.000Z","updated_at":"2024-04-17T10:08:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"82ddafd3-1a7a-4f24-b667-9d71ce3306a2","html_url":"https://github.com/monitor1379/hamaa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/monitor1379/hamaa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fhamaa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fhamaa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fhamaa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fhamaa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monitor1379","download_url":"https://codeload.github.com/monitor1379/hamaa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fhamaa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002344,"owners_count":26083357,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-31T06:36:29.311Z","updated_at":"2025-10-10T00:44:32.333Z","avatar_url":"https://github.com/monitor1379.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\t\u003cimg width=300 src=\"https://rawgit.com/monitor1379/hamaa/dev/docs/images/hamaa-logo.svg\" /\u003e\n\u003c/p\u003e\n\n## Hamaa: a Simple and Naive Deep Learning library \n\n[![Documentation Status](https://readthedocs.org/projects/hamaa/badge/?version=latest)](http://hamaa.readthedocs.io/zh_CN/latest/?badge=latest) \n[![Build Status](https://travis-ci.org/monitor1379/hamaa.svg?branch=master)](https://travis-ci.org/monitor1379/hamaa)\n[![GitHub license](https://img.shields.io/badge/license-AGPL-blue.svg)](https://raw.githubusercontent.com/monitor1379/hamaa/master/LICENSE)\n[![codecov](https://codecov.io/gh/monitor1379/hamaa/branch/master/graph/badge.svg)](https://codecov.io/gh/monitor1379/hamaa)\n\n### What is Hamaa\n\n- Hamaa是一个构建于Python/NumPy之上的深度学习库，\n类[Keras](http://keras.io)的API以及模块化的设计使得用Hamaa来搭建神经网络就像搭建积木一样简单。\n- 之所以编写Hamaa，是因为作者在学习DL时发现，\n虽然网络上与DL相关的论文、教程与框架浩如烟海，\n但是这些要么全是数学公式、要么并没有教怎么去实现、要么为了提升速度牺牲了源代码的可读性，\n所以作者尝试着自己编写一个简单、朴素的深度学习库，写着写着就有了Hamaa。\n- 所以，Hamaa的出现**并不是为了取代(当然也没有这个能力去取代)工业界上常用的深度学习框架**\n(诸如\n[TensorFlow](https://www.tensorflow.org/)、\n[Theano](http://www.deeplearning.net/software/theano/)、\n[Caffe](http://caffe.berkeleyvision.org/)、\n[MXNet](http://mxnet.readthedocs.io/en/latest/)\n等等)；\n- 相反，Hamaa被创造的目的是**希望有一定深度学习基础的初学者能够通过使用、\n阅读Hamaa的源代码甚至去重现Hamaa来加深对神经网络/深度学习的理解**，\n以便更好地去使用上述几个工业级别的深度学习框架去解决实际问题（而不是成为一个调包/调参侠 :D）。\n\n---\n\n### The Design Philosophy of Hamaa\n\n\nHamaa始终遵循着`too SIMPLE and sometimes NAIVE`的原则来设计：\n- **每一个可配置项都抽象成简单的模块**。 具体地，网络层、损失函数、优化器、初始化器、激活函数都是独立\n的模块，能够通过自由组装的方式来搭建模型。\n- **所有模块都使用朴素的代码实现**。每一段源代码都希望能在第一次阅读时显得直观易懂，具有良好的可读性，\n并且不过分使用trick。\n\n\nHamaa尽管在速度优化上没有工业级别的深度学习框架要好，\n但Hamaa也具有以下优点:\n\n- **安装依赖少，无需配置**。如果你想要进行一些简单的快速实验，又不想花大量时间在搭建与配置环境上的话， \n那么基于Python的Hamaa可能是不错的选择。\n- **使用简单**。学会使用Hamaa搭建一个完整的神经网络并进行数据可视化仅需不到1分钟(可查看下面的Getting Started一节)。\n此外如果你熟悉[Keras](http://keras.io)的话将能更快地上手。\n- **源码易读**。朴素的设计模式、丰富的源码注释以及完备的设计文档能够让你深入理解Hamaa是如何将复杂的数学公式转化成实际的工程代码。\n- **扩展性强**。Hamaa支持通过实现接口的方式来自定义模块。\n\n更多链接：\n\n- Hamaa使用文档 : [hamaa.readthedocs.io](http://hamaa.readthedocs.io)。\n- Hamaa设计文档 : [完善中](FIXME)\n- Hamaa已支持的所有特性 : [DEVELOP.md](DEVELOP.md)\n- Hamaa的未来计划：[TODO.md](TODO.md)\n\n因本人水平有限，如有错误与不足之处诚请指出 :D (可在issues中提出)\n\n--- \n\n### Installation\n\n支持:\n- Windows、Linux\n- Python 2.x (后续将支持Python 3.x版本)\n\nHamaa使用了下述4个依赖库: \n\n```\nnumpy\u003e=1.9\nmatplotlib\u003e=1.5\nnose\u003e=1.3\nPillow\u003e=3.4\n```\n\n打开`shell`或者`cmd`，输入下述命令\n\n```\n# 下载源代码到本地\n\u003e\u003e git clone git@github.com:monitor1379/hamaa.git\n\n# 输入下述命令，依次进行安装依赖、编译Hamaa中的Python C扩展、安装Hamaa\n\u003e\u003e cd hamaa\n\u003e\u003e pip install -r requirements.txt\n\u003e\u003e python setup.py build_ext\n\u003e\u003e pip install .\n```\n\n--- \n\n### Getting started: 1 minutes to Hamaa\n\n在Hamaa中，一个神经网络模型被称为一个model，\n其中最基础的一种model叫做`Sequential`，即将网络层按序列依次堆叠而成。\n\n- 这是一个`Sequential`模型:\n```python\nfrom hamaa.models import Sequential\n\nmodel = Sequential()\n```\n\n- 添加网络层只需使用`add()`:\n```python\nfrom hamaa.layers import Dense, Activation\n\nmodel.add(Dense(input_dim=2, output_dim=4))\nmodel.add(Activation('sigmoid'))\nmodel.add(Dense(output_dim=2))\nmodel.add(Activation('softmax'))\n```\n\n- 设置模型的目标(损失)函数以及优化器:\n```python\nfrom hamaa.optimizers import SGD\n\nmodel.set_objective('categorical_crossentropy')\nmodel.set_optimizer(SGD(lr=0.01, momentum=0.9))\n```\n\n- 打印模型的详细信息:\n```python\nprint model.summary()\n```\n\n![print_model_summary](docs/images/README/print_model_summary.png)\n\n- 加载数据集（此处采用moons数据集，为两个半弧形组成）,并切分其中0.9作为训练集，剩下0.1作为验证集\n```python\nfrom hamaa.datasets import datasets\nfrom hamaa.utils.np_utils import split_training_data\n\nx, y = datasets.load_moons_data(nb_data=2000, noise=0.1)\ntraining_data, validation_data = split_training_data(data=(x, y), split_ratio=0.9)\n```\n\n- 接下来就可以开始训练模型:\n```python\nmodel.train(training_data=training_data,\n            nb_epochs=30,\n            mini_batch_size=100,\n            verbose=1,\n            validation_data=validation_data,\n            log_epoch=1)\n```\n\n训练信息如下图所示:\n![train](docs/images/README/train.png)\n\n如果每个epoch耗时比较长，还可以使用进度条功能:\n![train_gif](docs/images/README/train.gif)\n\n- 训练完之后评估模型的准确率:\n```python\nprint model.evaluate_accuracy(x, y) \n```\n\n- 如果你想直观地查看模型的训练/验证准确率与损失函数值随着训练周期的变化图，可以:\n```python\nmodel.plot_training_iteration()\n```\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg width=600 src=\"docs/images/README/epochs.png\" alt=\"epochs\" /\u003e\n\u003c/p\u003e\n\n\n- 最后，如果数据集是二维数据，那么还可以画出决策边界:\n\n```python\nmodel.plot_prediction(data=training_data)\n```\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg width=600 src=\"docs/images/README/prediction.png\" alt=\"prediction\" /\u003e\n\u003c/p\u003e\n\n---\n\n### Examples\n\n更多样例程序:\n\n#### examples/example1_or_nn.py\n\n使用Hama构建单层神经网络来解决或问题的一个简洁的例子。\n其中包含了创建、训练、测试一个神经网络必备的所有函数。\n\n```python\n\nfrom hamaa.datasets import datasets\nfrom hamaa.layers import Dense, Activation\nfrom hamaa.models import Sequential\nfrom hamaa.optimizers import SGD\n\n\n# 1. create a model\nmodel = Sequential()\n\n# 2. add a full connected layer to model\nmodel.add(Dense(input_dim=2, output_dim=2, init='uniform'))\n\n# 3. add a activation layer to model\nmodel.add(Activation('sigmoid'))\n\n# 4. use \"mean square error\" as the objective of model\nmodel.set_objective('mse')\n\n# 5. use \"stochastic gradient descent\" as the optimizerof model\nmodel.set_optimizer(SGD(lr=0.9, momentum=0.9, decay=1e-6))\n\n# 6. print the summary of model\nprint model.summary()\n\n# 7. load \"or\" data, note that the label \"y\" is one hot\n#    x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])\n#    y = np.array([[1, 0], [0, 1], [0, 1], [0, 1]])\nx, y = datasets.load_or_data()\n\n# 8. train the neural network\nmodel.train(training_data=(x, y), nb_epochs=10)\n\n# 9. evaluate the accuracy on data\nprint 'test accuracy: ', model.evaluate_accuracy(x, y)\n\n\n``` \n\n---\n\n#### examples/example2_moons_nn.py\n\n构建一个神经元数目为 [2-\u003e4-\u003e2] 的多层神经网络来对线性不可分数据集进行分类。\n\n```python\n\nfrom hamaa.datasets import datasets\nfrom hamaa.layers import Dense, Activation\nfrom hamaa.models import Sequential\nfrom hamaa.optimizers import SGD\nfrom hamaa.utils.np_utils import split_training_data\n\n\nmodel = Sequential()\nmodel.add(Dense(input_dim=2, output_dim=4, init='normal'))\nmodel.add(Activation('sigmoid'))\nmodel.add(Dense(output_dim=2))\nmodel.add(Activation('softmax'))\nmodel.set_objective('categorical_crossentropy')\nmodel.set_optimizer(SGD(lr=0.01, momentum=0.9))\n\nprint model.summary()\n\nx, y = datasets.load_moons_data(nb_data=2000, noise=0.1)\n\n# split nine in tenth of original data as training data, and the rest as validation data\ntraining_data, validation_data = split_training_data(data=(x, y), split_ratio=0.9)\n\n# \"verbose\" means display mode of training information\n# \"log_epoch\" means display training information every log_epoch times\nmodel.train(training_data=training_data,\n            nb_epochs=30,\n            mini_batch_size=100,\n            verbose=1,\n            validation_data=validation_data,\n            log_epoch=1)\n\nprint 'test accuracy: ', model.evaluate_accuracy(x, y)\n\n# plot the prediction on training_data and validation_data\nmodel.plot_prediction(data=training_data)\nmodel.plot_prediction(data=validation_data)\n\n# plot a line chart about accuracy and loss with epoch.\nmodel.plot_training_iteration()\n\n```\n\n---\n\n#### examples/example3_mnist_nn.py\n\n构建一个多层神经网络来对MNIST数据集进行分类。\n使用进度条功能来显示训练过程。\n\n```python\n\nfrom hamaa.datasets.datasets import load_mnist_data\nfrom hamaa.layers import Dense, Activation\nfrom hamaa.models import Sequential\nfrom hamaa.optimizers import SGD\nfrom hamaa.utils.np_utils import split_training_data\n\n\nprint 'loading MNIST dataset...'\n# \"preprocess\" means normalization\ntraining_data, test_data = load_mnist_data(nb_training=60000, nb_test=10000, preprocess=True, flatten=True)\ntraining_data, validation_data = split_training_data(training_data, split_ratio=0.95)\n\nprint 'training_data:', training_data[0].shape\nprint 'validation_data:', validation_data[0].shape\nprint 'test_data:', test_data[0].shape\n\nmodel = Sequential()\nmodel.add(Dense(input_dim=784, output_dim=100, init='glorot_normal'))\nmodel.add(Activation('sigmoid'))\nmodel.add(Dense(output_dim=10, init='glorot_normal'))\nmodel.add(Activation('softmax'))\nmodel.set_objective('categorical_crossentropy')\nmodel.set_optimizer(SGD(lr=0.01, momentum=0.9))\n\nprint model.summary()\n\nmodel.train(training_data=training_data,\n            nb_epochs=10,\n            mini_batch_size=100,\n            verbose=2,\n            validation_data=validation_data,\n            log_epoch=1)\n\nprint 'test accuracy:', model.evaluate_accuracy(test_data[0], test_data[1])\nmodel.plot_training_iteration()\n\n\n```\n\n---\n\n#### examples/example4_mnist_cnn.py\n\n构建一个卷积神经网络来对MNIST数据集进行分类。\n使用进度条功能来显示训练过程，\n并使用可视化工具对卷积层权重进行可视化。\n\n```python\n\n\nfrom hamaa.datasets.datasets import load_mnist_data\nfrom hamaa.layers import Dense, Activation, Convolution2D, Flatten, MeanPooling2D\nfrom hamaa.models import Sequential\nfrom hamaa.optimizers import SGD\nfrom hamaa.utils import vis_utils\nfrom hamaa.utils.np_utils import split_training_data\n\n\nprint 'loading MNIST dataset...'\ntraining_data, test_data = load_mnist_data(nb_training=6000, nb_test=10000, preprocess=True, flatten=False)\ntraining_data, validation_data = split_training_data(training_data, nb_validation=1000)\n\nprint 'training_data:', training_data[0].shape\nprint 'validation_data:', validation_data[0].shape\nprint 'test_data:', test_data[0].shape\n\nmodel = Sequential()\nmodel.add(Convolution2D(nb_kernel=5, kernel_height=5, kernel_width=5, activation='relu', input_shape=(1, 28, 28)))\nmodel.add(MeanPooling2D(pooling_size=(2, 2)))\nmodel.add(Convolution2D(nb_kernel=5, kernel_height=5, kernel_width=5, activation='relu'))\nmodel.add(MeanPooling2D(pooling_size=(2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(output_dim=100, init='glorot_normal'))\nmodel.add(Activation('sigmoid'))\nmodel.add(Dense(output_dim=10, init='glorot_normal'))\nmodel.add(Activation('softmax'))\n\nmodel.set_objective('categorical_crossentropy')\nmodel.set_optimizer(SGD(lr=0.002, momentum=0.9))\n\nprint model.summary()\n\nmodel.train(training_data=training_data,\n            nb_epochs=20,\n            mini_batch_size=64,\n            verbose=2,\n            validation_data=validation_data,\n            log_epoch=1)\n\nprint model.evaluate_accuracy(test_data[0], test_data[1])\n\n# visualize the kernels of convolution layer\nvis_utils.visualize_convolution_kernel(model.layers[0], title='layer 0')\nvis_utils.visualize_convolution_kernel(model.layers[2], title='layer 2')\n\nmodel.plot_training_iteration()\n\n```\n\n在MNIST数据集上测试准确率达到99.3%的卷积神经网络卷积核可视化示意图：\n(**注**: 非来自上述程序)\n\n\u003cp align=\"center\"\u003e\n      \u003cimg width=300 src=\"docs/images/README/cnn_first_layer_kernels.png\" alt=\"cnn_first_layer_kernels\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n      \u003cimg width=300 src=\"docs/images/README/cnn_second_layer_kernels.png\" alt=\"cnn_second_layer_kernels\" /\u003e\n\u003c/p\u003e\n\n### dev branch\n\n[![Documentation Status](https://readthedocs.org/projects/hamaa/badge/?version=latest)](http://hamaa.readthedocs.io/zh_CN/latest/?badge=latest) \n[![Build Status](https://travis-ci.org/monitor1379/hamaa.svg?branch=dev)](https://travis-ci.org/monitor1379/hamaa)\n[![codecov](https://codecov.io/gh/monitor1379/hamaa/branch/dev/graph/badge.svg)](https://codecov.io/gh/monitor1379/hamaa)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonitor1379%2Fhamaa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonitor1379%2Fhamaa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonitor1379%2Fhamaa/lists"}