From f9fd4a84d0a162347a57397a196e5b21ea624583 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 18 Feb 2022 11:59:51 +0000 Subject: [PATCH] Built site for torch: 0.7.0@7d284ef --- 404.html | 261 +- CONTRIBUTING.html | 320 +- LICENSE-text.html | 251 +- LICENSE.html | 251 +- articles/distributions.html | 244 +- articles/examples/basic-autograd.html | 201 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/examples/basic-nn-module.html | 273 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/examples/dataset.html | 273 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/examples/index.html | 192 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/examples/mnist-cnn.html | 259 - .../empty-anchor.js | 15 - articles/examples/mnist-dcgan.html | 340 - .../empty-anchor.js | 15 - articles/examples/mnist-mlp.html | 247 - .../empty-anchor.js | 15 - articles/extending-autograd.html | 216 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/assets/mnist.png | Bin 42703 -> 0 bytes articles/getting-started/autograd.html | 369 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - .../control-flow-and-weight-sharing.html | 321 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/custom-nn.html | 305 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/neural-networks.html | 430 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - .../new-autograd-functions.html | 313 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/nn.html | 296 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/optim.html | 298 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - .../getting-started/tensors-and-autograd.html | 291 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/tensors.html | 276 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/warmup.html | 269 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/getting-started/what-is-torch.html | 425 - .../empty-anchor.js | 15 - .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/index.html | 310 +- articles/indexing.html | 282 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/installation.html | 284 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/loading-data.html | 441 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/python-to-r.html | 199 +- articles/serialization.html | 228 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/tensor-creation.html | 238 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/tensor/index.html | 3340 +++-- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - articles/torchscript.html | 402 +- articles/using-autograd.html | 257 +- .../anchor-sections-1.0/anchor-sections.css | 4 - .../anchor-sections-1.0/anchor-sections.js | 33 - authors.html | 332 +- bootstrap-toc.css | 60 - bootstrap-toc.js | 159 - deps/bootstrap-5.1.0/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + deps/bootstrap-5.1.0/bootstrap.min.css | 1 + deps/data-deps.txt | 4 + deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++ deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 + deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 + docsearch.css | 148 - docsearch.js | 85 - extra.css | 52 +- index.html | 296 +- news/index.html | 969 +- pkgdown.css | 367 - pkgdown.js | 176 +- pkgdown.yml | 17 +- reference/AutogradContext.html | 441 +- reference/Constraint.html | 329 +- reference/Distribution.html | 645 +- reference/as_array.html | 274 +- reference/autograd_backward.html | 349 +- reference/autograd_function.html | 326 +- reference/autograd_grad.html | 384 +- reference/autograd_set_grad_mode.html | 274 +- reference/backends_cudnn_is_available.html | 107 + reference/backends_cudnn_version.html | 107 + reference/backends_mkl_is_available.html | 266 +- reference/backends_mkldnn_is_available.html | 266 +- reference/backends_openmp_is_available.html | 266 +- reference/broadcast_all.html | 286 +- reference/call_torch_function.html | 165 + reference/contrib_sort_vertices.html | 324 +- reference/cuda_current_device.html | 260 +- reference/cuda_device_count.html | 260 +- reference/cuda_get_device_capability.html | 113 + reference/cuda_is_available.html | 260 +- reference/cuda_memory_stats.html | 146 + reference/dataloader.html | 414 +- reference/dataloader_make_iter.html | 274 +- reference/dataloader_next.html | 280 +- reference/dataset.html | 350 +- reference/dataset_subset.html | 280 +- reference/default_dtype.html | 278 +- reference/distr_bernoulli.html | 332 +- reference/distr_categorical.html | 323 +- reference/distr_chi2.html | 327 +- reference/distr_gamma.html | 328 +- reference/distr_mixture_same_family.html | 330 +- reference/distr_multivariate_normal.html | 365 +- reference/distr_normal.html | 337 +- reference/distr_poisson.html | 322 +- reference/enumerate.dataloader.html | 288 +- reference/enumerate.html | 280 +- reference/figures/torch-full.png | Bin 1697283 -> 0 bytes reference/get_install_libs_url.html | 283 +- reference/index.html | 9387 +++++++------ reference/install_torch.html | 323 +- reference/install_torch_from_file.html | 315 +- reference/is_dataloader.html | 274 +- reference/is_nn_buffer.html | 274 +- reference/is_nn_module.html | 274 +- reference/is_nn_parameter.html | 274 +- reference/is_optimizer.html | 274 +- reference/is_torch_device.html | 274 +- reference/is_torch_dtype.html | 274 +- reference/is_torch_layout.html | 274 +- reference/is_torch_memory_format.html | 274 +- reference/is_torch_qscheme.html | 274 +- reference/is_undefined_tensor.html | 274 +- reference/jit_compile.html | 322 +- reference/jit_load.html | 282 +- reference/jit_save.html | 319 +- reference/jit_save_for_mobile.html | 138 + reference/jit_scalar.html | 277 +- reference/jit_trace.html | 354 +- reference/jit_trace_module.html | 330 +- reference/jit_tuple.html | 277 +- reference/linalg_cholesky.html | 393 +- reference/linalg_cholesky_ex.html | 406 +- reference/linalg_cond.html | 350 +- reference/linalg_det.html | 364 +- reference/linalg_eig.html | 389 +- reference/linalg_eigh.html | 432 +- reference/linalg_eigvals.html | 363 +- reference/linalg_eigvalsh.html | 393 +- reference/linalg_householder_product.html | 389 +- reference/linalg_inv.html | 374 +- reference/linalg_inv_ex.html | 370 +- reference/linalg_lstsq.html | 413 +- reference/linalg_matrix_norm.html | 433 +- reference/linalg_matrix_power.html | 369 +- reference/linalg_matrix_rank.html | 384 +- reference/linalg_multi_dot.html | 372 +- reference/linalg_norm.html | 436 +- reference/linalg_pinv.html | 409 +- reference/linalg_qr.html | 397 +- reference/linalg_slogdet.html | 379 +- reference/linalg_solve.html | 379 +- reference/linalg_svd.html | 443 +- reference/linalg_svdvals.html | 366 +- reference/linalg_tensorinv.html | 394 +- reference/linalg_tensorsolve.html | 397 +- reference/linalg_vector_norm.html | 419 +- reference/load_state_dict.html | 291 +- reference/lr_lambda.html | 339 +- reference/lr_multiplicative.html | 335 +- reference/lr_one_cycle.html | 470 +- reference/lr_scheduler.html | 306 +- reference/lr_step.html | 339 +- reference/nn_adaptive_avg_pool1d.html | 300 +- reference/nn_adaptive_avg_pool2d.html | 308 +- reference/nn_adaptive_avg_pool3d.html | 308 +- .../nn_adaptive_log_softmax_with_loss.html | 353 +- reference/nn_adaptive_max_pool1d.html | 308 +- reference/nn_adaptive_max_pool2d.html | 316 +- reference/nn_adaptive_max_pool3d.html | 316 +- reference/nn_avg_pool1d.html | 370 +- reference/nn_avg_pool2d.html | 381 +- reference/nn_avg_pool3d.html | 383 +- reference/nn_batch_norm1d.html | 365 +- reference/nn_batch_norm2d.html | 365 +- reference/nn_batch_norm3d.html | 365 +- reference/nn_bce_loss.html | 321 +- reference/nn_bce_with_logits_loss.html | 347 +- reference/nn_bilinear.html | 336 +- reference/nn_buffer.html | 280 +- reference/nn_celu.html | 310 +- reference/nn_contrib_sparsemax.html | 283 +- reference/nn_conv1d.html | 415 +- reference/nn_conv2d.html | 421 +- reference/nn_conv3d.html | 406 +- reference/nn_conv_transpose1d.html | 412 +- reference/nn_conv_transpose2d.html | 445 +- reference/nn_conv_transpose3d.html | 424 +- reference/nn_cosine_embedding_loss.html | 296 +- reference/nn_cross_entropy_loss.html | 329 +- reference/nn_ctc_loss.html | 397 +- reference/nn_dropout.html | 315 +- reference/nn_dropout2d.html | 318 +- reference/nn_dropout3d.html | 318 +- reference/nn_elu.html | 308 +- reference/nn_embedding.html | 411 +- reference/nn_flatten.html | 171 + reference/nn_fractional_max_pool2d.html | 338 +- reference/nn_fractional_max_pool3d.html | 343 +- reference/nn_gelu.html | 296 +- reference/nn_glu.html | 305 +- reference/nn_group_norm.html | 346 +- reference/nn_gru.html | 404 +- reference/nn_hardshrink.html | 302 +- reference/nn_hardsigmoid.html | 293 +- reference/nn_hardswish.html | 303 +- reference/nn_hardtanh.html | 317 +- reference/nn_hinge_embedding_loss.html | 294 +- reference/nn_identity.html | 299 +- reference/nn_init_calculate_gain.html | 280 +- reference/nn_init_constant_.html | 309 +- reference/nn_init_dirac_.html | 309 +- reference/nn_init_eye_.html | 307 +- reference/nn_init_kaiming_normal_.html | 339 +- reference/nn_init_kaiming_uniform_.html | 339 +- reference/nn_init_normal_.html | 315 +- reference/nn_init_ones_.html | 303 +- reference/nn_init_orthogonal_.html | 314 +- reference/nn_init_sparse_.html | 314 +- reference/nn_init_trunc_normal_.html | 328 +- reference/nn_init_uniform_.html | 315 +- reference/nn_init_xavier_normal_.html | 313 +- reference/nn_init_xavier_uniform_.html | 313 +- reference/nn_init_zeros_.html | 303 +- reference/nn_kl_div_loss.html | 300 +- reference/nn_l1_loss.html | 311 +- reference/nn_layer_norm.html | 346 +- reference/nn_leaky_relu.html | 308 +- reference/nn_linear.html | 325 +- reference/nn_log_sigmoid.html | 293 +- reference/nn_log_softmax.html | 310 +- reference/nn_lp_pool1d.html | 347 +- reference/nn_lp_pool2d.html | 358 +- reference/nn_lstm.html | 412 +- reference/nn_margin_ranking_loss.html | 322 +- reference/nn_max_pool1d.html | 355 +- reference/nn_max_pool2d.html | 362 +- reference/nn_max_pool3d.html | 367 +- reference/nn_max_unpool1d.html | 373 +- reference/nn_max_unpool2d.html | 361 +- reference/nn_max_unpool3d.html | 343 +- reference/nn_module.html | 390 +- reference/nn_module_list.html | 316 +- reference/nn_mse_loss.html | 313 +- reference/nn_multi_margin_loss.html | 308 +- reference/nn_multihead_attention.html | 385 +- reference/nn_multilabel_margin_loss.html | 319 +- reference/nn_multilabel_soft_margin_loss.html | 297 +- reference/nn_nll_loss.html | 359 +- reference/nn_pairwise_distance.html | 323 +- reference/nn_parameter.html | 282 +- reference/nn_poisson_nll_loss.html | 345 +- reference/nn_prelu.html | 339 +- reference/nn_relu.html | 312 +- reference/nn_relu6.html | 306 +- reference/nn_rnn.html | 546 +- reference/nn_rrelu.html | 325 +- reference/nn_selu.html | 304 +- reference/nn_sequential.html | 311 +- reference/nn_sigmoid.html | 293 +- reference/nn_smooth_l1_loss.html | 291 +- reference/nn_soft_margin_loss.html | 289 +- reference/nn_softmax.html | 319 +- reference/nn_softmax2d.html | 297 +- reference/nn_softmin.html | 314 +- reference/nn_softplus.html | 313 +- reference/nn_softshrink.html | 302 +- reference/nn_softsign.html | 293 +- reference/nn_tanh.html | 293 +- reference/nn_tanhshrink.html | 293 +- reference/nn_threshold.html | 316 +- reference/nn_triplet_margin_loss.html | 360 +- .../nn_triplet_margin_with_distance_loss.html | 413 +- reference/nn_unflatten.html | 137 + reference/nn_upsample.html | 163 + reference/nn_utils_clip_grad_norm_.html | 298 +- reference/nn_utils_clip_grad_value_.html | 287 +- .../nn_utils_rnn_pack_padded_sequence.html | 326 +- reference/nn_utils_rnn_pack_sequence.html | 317 +- .../nn_utils_rnn_pad_packed_sequence.html | 380 +- reference/nn_utils_rnn_pad_sequence.html | 329 +- reference/nnf_adaptive_avg_pool1d.html | 283 +- reference/nnf_adaptive_avg_pool2d.html | 283 +- reference/nnf_adaptive_avg_pool3d.html | 283 +- reference/nnf_adaptive_max_pool1d.html | 289 +- reference/nnf_adaptive_max_pool2d.html | 289 +- reference/nnf_adaptive_max_pool3d.html | 289 +- reference/nnf_affine_grid.html | 306 +- reference/nnf_alpha_dropout.html | 300 +- reference/nnf_avg_pool1d.html | 337 +- reference/nnf_avg_pool2d.html | 348 +- reference/nnf_avg_pool3d.html | 348 +- reference/nnf_batch_norm.html | 342 +- reference/nnf_bilinear.html | 307 +- reference/nnf_binary_cross_entropy.html | 309 +- .../nnf_binary_cross_entropy_with_logits.html | 319 +- reference/nnf_celu.html | 292 +- reference/nnf_contrib_sparsemax.html | 289 +- reference/nnf_conv1d.html | 343 +- reference/nnf_conv2d.html | 343 +- reference/nnf_conv3d.html | 343 +- reference/nnf_conv_tbc.html | 305 +- reference/nnf_conv_transpose1d.html | 351 +- reference/nnf_conv_transpose2d.html | 351 +- reference/nnf_conv_transpose3d.html | 351 +- reference/nnf_cosine_embedding_loss.html | 319 +- reference/nnf_cosine_similarity.html | 299 +- reference/nnf_cross_entropy.html | 323 +- reference/nnf_ctc_loss.html | 334 +- reference/nnf_dropout.html | 304 +- reference/nnf_dropout2d.html | 306 +- reference/nnf_dropout3d.html | 306 +- reference/nnf_elu.html | 320 +- reference/nnf_embedding.html | 343 +- reference/nnf_embedding_bag.html | 371 +- reference/nnf_fold.html | 328 +- reference/nnf_fractional_max_pool2d.html | 329 +- reference/nnf_fractional_max_pool3d.html | 329 +- reference/nnf_gelu.html | 281 +- reference/nnf_glu.html | 287 +- reference/nnf_grid_sample.html | 332 +- reference/nnf_group_norm.html | 304 +- reference/nnf_gumbel_softmax.html | 295 +- reference/nnf_hardshrink.html | 282 +- reference/nnf_hardsigmoid.html | 282 +- reference/nnf_hardswish.html | 290 +- reference/nnf_hardtanh.html | 302 +- reference/nnf_hinge_embedding_loss.html | 301 +- reference/nnf_instance_norm.html | 343 +- reference/nnf_interpolate.html | 336 +- reference/nnf_kl_div.html | 290 +- reference/nnf_l1_loss.html | 290 +- reference/nnf_layer_norm.html | 314 +- reference/nnf_leaky_relu.html | 291 +- reference/nnf_linear.html | 288 +- reference/nnf_local_response_norm.html | 308 +- reference/nnf_log_softmax.html | 295 +- reference/nnf_logsigmoid.html | 276 +- reference/nnf_lp_pool1d.html | 310 +- reference/nnf_lp_pool2d.html | 310 +- reference/nnf_margin_ranking_loss.html | 305 +- reference/nnf_max_pool1d.html | 345 +- reference/nnf_max_pool2d.html | 345 +- reference/nnf_max_pool3d.html | 345 +- reference/nnf_max_unpool1d.html | 324 +- reference/nnf_max_unpool2d.html | 324 +- reference/nnf_max_unpool3d.html | 324 +- reference/nnf_mse_loss.html | 290 +- .../nnf_multi_head_attention_forward.html | 487 +- reference/nnf_multi_margin_loss.html | 326 +- reference/nnf_multilabel_margin_loss.html | 294 +- .../nnf_multilabel_soft_margin_loss.html | 309 +- reference/nnf_nll_loss.html | 320 +- reference/nnf_normalize.html | 303 +- reference/nnf_one_hot.html | 294 +- reference/nnf_pad.html | 298 +- reference/nnf_pairwise_distance.html | 306 +- reference/nnf_pdist.html | 292 +- reference/nnf_pixel_shuffle.html | 283 +- reference/nnf_poisson_nll_loss.html | 326 +- reference/nnf_prelu.html | 286 +- reference/nnf_relu.html | 284 +- reference/nnf_relu6.html | 282 +- reference/nnf_rrelu.html | 308 +- reference/nnf_selu.html | 316 +- reference/nnf_sigmoid.html | 276 +- reference/nnf_smooth_l1_loss.html | 293 +- reference/nnf_soft_margin_loss.html | 293 +- reference/nnf_softmax.html | 293 +- reference/nnf_softmin.html | 297 +- reference/nnf_softplus.html | 293 +- reference/nnf_softshrink.html | 284 +- reference/nnf_softsign.html | 276 +- reference/nnf_tanhshrink.html | 276 +- reference/nnf_threshold.html | 302 +- reference/nnf_triplet_margin_loss.html | 344 +- ...nnf_triplet_margin_with_distance_loss.html | 334 +- reference/nnf_unfold.html | 303 +- reference/optim_adadelta.html | 338 +- reference/optim_adagrad.html | 338 +- reference/optim_adam.html | 359 +- reference/optim_asgd.html | 351 +- reference/optim_lbfgs.html | 353 +- reference/optim_required.html | 260 +- reference/optim_rmsprop.html | 344 +- reference/optim_rprop.html | 327 +- reference/optim_sgd.html | 352 +- reference/optimizer.html | 421 +- reference/pipe.html | 260 +- reference/reexports.html | 266 +- reference/slc.html | 315 +- reference/tensor_dataset.html | 274 +- reference/threads.html | 292 +- reference/torch_abs.html | 301 +- reference/torch_absolute.html | 279 +- reference/torch_acos.html | 307 +- reference/torch_acosh.html | 308 +- reference/torch_adaptive_avg_pool1d.html | 285 +- reference/torch_add.html | 334 +- reference/torch_addbmm.html | 327 +- reference/torch_addcdiv.html | 332 +- reference/torch_addcmul.html | 321 +- reference/torch_addmm.html | 325 +- reference/torch_addmv.html | 325 +- reference/torch_addr.html | 327 +- reference/torch_allclose.html | 319 +- reference/torch_amax.html | 327 +- reference/torch_amin.html | 329 +- reference/torch_angle.html | 295 +- reference/torch_arange.html | 355 +- reference/torch_arccos.html | 279 +- reference/torch_arccosh.html | 279 +- reference/torch_arcsin.html | 279 +- reference/torch_arcsinh.html | 279 +- reference/torch_arctan.html | 279 +- reference/torch_arctanh.html | 279 +- reference/torch_argmax.html | 329 +- reference/torch_argmin.html | 325 +- reference/torch_argsort.html | 315 +- reference/torch_as_strided.html | 333 +- reference/torch_asin.html | 307 +- reference/torch_asinh.html | 307 +- reference/torch_atan.html | 307 +- reference/torch_atan2.html | 309 +- reference/torch_atanh.html | 308 +- reference/torch_atleast_1d.html | 329 +- reference/torch_atleast_2d.html | 329 +- reference/torch_atleast_3d.html | 277 +- reference/torch_avg_pool1d.html | 319 +- reference/torch_baddbmm.html | 383 +- reference/torch_bartlett_window.html | 326 +- reference/torch_bernoulli.html | 325 +- reference/torch_bincount.html | 328 +- reference/torch_bitwise_and.html | 283 +- reference/torch_bitwise_not.html | 277 +- reference/torch_bitwise_or.html | 283 +- reference/torch_bitwise_xor.html | 283 +- reference/torch_blackman_window.html | 326 +- reference/torch_block_diag.html | 326 +- reference/torch_bmm.html | 372 +- reference/torch_broadcast_tensors.html | 307 +- reference/torch_bucketize.html | 329 +- reference/torch_can_cast.html | 301 +- reference/torch_cartesian_prod.html | 316 +- reference/torch_cat.html | 311 +- reference/torch_cdist.html | 295 +- reference/torch_ceil.html | 307 +- reference/torch_celu.html | 285 +- reference/torch_celu_.html | 285 +- reference/torch_chain_matmul.html | 305 +- reference/torch_channel_shuffle.html | 373 +- reference/torch_cholesky.html | 321 +- reference/torch_cholesky_inverse.html | 307 +- reference/torch_cholesky_solve.html | 323 +- reference/torch_chunk.html | 289 +- reference/torch_clamp.html | 345 +- reference/torch_clip.html | 291 +- reference/torch_clone.html | 288 +- reference/torch_combinations.html | 323 +- reference/torch_complex.html | 309 +- reference/torch_conj.html | 293 +- reference/torch_conv1d.html | 411 +- reference/torch_conv2d.html | 413 +- reference/torch_conv3d.html | 347 +- reference/torch_conv_tbc.html | 295 +- reference/torch_conv_transpose1d.html | 419 +- reference/torch_conv_transpose2d.html | 421 +- reference/torch_conv_transpose3d.html | 355 +- reference/torch_cos.html | 307 +- reference/torch_cosh.html | 307 +- reference/torch_cosine_similarity.html | 377 +- reference/torch_count_nonzero.html | 313 +- reference/torch_cross.html | 321 +- reference/torch_cummax.html | 353 +- reference/torch_cummin.html | 353 +- reference/torch_cumprod.html | 328 +- reference/torch_cumsum.html | 327 +- reference/torch_deg2rad.html | 303 +- reference/torch_dequantize.html | 282 +- reference/torch_det.html | 314 +- reference/torch_device.html | 318 +- reference/torch_diag.html | 293 +- reference/torch_diag_embed.html | 350 +- reference/torch_diagflat.html | 329 +- reference/torch_diagonal.html | 362 +- reference/torch_diff.html | 348 +- reference/torch_digamma.html | 301 +- reference/torch_dist.html | 319 +- reference/torch_div.html | 341 +- reference/torch_divide.html | 296 +- reference/torch_dot.html | 308 +- reference/torch_dstack.html | 319 +- reference/torch_dtype.html | 294 +- reference/torch_eig.html | 292 +- reference/torch_einsum.html | 327 +- reference/torch_empty.html | 340 +- reference/torch_empty_like.html | 339 +- reference/torch_empty_strided.html | 352 +- reference/torch_eq.html | 307 +- reference/torch_equal.html | 299 +- reference/torch_erf.html | 301 +- reference/torch_erfc.html | 301 +- reference/torch_erfinv.html | 301 +- reference/torch_exp.html | 299 +- reference/torch_exp2.html | 303 +- reference/torch_expm1.html | 299 +- reference/torch_eye.html | 341 +- reference/torch_fft.html | 322 - reference/torch_fft_fft.html | 334 +- reference/torch_fft_ifft.html | 337 +- reference/torch_fft_irfft.html | 351 +- reference/torch_fft_rfft.html | 336 +- reference/torch_finfo.html | 277 +- reference/torch_fix.html | 279 +- reference/torch_flatten.html | 323 +- reference/torch_flip.html | 315 +- reference/torch_fliplr.html | 308 +- reference/torch_flipud.html | 308 +- reference/torch_floor.html | 307 +- reference/torch_floor_divide.html | 309 +- reference/torch_fmod.html | 309 +- reference/torch_frac.html | 301 +- reference/torch_full.html | 352 +- reference/torch_full_like.html | 325 +- reference/torch_gather.html | 322 +- reference/torch_gcd.html | 310 +- reference/torch_ge.html | 307 +- reference/torch_generator.html | 294 +- reference/torch_geqrf.html | 279 +- reference/torch_ger.html | 316 +- reference/torch_greater.html | 285 +- reference/torch_greater_equal.html | 285 +- reference/torch_gt.html | 307 +- reference/torch_hamming_window.html | 346 +- reference/torch_hann_window.html | 326 +- reference/torch_heaviside.html | 311 +- reference/torch_histc.html | 317 +- reference/torch_hstack.html | 311 +- reference/torch_hypot.html | 303 +- reference/torch_i0.html | 307 +- reference/torch_ifft.html | 299 - reference/torch_iinfo.html | 277 +- reference/torch_imag.html | 298 +- reference/torch_index.html | 282 +- reference/torch_index_put.html | 304 +- reference/torch_index_put_.html | 304 +- reference/torch_index_select.html | 322 +- reference/torch_install_path.html | 113 + reference/torch_inverse.html | 316 +- reference/torch_irfft.html | 321 - reference/torch_is_complex.html | 277 +- reference/torch_is_floating_point.html | 277 +- reference/torch_is_installed.html | 260 +- reference/torch_is_nonzero.html | 305 +- reference/torch_isclose.html | 323 +- reference/torch_isfinite.html | 305 +- reference/torch_isinf.html | 305 +- reference/torch_isnan.html | 301 +- reference/torch_isneginf.html | 303 +- reference/torch_isposinf.html | 303 +- reference/torch_isreal.html | 293 +- reference/torch_istft.html | 375 +- reference/torch_kaiser_window.html | 334 +- reference/torch_kthvalue.html | 337 +- reference/torch_layout.html | 262 +- reference/torch_lcm.html | 310 +- reference/torch_le.html | 307 +- reference/torch_lerp.html | 321 +- reference/torch_less.html | 285 +- reference/torch_less_equal.html | 285 +- reference/torch_lgamma.html | 305 +- reference/torch_linspace.html | 351 +- reference/torch_load.html | 293 +- reference/torch_log.html | 305 +- reference/torch_log10.html | 305 +- reference/torch_log1p.html | 312 +- reference/torch_log2.html | 305 +- reference/torch_logaddexp.html | 309 +- reference/torch_logaddexp2.html | 285 +- reference/torch_logcumsumexp.html | 319 +- reference/torch_logdet.html | 316 +- reference/torch_logical_and.html | 309 +- reference/torch_logical_not.html | 300 +- reference/torch_logical_or.html | 309 +- reference/torch_logical_xor.html | 315 +- reference/torch_logit.html | 311 +- reference/torch_logspace.html | 359 +- reference/torch_logsumexp.html | 313 +- reference/torch_lstsq.html | 346 +- reference/torch_lt.html | 307 +- reference/torch_lu.html | 355 +- reference/torch_lu_solve.html | 311 +- reference/torch_manual_seed.html | 274 +- reference/torch_masked_select.html | 319 +- reference/torch_matmul.html | 413 +- reference/torch_matrix_exp.html | 309 +- reference/torch_matrix_power.html | 316 +- reference/torch_matrix_rank.html | 307 +- reference/torch_max.html | 368 +- reference/torch_maximum.html | 312 +- reference/torch_mean.html | 334 +- reference/torch_median.html | 356 +- reference/torch_memory_format.html | 264 +- reference/torch_meshgrid.html | 346 +- reference/torch_min.html | 368 +- reference/torch_minimum.html | 312 +- reference/torch_mm.html | 312 +- reference/torch_mode.html | 330 +- reference/torch_movedim.html | 325 +- reference/torch_mul.html | 323 +- reference/torch_multinomial.html | 334 +- reference/torch_multiply.html | 285 +- reference/torch_mv.html | 310 +- reference/torch_mvlgamma.html | 305 +- reference/torch_nanquantile.html | 337 +- reference/torch_nansum.html | 338 +- reference/torch_narrow.html | 319 +- reference/torch_ne.html | 307 +- reference/torch_neg.html | 309 +- reference/torch_negative.html | 279 +- reference/torch_nextafter.html | 307 +- reference/torch_nonzero.html | 310 +- reference/torch_norm.html | 331 +- reference/torch_normal.html | 360 +- reference/torch_not_equal.html | 285 +- reference/torch_ones.html | 347 +- reference/torch_ones_like.html | 346 +- reference/torch_orgqr.html | 285 +- reference/torch_ormqr.html | 301 +- reference/torch_outer.html | 316 +- reference/torch_pdist.html | 283 +- reference/torch_pinverse.html | 340 +- reference/torch_pixel_shuffle.html | 305 +- reference/torch_poisson.html | 307 +- reference/torch_polar.html | 313 +- reference/torch_polygamma.html | 306 +- reference/torch_pow.html | 336 +- reference/torch_prod.html | 334 +- reference/torch_promote_types.html | 301 +- reference/torch_qr.html | 318 +- reference/torch_qscheme.html | 266 +- reference/torch_quantile.html | 340 +- reference/torch_quantize_per_channel.html | 325 +- reference/torch_quantize_per_tensor.html | 317 +- reference/torch_rad2deg.html | 303 +- reference/torch_rand.html | 341 +- reference/torch_rand_like.html | 317 +- reference/torch_randint.html | 367 +- reference/torch_randint_like.html | 325 +- reference/torch_randn.html | 341 +- reference/torch_randn_like.html | 317 +- reference/torch_randperm.html | 335 +- reference/torch_range.html | 370 +- reference/torch_real.html | 298 +- reference/torch_reciprocal.html | 307 +- reference/torch_reduction.html | 264 +- reference/torch_relu.html | 277 +- reference/torch_relu_.html | 279 +- reference/torch_remainder.html | 309 +- reference/torch_renorm.html | 326 +- reference/torch_repeat_interleave.html | 329 +- reference/torch_reshape.html | 311 +- reference/torch_result_type.html | 299 +- reference/torch_rfft.html | 322 - reference/torch_roll.html | 319 +- reference/torch_rot90.html | 327 +- reference/torch_round.html | 307 +- reference/torch_rrelu_.html | 309 +- reference/torch_rsqrt.html | 307 +- reference/torch_save.html | 300 +- reference/torch_scalar_tensor.html | 292 +- reference/torch_searchsorted.html | 337 +- reference/torch_selu.html | 277 +- reference/torch_selu_.html | 279 +- reference/torch_sgn.html | 299 +- reference/torch_sigmoid.html | 307 +- reference/torch_sign.html | 307 +- reference/torch_signbit.html | 305 +- reference/torch_sin.html | 307 +- reference/torch_sinh.html | 307 +- reference/torch_slogdet.html | 328 +- reference/torch_solve.html | 344 +- reference/torch_sort.html | 339 +- reference/torch_sparse_coo_tensor.html | 361 +- reference/torch_split.html | 293 +- reference/torch_sqrt.html | 307 +- reference/torch_square.html | 307 +- reference/torch_squeeze.html | 338 +- reference/torch_stack.html | 283 +- reference/torch_std.html | 344 +- reference/torch_std_mean.html | 364 +- reference/torch_stft.html | 384 +- reference/torch_sub.html | 311 +- reference/torch_subtract.html | 291 +- reference/torch_sum.html | 346 +- reference/torch_svd.html | 334 +- reference/torch_symeig.html | 332 +- reference/torch_t.html | 313 +- reference/torch_take.html | 309 +- reference/torch_tan.html | 307 +- reference/torch_tanh.html | 307 +- reference/torch_tensor.html | 339 +- reference/torch_tensordot.html | 321 +- reference/torch_threshold_.html | 289 +- reference/torch_topk.html | 343 +- reference/torch_trace.html | 301 +- reference/torch_transpose.html | 313 +- reference/torch_trapz.html | 326 +- reference/torch_triangular_solve.html | 355 +- reference/torch_tril.html | 317 +- reference/torch_tril_indices.html | 352 +- reference/torch_triu.html | 321 +- reference/torch_triu_indices.html | 352 +- reference/torch_true_divide.html | 309 +- reference/torch_trunc.html | 307 +- reference/torch_unbind.html | 335 +- reference/torch_unique_consecutive.html | 369 +- reference/torch_unsafe_chunk.html | 296 +- reference/torch_unsafe_split.html | 294 +- reference/torch_unsqueeze.html | 309 +- reference/torch_vander.html | 321 +- reference/torch_var.html | 344 +- reference/torch_var_mean.html | 364 +- reference/torch_vdot.html | 312 +- reference/torch_view_as_complex.html | 300 +- reference/torch_view_as_real.html | 304 +- reference/torch_vstack.html | 315 +- reference/torch_where.html | 331 +- reference/torch_zeros.html | 347 +- reference/torch_zeros_like.html | 346 +- reference/with_detect_anomaly.html | 355 +- reference/with_enable_grad.html | 319 +- reference/with_no_grad.html | 305 +- search.json | 1 + sitemap.xml | 2046 +++ 778 files changed, 89335 insertions(+), 160422 deletions(-) delete mode 100644 articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/examples/index_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/examples/index_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/examples/mnist-cnn.html delete mode 100644 articles/examples/mnist-cnn_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/examples/mnist-dcgan.html delete mode 100644 articles/examples/mnist-dcgan_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/examples/mnist-mlp.html delete mode 100644 articles/examples/mnist-mlp_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/assets/mnist.png delete mode 100644 articles/getting-started/autograd.html delete mode 100644 articles/getting-started/autograd_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/control-flow-and-weight-sharing.html delete mode 100644 articles/getting-started/control-flow-and-weight-sharing_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/custom-nn.html delete mode 100644 articles/getting-started/custom-nn_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/neural-networks.html delete mode 100644 articles/getting-started/neural-networks_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/new-autograd-functions.html delete mode 100644 articles/getting-started/new-autograd-functions_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/nn.html delete mode 100644 articles/getting-started/nn_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/optim.html delete mode 100644 articles/getting-started/optim_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/tensors-and-autograd.html delete mode 100644 articles/getting-started/tensors-and-autograd_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/tensors.html delete mode 100644 articles/getting-started/tensors_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/warmup.html delete mode 100644 articles/getting-started/warmup_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/getting-started/what-is-torch.html delete mode 100644 articles/getting-started/what-is-torch_files/accessible-code-block-0.0.1/empty-anchor.js delete mode 100644 articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/indexing_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/indexing_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/installation_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/installation_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/loading-data_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/loading-data_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/serialization_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/serialization_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/tensor-creation_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/tensor-creation_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/tensor/index_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/tensor/index_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 articles/using-autograd_files/anchor-sections-1.0/anchor-sections.css delete mode 100644 articles/using-autograd_files/anchor-sections-1.0/anchor-sections.js delete mode 100644 bootstrap-toc.css delete mode 100644 bootstrap-toc.js create mode 100644 deps/bootstrap-5.1.0/bootstrap.bundle.min.js create mode 100644 deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map create mode 100644 deps/bootstrap-5.1.0/bootstrap.min.css create mode 100644 deps/data-deps.txt create mode 100644 deps/jquery-3.6.0/jquery-3.6.0.js create mode 100644 deps/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 deps/jquery-3.6.0/jquery-3.6.0.min.map delete mode 100644 docsearch.css delete mode 100644 docsearch.js delete mode 100644 pkgdown.css create mode 100644 reference/backends_cudnn_is_available.html create mode 100644 reference/backends_cudnn_version.html create mode 100644 reference/call_torch_function.html create mode 100644 reference/cuda_get_device_capability.html create mode 100644 reference/cuda_memory_stats.html delete mode 100644 reference/figures/torch-full.png create mode 100644 reference/jit_save_for_mobile.html create mode 100644 reference/nn_flatten.html create mode 100644 reference/nn_unflatten.html create mode 100644 reference/nn_upsample.html delete mode 100644 reference/torch_fft.html delete mode 100644 reference/torch_ifft.html create mode 100644 reference/torch_install_path.html delete mode 100644 reference/torch_irfft.html delete mode 100644 reference/torch_rfft.html create mode 100644 search.json create mode 100644 sitemap.xml diff --git a/404.html b/404.html index 3ba21d986..6204d0019 100644 --- a/404.html +++ b/404.html @@ -1,217 +1,122 @@ - - - - + + + + - - + Page not found (404) • torch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - -
-
-
+
+ + +
-
- - - - +
- -
- +
+
+ - - diff --git a/CONTRIBUTING.html b/CONTRIBUTING.html index 7ee0fc664..e82b42c89 100644 --- a/CONTRIBUTING.html +++ b/CONTRIBUTING.html @@ -1,232 +1,126 @@ - - - - - - - -Contributing to torch • torch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Contributing to torch • torch - - - - - - - - - - -
-
-
+
+ +
+
-
- -
- +
+ - - - + diff --git a/LICENSE-text.html b/LICENSE-text.html index dfc578a82..b4fb5b505 100644 --- a/LICENSE-text.html +++ b/LICENSE-text.html @@ -1,219 +1,100 @@ - - - - - - - -License • torch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -License • torch - - - - - - - - - - -
-
-
+
+ +
+
-
- - - - -
+
- -
- +
+ - - - + diff --git a/LICENSE.html b/LICENSE.html index 92264f0a3..c8d67127f 100644 --- a/LICENSE.html +++ b/LICENSE.html @@ -1,185 +1,78 @@ - - - - - - - -MIT License • torch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -MIT License • torch - - - - - - - - - - -
-
-
+
+ +
+
-
- +
- +
- - -
- - -
-

