tinydnn:微小但强大的深度神经网络

tinydnn:微小但强大的深度神经网络

C/C++ 机器学习

访问GitHub主页

共40Star

详细介绍

tinydnn

Introduction

tinydnn is an (experimental) R wrapper of the tiny-dnn library for implementing Deep Neural Networks (DNN). The largest advantage of tiny-dnn over other deep learning frameworks is its minimal dependency on external software and the ease of installation. As a result, the R package tinydnn is also very convenient to install as long as you have a C++ 11 compiler, and it runs on all major platforms including Linux, Mac, Windows etc.

tinydnn may be a good option for building DNN models if:

  • You use R! (You may want to consider MXNet first)
  • You have a CPU-only environment with limited resources
  • You want to quickly try DNN models without spending too much time on installation and configuration
  • You need different packages to compare the results
  • You want to learn the internals of DNN (The included tiny-dnn library provides an excellent coding example of DNN)

Development Status

tinydnn is still in the experiment stage. Functions and interface may change, and more features will be added per request. Feedbacks and contributions are highly welcome.

Examples

This package has not been fully documented. The examples below are mostly self-explanatory.

Regression

We use the wine quality data on UCI machine learning repository to demonstrate a regression example, in which we use several attributes of the wine to predict its quality.

## Wine quality data set
## https://archive.ics.uci.edu/ml/datasets/Wine+Quality
dat_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
dat = read.csv(url(dat_url), sep = ";")
n = nrow(dat)
x = scale(as.matrix(dat[, -ncol(dat)]))
y = dat[, ncol(dat)]

## Splitting training and testing data
set.seed(123)
ind = sample(1:n, floor(0.8 * n))
train_x = x[ind, ]
train_y = y[ind]
test_x = x[-ind, ]
test_y = y[-ind]

## Create a neural network
library(tinydnn)
net = net_seq()

## Add layers
# A fully-connected layer that takes the data as input,
# with 20 hidden units and the ReLU activation function
net$add_layer(fc(ncol(train_x), 20, act = "relu"))
# A second layer with 20 hidden units                                      
net$add_layer(fc(20, 20, act = "relu"))
# The output layer
net$add_layer(fc(20, 1, act = "identity"))

# There is also a "%<%" operator that can be used to build the network
net = net_seq()
net %<%
    fc(ncol(train_x), 20, act = "relu") %<%
    fc(20, 20, act = "relu") %<%
    fc(20, 1, act = "identity")

## Fit the model on the data set
net$fit(train_x, train_y, batch_size = 100, epochs = 100, verbose = TRUE)

## Make prediction
pred_train = net$predict(train_x)
pred_test = net$predict(test_x)

mean((train_y - pred_train)^2)
mean((test_y - pred_test)^2)

Classification

Since the quality of wine is coded as an integer from 1 to 10 (actually 3 to 8 in this data set), we can also regard this as a classification problem. The code below shows how we build a neural network for classification.

## Make the wine quality a categorical variable
train_y = factor(train_y)
test_y = factor(test_y)

## Construct the network
net = net_seq()
net %<%
    fc(ncol(train_x), 20, act = "sigmoid") %<%
    fc(20, 30, act = "sigmoid") %<%
    fc(30, 20, act = "sigmoid") %<%
    fc(20, nlevels(train_y), act = "softmax")

net$fit(train_x, train_y, batch_size = 100, epochs = 100, verbose = TRUE)
pred_train = net$predict(train_x, type = "class")
pred_test = net$predict(test_x, type = "class")

## Confusion matrix
table(pred_train, train_y)
table(pred_test, test_y)

## If class probabilities are required, use the `type = "prob"` option
prob = net$predict(test_x, type = "prob")

In the examples above we only use fully-connected layers to construct the network. There are other types of layers supported by tinydnn, for example convolutional layers. See ?layers for a list of currently supported ones.

TODO

  • Random seed. If possible use the RNG provided by R itself. (Completed)
  • Add more layers implemented by the tiny-dnn library.
  • Add convenient functions to manipulate networks and layers.
  • Support different optimization methods. (Completed)
推荐源码