Site built with pkgdown 1.6.1.

+ -
-
+
+ - - - + diff --git a/articles/distributions.html b/articles/distributions.html index 7f5bd9ee9..62761fda3 100644 --- a/articles/distributions.html +++ b/articles/distributions.html @@ -4,14 +4,14 @@ - + + Distributions • torch - - - + + + - - + + + - - - +
+ - -
-
- + diff --git a/articles/examples/basic-autograd.html b/articles/examples/basic-autograd.html index 986766368..37f5b0382 100644 --- a/articles/examples/basic-autograd.html +++ b/articles/examples/basic-autograd.html @@ -4,14 +4,14 @@ - + + basic-autograd • torch - - - + + + - - + + +
- -
- +
+ - -
-
- -
+ diff --git a/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.css b/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.js b/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/examples/basic-autograd_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/examples/basic-nn-module.html b/articles/examples/basic-nn-module.html index 5e00ff06e..402563bb0 100644 --- a/articles/examples/basic-nn-module.html +++ b/articles/examples/basic-nn-module.html @@ -4,14 +4,14 @@ - + + basic-nn-module • torch - - - + + + - - + + +
- -
- +
+ - -
-
- -
+ diff --git a/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.css b/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.js b/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/examples/basic-nn-module_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/examples/dataset.html b/articles/examples/dataset.html index 4d1dc1f16..85a6e85ff 100644 --- a/articles/examples/dataset.html +++ b/articles/examples/dataset.html @@ -4,14 +4,14 @@ - + + dataset • torch - - - + + + - - + + +
- -
- +
+ - -
-
- -
+ diff --git a/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.css b/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.js b/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/examples/dataset_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/examples/index.html b/articles/examples/index.html index 26ce1f2f4..6b8bb3e77 100644 --- a/articles/examples/index.html +++ b/articles/examples/index.html @@ -4,14 +4,14 @@ - + + Examples • torch - - - + + + - - + + +
- -
- +
+ - -
-
- -
+ diff --git a/articles/examples/index_files/anchor-sections-1.0/anchor-sections.css b/articles/examples/index_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/examples/index_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/examples/index_files/anchor-sections-1.0/anchor-sections.js b/articles/examples/index_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/examples/index_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/examples/mnist-cnn.html b/articles/examples/mnist-cnn.html deleted file mode 100644 index 8c102afbd..000000000 --- a/articles/examples/mnist-cnn.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - -mnist-cnn • torch - - - - - - - - - - -
-
- - - - -
-
- - - - -
dir <- "~/Downloads/mnist"
-
-ds <- mnist_dataset(
-  dir,
-  download = TRUE,
-  transform = function(x) {
-    x <- x$to(dtype = torch_float())/256
-    x[newaxis,..]
-  }
-)
-dl <- dataloader(ds, batch_size = 32, shuffle = TRUE)
-
-net <- nn_module(
-  "Net",
-  initialize = function() {
-    self$conv1 <- nn_conv2d(1, 32, 3, 1)
-    self$conv2 <- nn_conv2d(32, 64, 3, 1)
-    self$dropout1 <- nn_dropout2d(0.25)
-    self$dropout2 <- nn_dropout2d(0.5)
-    self$fc1 <- nn_linear(9216, 128)
-    self$fc2 <- nn_linear(128, 10)
-  },
-  forward = function(x) {
-    x <- self$conv1(x)
-    x <- nnf_relu(x)
-    x <- self$conv2(x)
-    x <- nnf_relu(x)
-    x <- nnf_max_pool2d(x, 2)
-    x <- self$dropout1(x)
-    x <- torch_flatten(x, start_dim = 2)
-    x <- self$fc1(x)
-    x <- nnf_relu(x)
-    x <- self$dropout2(x)
-    x <- self$fc2(x)
-    output <- nnf_log_softmax(x, dim=1)
-    output
-  }
-)
-
-model <- net()
-optimizer <- optim_sgd(model$parameters, lr = 0.01)
-
-epochs <- 10
-
-for (epoch in 1:10) {
-
-  pb <- progress::progress_bar$new(
-    total = length(dl),
-    format = "[:bar] :eta Loss: :loss"
-  )
-  l <- c()
-
-  for (b in enumerate(dl)) {
-    optimizer$zero_grad()
-    output <- model(b[[1]])
-    loss <- nnf_nll_loss(output, b[[2]])
-    loss$backward()
-    optimizer$step()
-    l <- c(l, loss$item())
-    pb$tick(tokens = list(loss = mean(l)))
-  }
-
-  cat(sprintf("Loss at epoch %d: %3f\n", epoch, mean(l)))
-}
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.5.1.

-
- -
-
- - - - - - diff --git a/articles/examples/mnist-cnn_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/examples/mnist-cnn_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/examples/mnist-cnn_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/examples/mnist-dcgan.html b/articles/examples/mnist-dcgan.html deleted file mode 100644 index a7a103c5d..000000000 --- a/articles/examples/mnist-dcgan.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - -mnist-dcgan • torch - - - - - - - - - - -
-
- - - - -
-
- - - - -
library(torch)
-
-dir <- "~/Downloads/mnist"
-
-ds <- mnist_dataset(
-  dir,
-  download = TRUE,
-  transform = function(x) {
-    x <- x$to(dtype = torch_float())/256
-    x <- 2*(x - 0.5)
-    x[newaxis,..]
-  }
-)
-dl <- dataloader(ds, batch_size = 32, shuffle = TRUE)
-
-generator <- nn_module(
-  "generator",
-  initialize = function(latent_dim, out_channels) {
-    self$main <- nn_sequential(
-      nn_conv_transpose2d(latent_dim, 512, kernel_size = 4,
-                          stride = 1, padding = 0, bias = FALSE),
-      nn_batch_norm2d(512),
-      nn_relu(),
-      nn_conv_transpose2d(512, 256, kernel_size = 4,
-                          stride = 2, padding = 1, bias = FALSE),
-      nn_batch_norm2d(256),
-      nn_relu(),
-      nn_conv_transpose2d(256, 128, kernel_size = 4,
-                          stride = 2, padding = 1, bias = FALSE),
-      nn_batch_norm2d(128),
-      nn_relu(),
-      nn_conv_transpose2d(128, out_channels, kernel_size = 4,
-                          stride = 2, padding = 3, bias = FALSE),
-      nn_tanh()
-    )
-  },
-  forward = function(input) {
-    self$main(input)
-  }
-)
-
-discriminator <- nn_module(
-  "discriminator",
-  initialize = function(in_channels) {
-    self$main <- nn_sequential(
-      nn_conv2d(in_channels, 16, kernel_size = 4, stride = 2, padding = 1, bias = FALSE),
-      nn_leaky_relu(0.2, inplace = TRUE),
-      nn_conv2d(16, 32, kernel_size = 4, stride = 2, padding = 1, bias = FALSE),
-      nn_batch_norm2d(32),
-      nn_leaky_relu(0.2, inplace = TRUE),
-      nn_conv2d(32, 64, kernel_size = 4, stride = 2, padding = 1, bias = FALSE),
-      nn_batch_norm2d(64),
-      nn_leaky_relu(0.2, inplace = TRUE),
-      nn_conv2d(64, 128, kernel_size = 4, stride = 2, padding = 1, bias = FALSE),
-      nn_leaky_relu(0.2, inplace = TRUE)
-    )
-    self$linear <- nn_linear(128, 1)
-    self$sigmoid <- nn_sigmoid()
-  },
-  forward = function(input) {
-    x <- self$main(input)
-    x <- torch_flatten(x, start_dim = 2)
-    x <- self$linear(x)
-    self$sigmoid(x)
-  }
-)
-
-plot_gen <- function(noise) {
-  img <- G(noise)
-  img <- img$cpu()
-  img <- img[1,1,,,newaxis]/2 + 0.5
-  img <- torch_stack(list(img, img, img), dim = 2)[..,1]
-  img <- as.raster(as_array(img))
-  plot(img)
-}
-
-device <- torch_device(ifelse(cuda_is_available(),  "cuda", "cpu"))
-
-G <- generator(latent_dim = 100, out_channels = 1)
-D <- discriminator(in_channels = 1)
-
-init_weights <- function(m) {
-  if (grepl("conv", m$.classes[[1]])) {
-    nn_init_normal_(m$weight$data(), 0.0, 0.02)
-  } else if (grepl("batch_norm", m$.classes[[1]])) {
-    nn_init_normal_(m$weight$data(), 1.0, 0.02)
-    nn_init_constant_(m$bias$data(), 0)
-  }
-}
-
-G[[1]]$apply(init_weights)
-D[[1]]$apply(init_weights)
-
-G$to(device = device)
-D$to(device = device)
-
-G_optimizer <- optim_adam(G$parameters, lr = 2 * 1e-4, betas = c(0.5, 0.999))
-D_optimizer <- optim_adam(D$parameters, lr = 2 * 1e-4, betas = c(0.5, 0.999))
-
-fixed_noise <- torch_randn(1, 100, 1, 1, device = device)
-
-loss <- nn_bce_loss()
-
-for (epoch in 1:10) {
-
-  pb <- progress::progress_bar$new(
-    total = length(dl),
-    format = "[:bar] :eta Loss D: :lossd Loss G: :lossg"
-  )
-  lossg <- c()
-  lossd <- c()
-
-  for (b in enumerate(dl)) {
-
-    y_real <- torch_ones(32, device = device)
-    y_fake <- torch_zeros(32, device = device)
-
-    noise <- torch_randn(32, 100, 1, 1, device = device)
-    fake <- G(noise)
-
-    img <- b[[1]]$to(device = device)
-
-    # train the discriminator ---
-    D_loss <- loss(D(img), y_real) + loss(D(fake$detach()), y_fake)
-
-    D_optimizer$zero_grad()
-    D_loss$backward()
-    D_optimizer$step()
-
-    # train the generator ---
-
-    G_loss <- loss(D(fake), y_real)
-
-    G_optimizer$zero_grad()
-    G_loss$backward()
-    G_optimizer$step()
-
-    lossd <- c(lossd, D_loss$item())
-    lossg <- c(lossg, G_loss$item())
-    pb$tick(tokens = list(lossd = mean(lossd), lossg = mean(lossg)))
-  }
-  plot_gen(fixed_noise)
-
-  cat(sprintf("Epoch %d - Loss D: %3f Loss G: %3f\n", epoch, mean(lossd), mean(lossg)))
-}
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.5.1.

-
- -
-
- - - - - - diff --git a/articles/examples/mnist-dcgan_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/examples/mnist-dcgan_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/examples/mnist-dcgan_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/examples/mnist-mlp.html b/articles/examples/mnist-mlp.html deleted file mode 100644 index df53285e9..000000000 --- a/articles/examples/mnist-mlp.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - -mnist-mlp • torch - - - - - - - - - - -
-
- - - - -
-
- - - - -
dir <- "~/Downloads/mnist"
-
-ds <- mnist_dataset(
-  dir,
-  download = TRUE,
-  transform = function(x) {
-    x$to(dtype = torch_float())/256
-  }
-)
-dl <- dataloader(ds, batch_size = 32, shuffle = TRUE)
-
-net <- nn_module(
-  "Net",
-  initialize = function() {
-    self$fc1 <- nn_linear(784, 128)
-    self$fc2 <- nn_linear(128, 10)
-  },
-  forward = function(x) {
-    x %>%
-      torch_flatten(start_dim = 2) %>%
-      self$fc1() %>%
-      nnf_relu() %>%
-      self$fc2() %>%
-      nnf_log_softmax(dim = 1)
-  }
-)
-
-model <- net()
-optimizer <- optim_sgd(model$parameters, lr = 0.01)
-
-epochs <- 10
-
-for (epoch in 1:10) {
-
-  pb <- progress::progress_bar$new(
-    total = length(dl),
-    format = "[:bar] :eta Loss: :loss"
-  )
-  l <- c()
-
-  for (b in enumerate(dl)) {
-    optimizer$zero_grad()
-    output <- model(b[[1]])
-    loss <- nnf_nll_loss(output, b[[2]])
-    loss$backward()
-    optimizer$step()
-    l <- c(l, loss$item())
-    pb$tick(tokens = list(loss = mean(l)))
-  }
-
-  cat(sprintf("Loss at epoch %d: %3f\n", epoch, mean(l)))
-}
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.5.1.

-
- -
-
- - - - - - diff --git a/articles/examples/mnist-mlp_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/examples/mnist-mlp_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/examples/mnist-mlp_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/extending-autograd.html b/articles/extending-autograd.html index 429b67d1e..e07b62b8e 100644 --- a/articles/extending-autograd.html +++ b/articles/extending-autograd.html @@ -4,14 +4,14 @@ - + + Extending Autograd • torch - - - + + + - - + + +
- -
- +
+ - -
-
- + diff --git a/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.css b/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.js b/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/extending-autograd_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/assets/mnist.png b/articles/getting-started/assets/mnist.png deleted file mode 100644 index 53c876a89d53ccb3ae4fb5167460e84248ad3672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42703 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

r(2@+= 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 - - - - - - -Autograd: automatic differentiation • torch - - - - - - - - - - - -

-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Soumith Chintala.

-
- -

Central to all neural networks in torch is the autograd functionality. Let’s first briefly visit this, and we will then go to training our first neural network.

-

Autograd provides automatic differentiation for all operations on Tensors. It is a define-by-run framework, which means that your backprop is defined by how your code is run, and that every single iteration can be different.

-

Let us see this in more simple terms with some examples.

-
-

-Tensor

-

torch_tensor is the central class of the package. If you set its attribute $requires_grad as TRUE, it starts to track all operations on it. When you finish your computation you can call $backward() and have all the gradients computed automatically. The gradient for this tensor will be accumulated into $grad attribute.

-

To stop a tensor from tracking history, you can call $detach() to detach it from the computation history, and to prevent future computation from being tracked.

-

To prevent tracking history (and using memory), you can also wrap the code block in with_no_grad({<code>}). This can be particularly helpful when evaluating a model because the model may have trainable parameters with requires_grad=TRUE, but for which we don’t need the gradients.

-

There’s one more class which is very important for autograd implementation - a autograd_function.

-

Tensor and Function are interconnected and build up an acyclic graph, that encodes a complete history of computation. Each tensor has a $grad_fn attribute that references an autograd_function that has created the Tensor (except for Tensors created by the user - their grad_fn is NULL).

-

If you want to compute the derivatives, you can call $backward() on a Tensor. If Tensor is a scalar (i.e. it holds a one element data), you don’t need to specify any arguments to backward(), however if it has more elements, you need to specify a gradient argument that is a tensor of matching shape.

-

Create a tensor and set requires_grad=TRUE to track computation with it:

-
-x <- torch_ones(2, 2, requires_grad = TRUE)
-x
-#> torch_tensor
-#>  1  1
-#>  1  1
-#> [ CPUFloatType{2,2} ]
-

Do a tensor operation:

-
-y <- x + 2
-y
-#> torch_tensor
-#>  3  3
-#>  3  3
-#> [ CPUFloatType{2,2} ]
-

y was created as a result of an operation, so it has a grad_fn.

-
-y$grad_fn
-#> AddBackward1
-

Do more operations on y

-
-z <- y * y * 3
-z
-#> torch_tensor
-#>  27  27
-#>  27  27
-#> [ CPUFloatType{2,2} ]
-out <- z$mean()
-out
-#> torch_tensor
-#> 27
-#> [ CPUFloatType{} ]
-

$requires_grad_( ... ) changes an existing Tensor’s requires_grad flag in-place. The input flag defaults to FALSE if not given.

-
-a <- torch_randn(2, 2)
-a <- (a * 3) / (a - 1)
-a$requires_grad
-#> [1] FALSE
-a$requires_grad_(TRUE)
-#> torch_tensor
-#>  1.6068  1.0066
-#> -0.8837  1.9715
-#> [ CPUFloatType{2,2} ]
-a$requires_grad
-#> [1] TRUE
-b <- (a * a)$sum()
-b$grad_fn
-#> SumBackward0
-
-
-

-Gradients

-

Let’s backprop now. Because out contains a single scalar, out$backward() is equivalent to out$backward(torch.tensor(1.)).

-
-out$backward()
-

Print gradients d(out)/dx

-
-x$grad
-#> torch_tensor
-#>  4.5000  4.5000
-#>  4.5000  4.5000
-#> [ CPUFloatType{2,2} ]
-

You should have got a matrix of 4.5. Let’s call the out Tensor \(o\).

-

We have that \(o = \frac{1}{4}\sum_i z_i\), \(z_i = 3(x_i+2)^2\) and \(z_i\bigr\rvert_{x_i=1} = 27\). Therefore, \(\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)\), hence \(\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 4.5\).

-

Mathematically, if you have a vector valued function \(\vec{y}=f(\vec{x})\), then the gradient of \(\vec{y}\) with respect to \(\vec{x}\) is a Jacobian matrix:

-

\[ - J=\left(\begin{array}{ccc} - \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}}\\ - \vdots & \ddots & \vdots\\ - \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} - \end{array}\right) -\]

-

Generally speaking, autograd is an engine for computing vector-Jacobian product. That is, given any vector \(v=\left(\begin{array}{cccc} v_{1} & v_{2} & \cdots & v_{m}\end{array}\right)^{T}\), compute the product \(v^{T}\cdot J\). If \(v\) happens to be the gradient of a scalar function \(l=g\left(\vec{y}\right)\), that is, \(v=\left(\begin{array}{ccc}\frac{\partial l}{\partial y_{1}} & \cdots & \frac{\partial l}{\partial y_{m}}\end{array}\right)^{T}\), then by the chain rule, the vector-Jacobian product would be the gradient of \(l\) with respect to \(\vec{x}\):

-

\[ - J^{T}\cdot v=\left(\begin{array}{ccc} - \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{1}}\\ - \vdots & \ddots & \vdots\\ - \frac{\partial y_{1}}{\partial x_{n}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} - \end{array}\right)\left(\begin{array}{c} - \frac{\partial l}{\partial y_{1}}\\ - \vdots\\ - \frac{\partial l}{\partial y_{m}} - \end{array}\right)=\left(\begin{array}{c} - \frac{\partial l}{\partial x_{1}}\\ - \vdots\\ - \frac{\partial l}{\partial x_{n}} - \end{array}\right) -\]

-

(Note that \(v^{T}\cdot J\) gives a row vector which can be treated as a column vector by taking \(J^{T}\cdot v\).)

-

This characteristic of vector-Jacobian product makes it very convenient to feed external gradients into a model that has non-scalar output.

-

Now let’s take a look at an example of vector-Jacobian product:

-
-x <- torch_randn(3, requires_grad=TRUE)
-y <- 100 * x
-y
-#> torch_tensor
-#>   -5.4368
-#>  105.8399
-#>  118.4054
-#> [ CPUFloatType{3} ]
-

Now in this case y is no longer a scalar. autograd could not compute the full Jacobian directly, but if we just want the vector-Jacobian product, simply pass the vector to backward as argument:

-
-v <- torch_tensor(c(0.1, 1.0, 0.0001))
-y$backward(v)
-
-x$grad
-#> torch_tensor
-#>  1.0000e+01
-#>  1.0000e+02
-#>  1.0000e-02
-#> [ CPUFloatType{3} ]
-

You can also stop autograd from tracking history on Tensors with $requires_grad=TRUE either by wrapping the code block in with with_no_grad():

-
-x$requires_grad
-#> [1] TRUE
-(x ** 2)$requires_grad
-#> [1] TRUE
-
-with_no_grad({
-  print((x ** 2)$requires_grad)
-})
-#> [1] FALSE
-
-x$requires_grad
-#> [1] TRUE
-y <- x$detach()
-y$requires_grad
-#> [1] FALSE
-x$eq(y)$all()
-#> torch_tensor
-#> 1
-#> [ CPUBoolType{} ]
-

Read Later:

-

Document about help(autograd_function), vignette("using-autograd"), vignette("extending-autograd").

-
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/autograd_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/autograd_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/autograd_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/autograd_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/control-flow-and-weight-sharing.html b/articles/getting-started/control-flow-and-weight-sharing.html deleted file mode 100644 index 8b24bb321..000000000 --- a/articles/getting-started/control-flow-and-weight-sharing.html +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - -Control flow & Weight sharing • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

As an example of dynamic graphs and weight sharing, we implement a very strange model: a fully-connected ReLU network that on each forward pass chooses a random number between 1 and 4 and uses that many hidden layers, reusing the same weights multiple times to compute the innermost hidden layers.

-

For this model we can use normal R flow control to implement the loop, and we can implement weight sharing among the innermost layers by simply reusing the same Module multiple times when defining the forward pass.

-

We can easily implement this model using nn_module:

-
-dynamic_net <- nn_module(
-   "dynamic_net",
-   # In the constructor we construct three nn_linear instances that we will use
-   # in the forward pass.
-   initialize = function(D_in, H, D_out) {
-      self$input_linear <- nn_linear(D_in, H)
-      self$middle_linear <- nn_linear(H, H)
-      self$output_linear <- nn_linear(H, D_out)
-   },
-   # For the forward pass of the model, we randomly choose either 0, 1, 2, or 3
-   # and reuse the middle_linear Module that many times to compute hidden layer
-   # representations.
-   # 
-   # Since each forward pass builds a dynamic computation graph, we can use normal
-   # R control-flow operators like loops or conditional statements when
-   # defining the forward pass of the model.
-   # 
-   # Here we also see that it is perfectly safe to reuse the same Module many
-   # times when defining a computational graph. This is a big improvement from Lua
-   # Torch, where each Module could be used only once.
-   forward = function(x) {
-      h_relu <- self$input_linear(x)$clamp(min = 0)
-      for (i in seq_len(sample.int(4, size = 1))) {
-         h_relu <- self$middle_linear(h_relu)$clamp(min=0)
-      }
-      y_pred <- self$output_linear(h_relu)
-      y_pred
-   }
-)
-
-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Construct our model by instantiating the class defined above
-model <- dynamic_net(D_in, H, D_out)
-
-# The nn package also contains definitions of popular loss functions; in this
-# case we will use Mean Squared Error (MSE) as our loss function.
-loss_fn <- nnf_mse_loss
-
-# Use the optim package to define an Optimizer that will update the weights of
-# the model for us. Here we will use Adam; the optim package contains many other
-# optimization algorithms. The first argument to the Adam constructor tells the
-# optimizer which Tensors it should update.
-learning_rate <- 1e-4
-optimizer <- optim_adam(model$parameters, lr=learning_rate)
-
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y by passing x to the model. Module objects
-   # can be called like functions. When doing so you pass a Tensor of input
-   # data to the Module and it produces a Tensor of output data.
-   y_pred <- model(x)
-   
-   # Compute and print loss. We pass Tensors containing the predicted and true
-   # values of y, and the loss function returns a Tensor containing the
-   # loss.
-   loss <- loss_fn(y_pred, y)
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Before the backward pass, use the optimizer object to zero all of the
-   # gradients for the variables it will update (which are the learnable
-   # weights of the model). This is because by default, gradients are
-   # accumulated in buffers( i.e, not overwritten) whenever $backward()
-   # is called. Checkout docs of `autograd_backward` for more details.
-   optimizer$zero_grad()
-
-   # Backward pass: compute gradient of the loss with respect to model
-   # parameters
-   loss$backward()
-
-   # Calling the step function on an Optimizer makes an update to its
-   # parameters
-   optimizer$step()
-}
-#> Step: 1 : 1.013146 
-#> Step: 100 : 0.9793269 
-#> Step: 200 : 0.4408751 
-#> Step: 300 : 0.1257476 
-#> Step: 400 : 0.05437518 
-#> Step: 500 : 0.01907376
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/control-flow-and-weight-sharing_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/control-flow-and-weight-sharing_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/control-flow-and-weight-sharing_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/control-flow-and-weight-sharing_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/custom-nn.html b/articles/getting-started/custom-nn.html deleted file mode 100644 index b0fae72be..000000000 --- a/articles/getting-started/custom-nn.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - -Custom nn modules • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

Sometimes you will want to specify models that are more complex than a sequence of existing Modules; for these cases you can define your own Modules by using nn_module function and defining a forward which receives input Tensors and produces output Tensors using other modules or other autograd operations on Tensors.

-

In this example we implement our two-layer network as a custom Module subclass:

-
-two_layer_net <- nn_module(
-   "two_layer_net",
-   initialize = function(D_in, H, D_out) {
-      self$linear1 <- nn_linear(D_in, H)
-      self$linear2 <- nn_linear(H, D_out)
-   },
-   forward = function(x) {
-      x %>% 
-         self$linear1() %>% 
-         nnf_relu() %>% 
-         self$linear2()
-   }
-)
-
-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Construct our model by instantiating the class defined above
-model <- two_layer_net(D_in, H, D_out)
-
-# The nn package also contains definitions of popular loss functions; in this
-# case we will use Mean Squared Error (MSE) as our loss function.
-loss_fn <- nnf_mse_loss
-
-# Use the optim package to define an Optimizer that will update the weights of
-# the model for us. Here we will use Adam; the optim package contains many other
-# optimization algorithms. The first argument to the Adam constructor tells the
-# optimizer which Tensors it should update.
-learning_rate <- 1e-4
-optimizer <- optim_sgd(model$parameters, lr=learning_rate)
-
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y by passing x to the model. Module objects
-   # can be called like functions. When doing so you pass a Tensor of input
-   # data to the Module and it produces a Tensor of output data.
-   y_pred <- model(x)
-   
-   # Compute and print loss. We pass Tensors containing the predicted and true
-   # values of y, and the loss function returns a Tensor containing the
-   # loss.
-   loss <- loss_fn(y_pred, y)
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Before the backward pass, use the optimizer object to zero all of the
-   # gradients for the variables it will update (which are the learnable
-   # weights of the model). This is because by default, gradients are
-   # accumulated in buffers( i.e, not overwritten) whenever $backward()
-   # is called. Checkout docs of `autograd_backward` for more details.
-   optimizer$zero_grad()
-
-   # Backward pass: compute gradient of the loss with respect to model
-   # parameters
-   loss$backward()
-
-   # Calling the step function on an Optimizer makes an update to its
-   # parameters
-   optimizer$step()
-}
-#> Step: 1 : 1.04628 
-#> Step: 100 : 1.033974 
-#> Step: 200 : 1.021832 
-#> Step: 300 : 1.009992 
-#> Step: 400 : 0.9984027 
-#> Step: 500 : 0.9870082
-

In the next example we will about dynamic graphs in torch.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/custom-nn_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/custom-nn_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/custom-nn_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/custom-nn_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/neural-networks.html b/articles/getting-started/neural-networks.html deleted file mode 100644 index afaa4302d..000000000 --- a/articles/getting-started/neural-networks.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - - - -Neural networks • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Soumith Chintala.

-
- -

Neural networks can be constructed using the nn functionality.

-

Now that you had a glimpse of autograd, nn depends on autograd to define models and differentiate them. An nn.Module contains layers, and a method forward(input) that returns the output.

-

For example, look at this network that classifies digit images:

-
-

Convnet for mnist classification

-
-

It is a simple feed-forward network. It takes the input, feeds it through several layers one after the other, and then finally gives the output.

-

A typical training procedure for a neural network is as follows:

-
    -
  • Define the neural network that has some learnable parameters (or weights)
  • -
  • Iterate over a dataset of inputs
  • -
  • Process input through the network
  • -
  • Compute the loss (how far is the output from being correct)
  • -
  • Propagate gradients back into the network’s parameters
  • -
  • Update the weights of the network, typically using a simple update rule: weight = weight - learning_rate * gradient.
  • -
-
-

-Define the network

-

Let’s define this network:

-
-Net <- nn_module(
-  initialize = function() {
-    self$conv1 = nn_conv2d(1, 6, 3)
-    self$conv2 = nn_conv2d(6, 16, 3)
-    # an affine operation: y = Wx + b
-    self$fc1 = nn_linear(16 * 6 * 6, 120)  # 6*6 from image dimension
-    self$fc2 = nn_linear(120, 84)
-    self$fc3 = nn_linear(84, 10)
-  },
-  forward = function(x) {
-    x %>% 
-      
-      self$conv1() %>% 
-      nnf_relu() %>% 
-      nnf_max_pool2d(c(2,2)) %>% 
-      
-      self$conv2() %>% 
-      nnf_relu() %>% 
-      nnf_max_pool2d(c(2,2)) %>% 
-      
-      torch_flatten(start_dim = 2) %>% 
-      
-      self$fc1() %>% 
-      nnf_relu() %>% 
-      
-      self$fc2() %>% 
-      nnf_relu() %>% 
-      
-      self$fc3()
-  }
-)
-
-net <- Net()
-

You just have to define the forward function, and the backward function (where gradients are computed) is automatically defined for you using autograd. You can use any of the Tensor operations in the forward function.

-

The learnable parameters of a model are returned by net$parameters.

-
-str(net$parameters)
-#> List of 10
-#>  $ conv1.weight:Float [1:6, 1:1, 1:3, 1:3]
-#>  $ conv1.bias  :Float [1:6]
-#>  $ conv2.weight:Float [1:16, 1:6, 1:3, 1:3]
-#>  $ conv2.bias  :Float [1:16]
-#>  $ fc1.weight  :Float [1:120, 1:576]
-#>  $ fc1.bias    :Float [1:120]
-#>  $ fc2.weight  :Float [1:84, 1:120]
-#>  $ fc2.bias    :Float [1:84]
-#>  $ fc3.weight  :Float [1:10, 1:84]
-#>  $ fc3.bias    :Float [1:10]
-

Let’s try a random 32x32 input. Note: expected input size of this net (LeNet) is 32x32. To use this net on the MNIST dataset, please resize the images from the dataset to 32x32.

-
-input <- torch_randn(1, 1, 32, 32)
-out <- net(input)
-out
-#> torch_tensor
-#>  0.0673 -0.0700  0.0210  0.1113  0.1069  0.0171  0.0774  0.0898 -0.0002  0.0961
-#> [ CPUFloatType{1,10} ]
-

Zero the gradient buffers of all parameters and backprops with random gradients:

-
-net$zero_grad()
-out$backward(torch_randn(1, 10))
-
-

Note: nn only supports mini-batches. The entire torch.nn package only supports inputs that are a mini-batch of samples, and not a single sample. For example, nn_conv2d will take in a 4D Tensor of nSamples x nChannels x Height x Width. If you have a single sample, just use input$unsqueeze(1) to add a fake batch dimension.

-
-

Before proceeding further, let’s recap all the classes you’ve seen so far.

-
-

-Recap

-
    -
  • torch_tensor - A multi-dimensional array with support for autograd operations like backward(). Also holds the gradient w.r.t. the tensor.

  • -
  • nn_module - Neural network module. Convenient way of encapsulating parameters, with helpers for moving them to GPU, exporting, loading, etc.

  • -
  • nn_parameter - A kind of Tensor, that is automatically registered as a parameter when assigned as an attribute to a Module.

  • -
  • autograd_function - Implements forward and backward definitions of an autograd operation. Every Tensor operation creates at least a single Function node that connects to functions that created a Tensor and encodes its history.

  • -
-
-
-

-At this point, we covered

-
    -
  • Defining a neural network
  • -
  • Processing inputs and calling backward
  • -
-
-
-

-Still left

-
    -
  • Computing the loss
  • -
  • Updating the weights of the network
  • -
-
-
-
-

-Loss function

-

A loss function takes the (output, target) pair of inputs, and computes a value that estimates how far away the output is from the target.

-

There are several different loss functions under the nn package . A simple loss is: nnf_mse_loss which computes the mean-squared error between the input and the target.

-

For example:

-
-output <- net(input)
-target <- torch_randn(10)  # a dummy target, for example
-target <- target$view(c(1, -1))  # make it the same shape as output
-
-loss <- nnf_mse_loss(output, target)
-loss
-#> torch_tensor
-#> 1.33572
-#> [ CPUFloatType{} ]
-

Now, if you follow loss in the backward direction, using its $grad_fn attribute, you will see a graph of computations that looks like this:

-
input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
-      -> view -> linear -> relu -> linear -> relu -> linear
-      -> MSELoss
-      -> loss
-

So, when we call loss$backward(), the whole graph is differentiated w.r.t. the loss, and all Tensors in the graph that has requires_grad=True will have their #grad Tensor accumulated with the gradient.

-

For illustration, let us follow a few steps backward:

-
-loss$grad_fn
-#> MseLossBackward
-loss$grad_fn$next_functions[[1]]
-#> AddmmBackward
-loss$grad_fn$next_functions[[1]]$next_functions[[1]]
-#> torch::autograd::AccumulateGrad
-
-
-

-Backprop

-

To backpropagate the error all we have to do is to loss$backward(). You need to clear the existing gradients though, else gradients will be accumulated to existing gradients.

-

Now we shall call loss$backward(), and have a look at conv1’s bias gradients before and after the backward.

-
-net$zero_grad()     # zeroes the gradient buffers of all parameters
-
-# conv1.bias.grad before backward
-net$conv1$bias$grad
-#> torch_tensor
-#>  0
-#>  0
-#>  0
-#>  0
-#>  0
-#>  0
-#> [ CPUFloatType{6} ]
-
-loss$backward()
-
-# conv1.bias.grad after backward
-net$conv1$bias$grad
-#> torch_tensor
-#> 0.01 *
-#> -0.4329
-#> -1.0576
-#>  0.9670
-#>  0.7630
-#> -0.6947
-#>  2.2084
-#> [ CPUFloatType{6} ]
-

Now, we have seen how to use loss functions.

-
-
-

-Update the weights

-

The simplest update rule used in practice is the Stochastic Gradient Descent (SGD):

-

\[weight = weight - learning_rate * gradient\]

-

We can implement this using simple R code:

-
-learning_rate <- 0.01
-for (f in net$parameters) {
-  with_no_grad({
-    f$sub_(f$grad * learning_rate)
-  })
-}
-
-

Note: Weight updates here is wraped around with_no_grad as we don’t the updates to be tracked by the autograd engine.

-
-

However, as you use neural networks, you want to use various different update rules such as SGD, Nesterov-SGD, Adam, RMSProp, etc.

-
-# create your optimizer
-optimizer <- optim_sgd(net$parameters, lr = 0.01)
-
-# in your training loop:
-optimizer$zero_grad()   # zero the gradient buffers
-output <- net(input)
-loss <- nnf_mse_loss(output, target)
-loss$backward()
-optimizer$step()    # Does the update
-#> NULL
-
-

Note: Observe how gradient buffers had to be manually set to zero using optimizer$zero_grad(). This is because gradients are accumulated as explained in the Backprop section.

-
-
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/neural-networks_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/neural-networks_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/neural-networks_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/neural-networks_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/new-autograd-functions.html b/articles/getting-started/new-autograd-functions.html deleted file mode 100644 index 2a87b30b2..000000000 --- a/articles/getting-started/new-autograd-functions.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - -Defining new autograd functions • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

Under the hood, each primitive autograd operator is really two functions that operate on Tensors. The forward function computes output Tensors from input Tensors. The backward function receives the gradient of the output Tensors with respect to some scalar value, and computes the gradient of the input Tensors with respect to that same scalar value.

-

In torch we can easily define our own autograd operator by defining a subclass of autograd_function and implementing the forward and backward functions. We can then use our new autograd operator by constructing an instance and calling it like a function, passing Tensors containing input data.

-

In this example we define our own custom autograd function for performing the ReLU nonlinearity, and use it to implement our two-layer network:

-
-# We can implement our own custom autograd Functions by subclassing
-# autograd_function and implementing the forward and backward passes
-# which operate on Tensors.
-my_relu <- autograd_function(
-   # In the forward pass we receive a Tensor containing the input and return
-   # a Tensor containing the output. ctx is a context object that can be used
-   # to stash information for backward computation. You can cache arbitrary
-   # objects for use in the backward pass using the ctx$save_for_backward method.
-   forward = function(ctx, input) {
-      ctx$save_for_backward(input = input)
-      input$clamp(min = 0)
-   },
-   # In the backward pass we receive a Tensor containing the gradient of the loss
-   # with respect to the output, and we need to compute the gradient of the loss
-   # with respect to the input.
-   backward = function(ctx, grad_output) {
-      v <- ctx$saved_variables
-      grad_input <- grad_output$clone()
-      grad_input[v$input < 0] <- 0
-      list(input = grad_input)
-   }
-)
-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Randomly initialize weights
-# Setting requires_grad=TRUE indicates that we want to compute gradients with
-# respect to these Tensors during the backward pass.
-w1 <- torch_randn(D_in, H, device=device, requires_grad = TRUE)
-w2 <- torch_randn(H, D_out, device=device, requires_grad = TRUE)
-
-learning_rate <- 1e-6
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y using operations on Tensors; these
-   # are exactly the same operations we used to compute the forward pass using
-   # Tensors, but we do not need to keep references to intermediate values since
-   # we are not implementing the backward pass by hand.
-   y_pred <- my_relu(x$mm(w1))$mm(w2)
-   
-   # Compute and print loss using operations on Tensors.
-   # Now loss is a Tensor of shape (1,)
-   loss <- (y_pred - y)$pow(2)$sum()
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Use autograd to compute the backward pass. This call will compute the
-   # gradient of loss with respect to all Tensors with requires_grad=True.
-   # After this call w1$grad and w2$grad will be Tensors holding the gradient
-   # of the loss with respect to w1 and w2 respectively.
-   loss$backward()
-   
-   # Manually update weights using gradient descent. Wrap in `with_no_grad`
-   # because weights have requires_grad=TRUE, but we don't need to track this
-   # in autograd.
-   # You can also use optim_sgd to achieve this.
-   with_no_grad({
-      
-      # operations suffixed with an `_` operates on in-place on the tensor.
-      w1$sub_(learning_rate * w1$grad)
-      w2$sub_(learning_rate * w2$grad)
-      
-      # Manually zero the gradients after updating weights
-      w1$grad$zero_()
-      w2$grad$zero_()
-   })
-}
-#> Step: 1 : 24166310 
-#> Step: 100 : 714.7551 
-#> Step: 200 : 6.447984 
-#> Step: 300 : 0.08702322 
-#> Step: 400 : 0.00166944 
-#> Step: 500 : 0.000139622
-

In the next example we will learn how to use the neural networks abstractions in torch.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/new-autograd-functions_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/new-autograd-functions_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/new-autograd-functions_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/new-autograd-functions_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/nn.html b/articles/getting-started/nn.html deleted file mode 100644 index 3c1ccb9fd..000000000 --- a/articles/getting-started/nn.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - -nn: neural networks with torch • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

Computational graphs and autograd are a very powerful paradigm for defining complex operators and automatically taking derivatives; however for large neural networks raw autograd can be a bit too low-level.

-

When building neural networks we frequently think of arranging the computation into layers, some of which have learnable parameters which will be optimized during learning.

-

In TensorFlow, packages like Keras, TensorFlow-Slim, and TFLearn provide higher-level abstractions over raw computational graphs that are useful for building neural networks.

-

In torch, the nn functionality serves this same purpose. The nn feature defines a set of Modules, which are roughly equivalent to neural network layers. A Module receives input Tensors and computes output Tensors, but may also hold internal state such as Tensors containing learnable parameters. The nn collection also defines a set of useful loss functions that are commonly used when training neural networks.

-

In this example we use nn to implement our two-layer network:

-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Use the nn package to define our model as a sequence of layers. nn_sequential
-# is a Module which contains other Modules, and applies them in sequence to
-# produce its output. Each Linear Module computes output from input using a
-# linear function, and holds internal Tensors for its weight and bias.
-model <- nn_sequential(
-    nn_linear(D_in, H),
-    nn_relu(),
-    nn_linear(H, D_out)
-)
-
-# The nn package also contains definitions of popular loss functions; in this
-# case we will use Mean Squared Error (MSE) as our loss function.
-loss_fn <- nnf_mse_loss
-
-learning_rate <- 1e-6
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y by passing x to the model. Module objects
-   # can be called like functions. When doing so you pass a Tensor of input
-   # data to the Module and it produces a Tensor of output data.
-   y_pred <- model(x)
-   
-   # Compute and print loss. We pass Tensors containing the predicted and true
-   # values of y, and the loss function returns a Tensor containing the
-   # loss.
-   loss <- loss_fn(y_pred, y)
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Zero the gradients before running the backward pass.
-   model$zero_grad()
-
-   # Backward pass: compute gradient of the loss with respect to all the learnable
-   # parameters of the model. Internally, the parameters of each Module are stored
-   # in Tensors with requires_grad=TRUE, so this call will compute gradients for
-   # all learnable parameters in the model.
-   loss$backward()
-   
-   # Update the weights using gradient descent. Each parameter is a Tensor, so
-   # we can access its gradients like we did before.
-   with_no_grad({
-      for (param in model$parameters) {
-         param$sub_(learning_rate * param$grad)
-      }
-   })
-}
-#> Step: 1 : 1.018742 
-#> Step: 100 : 1.018609 
-#> Step: 200 : 1.018475 
-#> Step: 300 : 1.018341 
-#> Step: 400 : 1.018206 
-#> Step: 500 : 1.018072
-

In the next example we will learn how to use optimizers implemented in torch.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/nn_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/nn_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/nn_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/nn_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/optim.html b/articles/getting-started/optim.html deleted file mode 100644 index 5d03d7e4e..000000000 --- a/articles/getting-started/optim.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - -optim: optimizers in torch • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

Up to this point we have updated the weights of our models by manually mutating the Tensors holding learnable parameters (with with_no_grad to avoid tracking history in autograd). This is not a huge burden for simple optimization algorithms like stochastic gradient descent, but in practice we often train neural networks using more sophisticated optimizers like AdaGrad, RMSProp, Adam, etc.

-

The optim package in torch abstracts the idea of an optimization algorithm and provides implementations of commonly used optimization algorithms.

-

In this example we will use the nn package to define our model as before, but we will optimize the model using the Adam algorithm provided by optim:

-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Use the nn package to define our model as a sequence of layers. nn_sequential
-# is a Module which contains other Modules, and applies them in sequence to
-# produce its output. Each Linear Module computes output from input using a
-# linear function, and holds internal Tensors for its weight and bias.
-model <- nn_sequential(
-    nn_linear(D_in, H),
-    nn_relu(),
-    nn_linear(H, D_out)
-)
-
-# The nn package also contains definitions of popular loss functions; in this
-# case we will use Mean Squared Error (MSE) as our loss function.
-loss_fn <- nnf_mse_loss
-
-# Use the optim package to define an Optimizer that will update the weights of
-# the model for us. Here we will use Adam; the optim package contains many other
-# optimization algorithms. The first argument to the Adam constructor tells the
-# optimizer which Tensors it should update.
-learning_rate <- 1e-4
-optimizer <- optim_adam(model$parameters, lr=learning_rate)
-
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y by passing x to the model. Module objects
-   # can be called like functions. When doing so you pass a Tensor of input
-   # data to the Module and it produces a Tensor of output data.
-   y_pred <- model(x)
-   
-   # Compute and print loss. We pass Tensors containing the predicted and true
-   # values of y, and the loss function returns a Tensor containing the
-   # loss.
-   loss <- loss_fn(y_pred, y)
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Before the backward pass, use the optimizer object to zero all of the
-   # gradients for the variables it will update (which are the learnable
-   # weights of the model). This is because by default, gradients are
-   # accumulated in buffers( i.e, not overwritten) whenever $backward()
-   # is called. Checkout docs of `autograd_backward` for more details.
-   optimizer$zero_grad()
-
-   # Backward pass: compute gradient of the loss with respect to model
-   # parameters
-   loss$backward()
-
-   # Calling the step function on an Optimizer makes an update to its
-   # parameters
-   optimizer$step()
-}
-#> Step: 1 : 0.9679546 
-#> Step: 100 : 0.06467929 
-#> Step: 200 : 0.0009209086 
-#> Step: 300 : 9.68739e-06 
-#> Step: 400 : 3.821675e-07 
-#> Step: 500 : 1.036825e-08
-

In the next example we will learn how to create custom nn_modules.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/optim_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/optim_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/optim_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/optim_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/tensors-and-autograd.html b/articles/getting-started/tensors-and-autograd.html deleted file mode 100644 index 79b24c058..000000000 --- a/articles/getting-started/tensors-and-autograd.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - -Tensors and autograd • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

In the previous examples, we had to manually implement both the forward and backward passes of our neural network. Manually implementing the backward pass is not a big deal for a small two-layer network, but can quickly get very hairy for large complex networks.

-

Thankfully, we can use automatic differentiation to automate the computation of backward passes in neural networks. The autograd feature in torch provides exactly this functionality. When using autograd, the forward pass of your network will define a computational graph; nodes in the graph will be Tensors, and edges will be functions that produce output Tensors from input Tensors. Backpropagating through this graph then allows you to easily compute gradients.

-

This sounds complicated, it’s pretty simple to use in practice. Each Tensor represents a node in a computational graph. If x is a Tensor that has x$requires_grad=TRUE then x$grad is another Tensor holding the gradient of x with respect to some scalar value.

-

Here we use torch Tensors and autograd to implement our two-layer network; now we no longer need to manually implement the backward pass through the network:

-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-# Setting requires_grad=FALSE (the default) indicates that we do not need to 
-# compute gradients with respect to these Tensors during the backward pass.
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Randomly initialize weights
-# Setting requires_grad=TRUE indicates that we want to compute gradients with
-# respect to these Tensors during the backward pass.
-w1 <- torch_randn(D_in, H, device=device, requires_grad = TRUE)
-w2 <- torch_randn(H, D_out, device=device, requires_grad = TRUE)
-
-learning_rate <- 1e-6
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y using operations on Tensors; these
-   # are exactly the same operations we used to compute the forward pass using
-   # Tensors, but we do not need to keep references to intermediate values since
-   # we are not implementing the backward pass by hand.
-   y_pred <- x$mm(w1)$clamp(min=0)$mm(w2)
-   
-   # Compute and print loss using operations on Tensors.
-   # Now loss is a Tensor of shape (1,)
-   loss <- (y_pred - y)$pow(2)$sum()
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", as.numeric(loss), "\n")
-   
-   # Use autograd to compute the backward pass. This call will compute the
-   # gradient of loss with respect to all Tensors with requires_grad=True.
-   # After this call w1$grad and w2$grad will be Tensors holding the gradient
-   # of the loss with respect to w1 and w2 respectively.
-   loss$backward()
-   
-   # Manually update weights using gradient descent. Wrap in `with_no_grad`
-   # because weights have requires_grad=TRUE, but we don't need to track this
-   # in autograd.
-   # You can also use optim_sgd to achieve this.
-   with_no_grad({
-      
-      # operations suffixed with an `_` operates on in-place on the tensor.
-      w1$sub_(learning_rate * w1$grad)
-      w2$sub_(learning_rate * w2$grad)
-      
-      # Manually zero the gradients after updating weights
-      w1$grad$zero_()
-      w2$grad$zero_()
-   })
-}
-#> Step: 1 : 24573142 
-#> Step: 100 : 423.7524 
-#> Step: 200 : 1.833858 
-#> Step: 300 : 0.01267943 
-#> Step: 400 : 0.0002803126 
-#> Step: 500 : 4.453462e-05
-

In the next example we will learn how to create new autograd functions.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/tensors-and-autograd_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/tensors-and-autograd_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/tensors-and-autograd_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/tensors-and-autograd_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/tensors.html b/articles/getting-started/tensors.html deleted file mode 100644 index b415a6d1e..000000000 --- a/articles/getting-started/tensors.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - -torch Tensors • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

R arrays are great, but they cannot utilize GPUs to accelerate its numerical computations. For modern deep neural networks, GPUs often provide speedups of 50x or greater, so unfortunately pure R won’t be enough for modern deep learning.

-

Here we introduce the most fundamental torch concept: the Tensor. A torch Tensor is conceptually similar to an R array: a Tensor is an n-dimensional array, and torch provides many functions for operating on these Tensors. Behind the scenes, Tensors can keep track of a computational graph and gradients, but they’re also useful as a generic tool for scientific computing.

-

Also unlike R, torch Tensors can utilize GPUs to accelerate their numeric computations. To run a torch Tensor on GPU, you simply need to cast it to a new datatype.

-

Here we use torch Tensors to fit a two-layer network to random data. Like the R before we need to manually implement the forward and backward passes through the network:

-
-if (cuda_is_available()) {
-   device <- torch_device("cuda")
-} else {
-   device <- torch_device("cpu")
-}
-   
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-x <- torch_randn(N, D_in, device=device)
-y <- torch_randn(N, D_out, device=device)
-
-# Randomly initialize weights
-w1 <- torch_randn(D_in, H, device=device)
-w2 <- torch_randn(H, D_out, device=device)
-
-learning_rate <- 1e-6
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y
-   h <- x$mm(w1)
-   h_relu <- h$clamp(min=0)
-   y_pred <- h_relu$mm(w2)
-   
-   # Compute and print loss
-   loss <- as.numeric((y_pred - y)$pow(2)$sum())
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", loss, "\n")
-   
-   # Backprop to compute gradients of w1 and w2 with respect to loss
-   grad_y_pred <- 2.0 * (y_pred - y)
-   grad_w2 <- h_relu$t()$mm(grad_y_pred)
-   grad_h_relu <- grad_y_pred$mm(w2$t())
-   grad_h <- grad_h_relu$clone()
-   grad_h[h < 0] <- 0
-   grad_w1 <- x$t()$mm(grad_h)
-   
-   # Update weights using gradient descent
-   w1 <- w1 - learning_rate * grad_w1
-   w2 <- w2 - learning_rate * grad_w2
-}
-#> Step: 1 : 28228804 
-#> Step: 100 : 330.6301 
-#> Step: 200 : 1.205863 
-#> Step: 300 : 0.006815678 
-#> Step: 400 : 0.0001808387 
-#> Step: 500 : 3.467693e-05
-

In the next example we will use autograd instead of computing the gradients manually.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/tensors_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/tensors_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/tensors_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/tensors_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/warmup.html b/articles/getting-started/warmup.html deleted file mode 100644 index 1371db25b..000000000 --- a/articles/getting-started/warmup.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - -Warm-up • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Justin Johnson.

-
- -

A fully-connected ReLU network with one hidden layer and no biases, trained to predict y from x using Euclidean error.

-

This implementation uses pure R to manually compute the forward pass, loss, and backward pass.

-

An R array is a generic n-dimensional array; it does not know anything about deep learning or gradients or computational graphs, and is just a way to perform generic numeric computations.

-
-# N is batch size; D_in is input dimension;
-# H is hidden dimension; D_out is output dimension.
-N <- 64
-D_in <- 1000
-H <- 100
-D_out <- 10
-
-# Create random input and output data
-x <- array(rnorm(N*D_in), dim = c(N, D_in))
-y <- array(rnorm(N*D_out), dim = c(N, D_out))
-
-# Randomly initialize weights
-w1 <- array(rnorm(D_in*H), dim = c(D_in, H))
-w2 <- array(rnorm(H*D_out), dim = c(H, D_out))
-
-learning_rate <- 1e-6
-for (t in seq_len(500)) {
-   # Forward pass: compute predicted y
-   h <- x %*% w1
-   h_relu <- ifelse(h < 0, 0, h)
-   y_pred <- h_relu %*% w2
-   
-   # Compute and print loss
-   loss <- sum((y_pred - y)^2)
-   if (t %% 100 == 0 || t == 1)
-      cat("Step:", t, ":", loss, "\n")
-   
-   # Backprop to compute gradients of w1 and w2 with respect to loss
-   grad_y_pred <- 2 * (y_pred - y)
-   grad_w2 <- t(h_relu) %*% grad_y_pred
-   grad_h_relu <- grad_y_pred %*% t(w2)
-   grad_h <- grad_h_relu
-   grad_h[h < 0] <- 0
-   grad_w1 <- t(x) %*% grad_h
-   
-   # Update weights
-   w1 <- w1 - learning_rate * grad_w1
-   w2 <- w2 - learning_rate * grad_w2
-}
-#> Step: 1 : 24029709 
-#> Step: 100 : 553.7803 
-#> Step: 200 : 1.694745 
-#> Step: 300 : 0.0077663 
-#> Step: 400 : 5.43958e-05 
-#> Step: 500 : 6.158879e-07
-

In the next example we will replace the R array for a torch Tensor.

-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/warmup_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/warmup_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/warmup_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/warmup_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/getting-started/what-is-torch.html b/articles/getting-started/what-is-torch.html deleted file mode 100644 index e31fd5e3d..000000000 --- a/articles/getting-started/what-is-torch.html +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - -What is torch? • torch - - - - - - - - - - - -
-
- - - - -
-
-
- - - - -
-

Note: This is an R port of the official tutorial available here. All credits goes to Soumith Chintala.

-
- -

It’s a scientific computing package targeted at two sets of audiences:

-
    -
  • An array library to use the power of GPUs
  • -
  • a deep learning research platform that provides maximum flexibility and speed
  • -
-
-

-Getting started

-
-

-Tensors

-

Tensors are similar to R arrays, with the addition being that Tensors can also be used on a GPU to accelerate computing.

-
-

Note: An uninitialized matrix is declared, but does not contain definite known values before it is used. When an uninitialized matrix is created, whatever values were in the allocated memory at the time will appear as the initial values.

-
-

Construct a 5x3 matrix, uninitialized:

-
-x <- torch_empty(5, 3)
-x
-#> torch_tensor
-#>  0.0000e+00  8.5899e+09 -2.5192e-13
-#>  1.0845e-19  1.1210e-44  1.6816e-43
-#>  7.1466e-44  4.4842e-44  1.5274e-43
-#>  1.3593e-43  1.6255e-43  1.5975e-43
-#>  1.4714e-43  1.6816e-43  6.1657e-44
-#> [ CPUFloatType{5,3} ]
-

Construct a randomly initialized matrix:

-
-x <- torch_rand(5, 3)
-x
-#> torch_tensor
-#>  0.8047  0.9970  0.3180
-#>  0.2996  0.6715  0.8695
-#>  0.9981  0.0952  0.8207
-#>  0.7128  0.9619  0.6479
-#>  0.4912  0.9580  0.4217
-#> [ CPUFloatType{5,3} ]
-

Construct a matrix filled zeros and of dtype long:

-
-x <- torch_zeros(5, 3, dtype = torch_long())
-x
-#> torch_tensor
-#>  0  0  0
-#>  0  0  0
-#>  0  0  0
-#>  0  0  0
-#>  0  0  0
-#> [ CPULongType{5,3} ]
-

Construct a tensor directly from data:

-
-x <- torch_tensor(c(5.5, 3))
-x
-#> torch_tensor
-#>  5.5000
-#>  3.0000
-#> [ CPUFloatType{2} ]
-

or create a tensor based on an existing tensor. These methods will reuse properties of the input tensor, e.g. dtype, unless new values are provided by user

-
-x <- torch_randn_like(x, dtype = torch_float()) # override dtype!
-x                                               # result has the same size
-#> torch_tensor
-#> -1.2922
-#> -0.6301
-#> [ CPUFloatType{2} ]
-

Get its size:

-
-x$size()
-#> [1] 2
-
-
-

-Operations

-

There are multiple syntaxes for operations. In the following example, we will take a look at the addition operation.

-

Addition: syntax 1

-
-x <- torch_rand(5, 3)
-y <- torch_rand(5, 3)
-x + y
-#> torch_tensor
-#>  0.1534  0.5196  1.1073
-#>  1.1957  0.8504  1.1173
-#>  1.0868  1.1021  1.8485
-#>  0.4676  1.0156  0.2103
-#>  1.0188  1.1065  0.8460
-#> [ CPUFloatType{5,3} ]
-

Addition: syntax 2

-
-torch_add(x, y)
-#> torch_tensor
-#>  0.1534  0.5196  1.1073
-#>  1.1957  0.8504  1.1173
-#>  1.0868  1.1021  1.8485
-#>  0.4676  1.0156  0.2103
-#>  1.0188  1.1065  0.8460
-#> [ CPUFloatType{5,3} ]
-

Addition: in-place

-
-y$add_(x)
-#> torch_tensor
-#>  0.1534  0.5196  1.1073
-#>  1.1957  0.8504  1.1173
-#>  1.0868  1.1021  1.8485
-#>  0.4676  1.0156  0.2103
-#>  1.0188  1.1065  0.8460
-#> [ CPUFloatType{5,3} ]
-y
-#> torch_tensor
-#>  0.1534  0.5196  1.1073
-#>  1.1957  0.8504  1.1173
-#>  1.0868  1.1021  1.8485
-#>  0.4676  1.0156  0.2103
-#>  1.0188  1.1065  0.8460
-#> [ CPUFloatType{5,3} ]
-
-

Note: Any operation that mutates a tensor in-place is post-fixed with an _. For example: x$copy_(y), x$t_(), will change x.

-
-

You can use standard R-like indexing with all bells and whistles! See more about indexing with vignette("indexing").

-
-x[, 1]
-#> torch_tensor
-#>  0.0319
-#>  0.2944
-#>  0.7091
-#>  0.2032
-#>  0.4828
-#> [ CPUFloatType{5} ]
-

Resizing: If you want to resize/reshape tensor, you can use torch_view:

-
-x <- torch_randn(4, 4)
-y <- x$view(16)
-z <- x$view(size = c(-1, 8))  # the size -1 is inferred from other dimensions
-x$size()
-#> [1] 4 4
-y$size()
-#> [1] 16
-z$size()
-#> [1] 2 8
-

If you have a one element tensor, use $item() to get the value as an R number

-
-x <- torch_randn(1)
-x
-#> torch_tensor
-#> -0.4257
-#> [ CPUFloatType{1} ]
-x$item()
-#> [1] -0.4256831
-

You can find a complete list of operations in the reference page.

-
-
-
-

-R bridge

-

Converting a Torch Tensor to an R array and vice versa is a breeze.

-
-

-Converting a torch tensor into an R array

-
-a <- torch_ones(5)
-a
-#> torch_tensor
-#>  1
-#>  1
-#>  1
-#>  1
-#>  1
-#> [ CPUFloatType{5} ]
-
-b <- as_array(a)
-b
-#> [1] 1 1 1 1 1
-
-
-

-Converting R arrays to torch tensors

-
-a <- rep(1, 5)
-a
-#> [1] 1 1 1 1 1
-b <- torch_tensor(a)
-b
-#> torch_tensor
-#>  1
-#>  1
-#>  1
-#>  1
-#>  1
-#> [ CPUFloatType{5} ]
-

Currently supported types are numerics and boolean types.

-
-
-
-

-CUDA tensors

-

Tensors can be moved onto any device using the $to method.

-
-if (cuda_is_available()) {
-  device <- torch_device("cuda")
-  y <- torch_ones_like(x, device = device)  # directly create a tensor on GPU
-  x <- x$to(device)                       # or just use strings ``.to("cuda")``
-  z <- x + y
-  print(z)
-  print(z$to(device = "cpu", torch_double())) # `$to` can also change dtype together!
-}
-
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/articles/getting-started/what-is-torch_files/accessible-code-block-0.0.1/empty-anchor.js b/articles/getting-started/what-is-torch_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100644 index ca349fd6a..000000000 --- a/articles/getting-started/what-is-torch_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.css b/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.css deleted file mode 100644 index 07aee5fcb..000000000 --- a/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.css +++ /dev/null @@ -1,4 +0,0 @@ -/* Styles for section anchors */ -a.anchor-section {margin-left: 10px; visibility: hidden; color: inherit;} -a.anchor-section::before {content: '#';} -.hasAnchor:hover a.anchor-section {visibility: visible;} diff --git a/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.js b/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.js deleted file mode 100644 index 570f99a0a..000000000 --- a/articles/getting-started/what-is-torch_files/anchor-sections-1.0/anchor-sections.js +++ /dev/null @@ -1,33 +0,0 @@ -// Anchor sections v1.0 written by Atsushi Yasumoto on Oct 3rd, 2020. -document.addEventListener('DOMContentLoaded', function() { - // Do nothing if AnchorJS is used - if (typeof window.anchors === 'object' && anchors.hasOwnProperty('hasAnchorJSLink')) { - return; - } - - const h = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - // Do nothing if sections are already anchored - if (Array.from(h).some(x => x.classList.contains('hasAnchor'))) { - return null; - } - - // Use section id when pandoc runs with --section-divs - const section_id = function(x) { - return ((x.classList.contains('section') || (x.tagName === 'SECTION')) - ? x.id : ''); - }; - - // Add anchors - h.forEach(function(x) { - const id = x.id || section_id(x.parentElement); - if (id === '') { - return null; - } - let anchor = document.createElement('a'); - anchor.href = '#' + id; - anchor.classList = ['anchor-section']; - x.classList.add('hasAnchor'); - x.appendChild(anchor); - }); -}); diff --git a/articles/index.html b/articles/index.html index 09a605467..4aeacb292 100644 --- a/articles/index.html +++ b/articles/index.html @@ -1,244 +1,130 @@ - - - - - - - -Articles • torch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Articles • torch - - - - - - - - - - -
-
-
+
+ +
+
+ + +
- -
- - -
-

Site built with pkgdown 1.6.1.

+ -
-
+
+ - - - + diff --git a/articles/indexing.html b/articles/indexing.html index d01fce698..570526c90 100644 --- a/articles/indexing.html +++ b/articles/indexing.html @@ -4,14 +4,14 @@ - + + Indexing tensors • torch - - - + + + - - + + +
- -
- +
+ - -
-
-