GithubHelp home page GithubHelp logo

mansimov / unsupervised-videos Goto Github PK

View Code? Open in Web Editor NEW
354.0 13.0 112.0 938 KB

Unsupervised Learning of Video Representations using LSTMs

Home Page: http://arxiv.org/abs/1502.04681

License: MIT License

Makefile 0.08% Python 11.39% Cuda 74.97% Objective-C 13.56%

unsupervised-videos's Introduction

Unsupervised Learning of Video Representations using LSTMs

Code for paper Unsupervised Learning of Video Representations using LSTMs by Nitish Srivastava, Elman Mansimov, Ruslan Salakhutdinov; ICML 2015.

We use multilayer Long Short Term Memory (LSTM) networks to learn representations of video sequences. The representation can be used to perform different tasks, such as reconstructing the input sequence, predicting the future sequence, or for classification. Examples:

mnist gif1 mnist gif2 ucf101 gif1 ucf101 gif2

Note that the code at this link is deprecated.

Getting Started

To compile cudamat library you need to modify CUDA_ROOT in cudamat/Makefile to the relevant cuda root path.

The libraries you need to install are:

  • h5py (HDF5 (>= 1.8.11))
  • google.protobuf (Protocol Buffers (>= 2.5.0))
  • numpy
  • matplotlib

Next compile .proto file by calling

protoc -I=./ --python_out=./ config.proto

Depending on the task, you would need to download the following dataset files. These can be obtained by running:

wget http://www.cs.toronto.edu/~emansim/datasets/mnist.h5
wget http://www.cs.toronto.edu/~emansim/datasets/bouncing_mnist_test.npy
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_train_patches.npy
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_valid_patches.npy
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_train_features.h5
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_train_labels.txt
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_train_num_frames.txt
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_valid_features.h5
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_valid_labels.txt
wget http://www.cs.toronto.edu/~emansim/datasets/ucf101_sample_valid_num_frames.txt

Note to Toronto users: You don't need to download any files, as they are available in my gobi3 repository and are already set up.

Bouncing (Moving) MNIST dataset

To train a sample model on this dataset you need to set correct data_file in datasets/bouncing_mnist_valid.pbtxt and then run (you may need to change the board id of gpu):

python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1

After training the model and setting correct path to trained weights in models/lstm_combo_1layer_mnist_pretrained.pbtxt, you can visualize the sample reconstruction and future prediction results of the pretrained model by running:

python display_results.py models/lstm_combo_1layer_mnist_pretrained.pbtxt datasets/bouncing_mnist_valid.pbtxt 1

Below are the sample results, where first image is reference image and second image is prediction of the model. Note that first ten frames are reconstructions, whereas the last ten frames are future predictions.

original recon

Video patches

Due to the size constraints, I only managed to upload a small sample dataset of UCF-101 patches. The trained model is overfitting, so this example is just meant for instructional purposes. The setup is the same as in Bouncing MNIST dataset.

To train the model run:

python lstm_combo.py models/lstm_combo_1layer_ucf101_patches.pbtxt datasets/ucf101_patches.pbtxt datasets/ucf101_patches_valid.pbtxt 1

To see the results run:

python display_results.py models/lstm_combo_1layer_ucf101_pretrained.pbtxt datasets/ucf101_patches_valid.pbtxt 1

original recon

Classification using high level representations ('percepts') of video frames

Again, as in the case of UCF-101 patches, I was able to upload a very small subset of fc6 features of video frames extracted using VGG network. To train the classifier run:

python lstm_classifier.py models/lstm_classifier_1layer_ucf101_features.pbtxt datasets/ucf101_features.pbtxt datasets/ucf101_features_valid.pbtxt 1

Reference

If you found this code or our paper useful, please consider citing the following paper:

@inproceedings{srivastava15_unsup_video,
  author    = {Nitish Srivastava and Elman Mansimov and Ruslan Salakhutdinov},
  title     = {Unsupervised Learning of Video Representations using {LSTM}s},
  booktitle = {ICML},
  year      = {2015}
}

unsupervised-videos's People

Contributors

jbboin avatar mansimov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

unsupervised-videos's Issues

libcudamat.so?

Hi,

I tried to run lstm_combo.py, but I got the error: OSError: dlopen(/Users/yantian/Google Drive/Yantian/DL/unsupervised-videos-master/cudamat/libcudamat.so, 6): image not found

Where can I get libcudamat.so? Thank you in advance!

Data format

Does anyone know how data is stored in both Moving MNIST and UFC101 datasets? I want to try on my own data.

Thanks,

Questions regarding some design decisions used to train MovingMNIST in the paper

Hi,

I have a couple of questions regarding some design decisions of this paper/model to train on MovingMNIST:

  1. Why is cross-entropy loss used for MovingMNIST, while squared error is used for natural images. Is there a reason why you did not use the same loss function for both?
  2. In the training, you are using the ground truth frames as input for the future-predictor and the previously predicted frame as its input when testing/validating the model. But when I try this on my own model, it always ends up that only the first predicted frame is very good, but the quality decreases very fast. In consequence, the model does not seam to learn the motion correctly. But on the other side, when I use the previously predicted frames for the input to the future-predictor already on training, I get much better results. Is there a reason to not use the previously predicted frames in training already?
  3. Looking at the model configurations, the max_iterations are set to 10,000,000. Are the results given in the paper taken from a model that was trained that long? Or for how many steps did you actually train the models? Or did you use an early stopping criteria?

Thx!

invalid device function{cm.CUDAMatrix.init_random(42)} cudamat.cudamat.CUDAMatException: CUDA error: no error

python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 0
Using board 0
invalid device function
Traceback (most recent call last):
File "lstm_combo.py", line 405, in
cm.CUDAMatrix.init_random(42)
File "/home/weihaoxie/unsupervised-videos/cudamat/cudamat.py", line 382, in init_random
raise generate_exception(err_code)
cudamat.cudamat.CUDAMatException: CUDA error: no error

no kernel image is available for execution on the device

when I run
python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1
I got this errror
"no kernel image is available for execution on the device"
my environment is
ubuntu16.10/1080ti/cuda9.1/anaconda2/python2.7

Training with new dataset

Hi,
Thank you very much for providing the code for the paper. I have a small doubt regarding using your code to predict video frames on some other video dataset. Could you kindly share some insight on how to do that?
Also, could you kindly tell me if the .npy file contains videos (in frames) of the entire videos in dataset like in a 5-D matrix (video_number,frame_no,channels,height,width) format?
Thank you very much.

Make the file Makefile in the folder cudamat

Hello Emansim and other friends,

I'm almost mad about this question and I've spent almost one week on it. This is a course project for one Master course in my university, and I have to reproduce the similar results to those in the paper.But this due time is drawing near while I'm stuck at the beginning of this project. I'm new to makefile, LSTM, google protobuf, so, please give me a hand.

Firstly, let me introduce my computer hardware and software configuration:
Windows 7 Enterprise 64-bit operating system
CUDA Toolkit v6.5
NVIDIA Quadro FX 4800 (Version 340.62)
Microsoft Visual Studio Ultimate 2013
Microsoft SDK v8.1 (Framework v4.0)
Python2.7.8
mingw32-make(after install mingw-w64-installer)

Secondly, let me introduce the steps to make Makefile in the folder cudamat:

  1. open the cmd command shell;
  2. cd to the directory of Makefile, i.e. C:\Users\david\Desktop\unsupervised-videos-master\cudamat
  3. run the command: mingw32-make.exe -f Makefile
    The error below always occures:
    error

Could anyone give me a hand? Thanks in advance.

@emansim

no eps decay?

Hi, I know you guys don't answer a lot but I'll give it a shot anyway:

In util.py:

  def Update(self):
    if self.eps_decay_after > 0:
      eps = self.eps_ * np.power(self.eps_decay_factor, self.t_ / self.eps_decay_after)
    else:
      eps = self.eps_

The local variable eps is never used inside the Update() function. Thus there's no learning rate decay. Is there a reason for not decaying it?
Thank you.

Questions about LSTM_classifier

  1. The authors mentioned about "We initialize an LSTM classifier with the weights learned by the encoder LSTM from this model. "in their paper, but I am a beginner and I don't understand how to initialize the lstm classifier?

  2. The Figure 6 shows that the lstm classifier is two layers ,could your tell how to implement it ?

Is there anyone can help me with this? Thanks a lot.

@emansim

Extrpolating matrices

Instead of giving videos, how do we test with normal matrices? for examples if i am giving 5x5 matrix then is there a way to get (let's say) a 8x8 matrix? (trained with other 5x5 matrix)

ImportError: No module named config_pb2, what's the package name?

envy@ub1404:/os_pri/github/unsupervised-videos$ python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1
Traceback (most recent call last):
File "lstm_combo.py", line 1, in
from data_handler import *
File "/home/envy/os_pri/github/unsupervised-videos/data_handler.py", line 3, in
from util import *
File "/home/envy/os_pri/github/unsupervised-videos/util.py", line 16, in
import config_pb2
ImportError: No module named config_pb2
envy@ub1404:
/os_pri/github/unsupervised-videos$

cudamat.cudamat.CUDAMatException: CUDA error: no error

I am using an Amazon Machine Image (AMI) to launch a GPU instance on Amazon EC2 with CUDA 7.5 and the required libraries installed. When I type make in your cudamat directory, everything appears to work. I am able to compile the .proto file and download the datasets. However, when I attempt to train a model, I get this error:

ubuntu@ip-172-31-9-162:~/unsupervised-videos-master$ python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1
invalid device ordinal
Traceback (most recent call last):
File "lstm_combo.py", line 402, in
board = LockGPU(board=board_id)
File "/home/ubuntu/unsupervised-videos-master/util.py", line 144, in LockGPU
cm.cuda_set_device(board)
File "/home/ubuntu/unsupervised-videos-master/cudamat/cudamat.py", line 2273, in cuda_set_device
raise generate_exception(err_code)
cudamat.cudamat.CUDAMatException: CUDA error: no error

Is your cudamat setup compatible with CUDA 7.5? Is it necessary to use your custom directory?

Can you help me find the source of this error? I'd appreciate it very much.

Best,
Tina

libcudamat_conv_gemm.so

Hi Emansim,

I try to train a model on MNIST dataset, but I cannot find libcudamat_conv_gemm.so.

Can you please help me to figure out what's happening?

Cheers,

Chengcheng

python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 0
Traceback (most recent call last):
File "lstm_combo.py", line 1, in
from data_handler import *
File "/home/smile/project/unsupervised-videos-master/data_handler.py", line 3, in
from util import *
File "/home/smile/project/unsupervised-videos-master/util.py", line 4, in
from cudamat import cudamat_conv_gemm as cc
File "/home/smile/project/unsupervised-videos-master/cudamat/cudamat_conv_gemm.py", line 4, in
_ConvNet = ct.cdll.LoadLibrary('libcudamat_conv_gemm.so')
File "/home/smile/anaconda2/lib/python2.7/ctypes/init.py", line 443, in LoadLibrary
return self._dlltype(name)
File "/home/smile/anaconda2/lib/python2.7/ctypes/init.py", line 365, in init
self._handle = _dlopen(self._name, mode)
OSError: libcudamat_conv_gemm.so: cannot open shared object file: No such file or directory

cudamat.cudamat.CUDAMatException: CUBLAS error

Hi there,

I'm trying to run the the first example using the MNIST dataset but it keeps crashing.

Using board 0
2048
Traceback (most recent call last):
File "lstm_combo.py", line 398, in
main()
File "lstm_combo.py", line 385, in main
lstm_autoencoder = LSTMCombo(model)
File "lstm_combo.py", line 18, in init
self.lstm_stack_enc_.Add(lstm.LSTM(l))
File "/Users/shirazis/Documents/Codes/unsupervised-videos/lstm.py", line 33, in init
self.w_input_ = Param((4 * num_lstms, self.input_dims_), lstm_config.w_input)
File "/Users/shirazis/Documents/Codes/unsupervised-videos/util.py", line 29, in init
self.dw_ = cm.empty_like(self.w_)
File "/Users/shirazis/Documents/Codes/unsupervised-videos/cudamat/cudamat.py", line 1883, in empty_like
cmat = empty(m.shape)
File "/Users/shirazis/Documents/Codes/unsupervised-videos/cudamat/cudamat.py", line 1872, in empty
raise generate_exception(err_code)

cudamat.cudamat.CUDAMatException: CUBLAS error.

Can you please help me to figure out what's happening?

Cheers,
Sareh

Weights for frame prediction used in the paper

Hi,

I'm currently trying to do frame prediction in TensorFlow. Your paper is one of the best I have found so far.
Unfortunately, after I have downloaded your code and ran the training of the combo-1layer model for about 600,000 iterations, it looks like the frame predictor does not seem to learn anything. At least there was not improvement from the 100,000th to the 600,000th iteration, where the cross-entropy loss sticks at a value of about 2,600.

Is it therefore possible that you upload the weights (h5 file) that was used in the paper as well?
Because first, the training takes very long, seconds, even after training it on a Titan X for about 3 days (600,000 iterations) I do not get such nice results.

1 input -> next predicted output

Hi

thank for your code

i want only predicted output which is predicted based on previous input sequence
not to compare actual and predicted output
to predict future situation just using present situation

how can i do this??

Thx.

Unable to open object (Object 'lstm_1_enc:w_dense' doesn't exist) during result visualization

When running the visualization code provided in README:
python display_results.py models/lstm_combo_1layer_mnist_pretrained.pbtxt datasets/bouncing_mnist_valid.pbtxt 1

The output shows a key error in the hdf5 dataset:
File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (/tmp/pip_build_root/h5py/h5py/_objects.c:2408) File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (/tmp/pip_build_root/h5py/h5py/_objects.c:2365) File "/usr/local/lib/python2.7/dist-packages/h5py/_hl/group.py", line 166, in __getitem__ oid = h5o.open(self.id, self._e(name), lapl=self._lapl) File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (/tmp/pip_build_root/h5py/h5py/_objects.c:2408) File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (/tmp/pip_build_root/h5py/h5py/_objects.c:2365) File "h5py/h5o.pyx", line 190, in h5py.h5o.open (/tmp/pip_build_root/h5py/h5py/h5o.c:3456)
KeyError: "Unable to open object (Object 'lstm_1_enc:w_dense' doesn't exist)"

I have changed the directories to my local dir in the pbtxt files. Any clue what's happening here? Thanks!

lstm classifier examples

I wonder if you can release an example file to demonstrate how to set up a LSTM model pre-trained by the enc-dec LSTM autoencoder network? The example you provided in the models file seems concluding only one LSTM with no timestamp.
BTW, could you explain the meaning of the xxx_num_frames.txt file?

KeyError: "Unable to open object (Object 'lstm_1_enc:w_dense' doesn't exist)"

I got the following while running;
python display_results.py models/lstm_combo_1layer_mnist_pretrained.pbtxt datasets/bouncing_mnist_valid.pbtxt 0

Error message:
Using board 0 2048 Traceback (most recent call last): File "display_results.py", line 22, in <module> main() File "display_results.py", line 9, in main lstm_autoencoder = LSTMCombo(model) File "/home/arghya/unsupervised-videos/lstm_combo.py", line 18, in __init__ self.lstm_stack_enc_.Add(lstm.LSTM(l)) File "/home/arghya/unsupervised-videos/lstm.py", line 21, in __init__ self.w_dense_ = Param((4 * num_lstms, num_lstms), lstm_config.w_dense) File "/home/arghya/unsupervised-videos/util.py", line 50, in __init__ mat = f[config.dataset_name].value File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (/tmp/pip-build-4NvvlI/h5py/h5py/_objects.c:2682) File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (/tmp/pip-build-4NvvlI/h5py/h5py/_objects.c:2640) File "/usr/local/lib/python2.7/dist-packages/h5py/_hl/group.py", line 166, in __getitem__ oid = h5o.open(self.id, self._e(name), lapl=self._lapl) File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (/tmp/pip-build-4NvvlI/h5py/h5py/_objects.c:2682) File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (/tmp/pip-build-4NvvlI/h5py/h5py/_objects.c:2640) File "h5py/h5o.pyx", line 190, in h5py.h5o.open (/tmp/pip-build-4NvvlI/h5py/h5py/h5o.c:3568) KeyError: "Unable to open object (Object 'lstm_1_enc:w_dense' doesn't exist)"

Error while giving the command for training

Hello,
When I try to implement

python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1
I get following error:
OSError: /nas/ei/home/ga85pav/unsupervised-videos/cudamat/libcudamat.so: cannot open shared object file: No such file or directory

I don't see the libcudamat.so in cudamat folder but it is mentioned in Makefile about it. Am I missing something?

Could someone help me on it.

  1. Also, is it possible to skip training, Are there pre-trained models available anywhere for UCF dataset or MNIST dataset?

Thanks!!

CUBLAS error

Hi,
I have a problem with running the code. when I tried :
python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 0
I got this error:

Using board 0
2048
2048
Traceback (most recent call last):
File "lstm_combo.py", line 407, in
main()
File "lstm_combo.py", line 394, in main
lstm_autoencoder = LSTMCombo(model)
File "lstm_combo.py", line 21, in init
self.lstm_stack_dec_.Add(lstm.LSTM(l))
File "/home/fahimeh/ProgramFiles/unsupervised-videos/lstm.py", line 21, in init
self.w_dense_ = Param((4 * num_lstms, num_lstms), lstm_config.w_dense)
File "/home/fahimeh/ProgramFiles/unsupervised-videos/util.py", line 29, in init
self.dw_ = cm.empty_like(self.w_)
File "/home/fahimeh/ProgramFiles/unsupervised-videos/cudamat/cudamat.py", line 1881, in empty_like
cmat = empty(m.shape)
File "/home/fahimeh/ProgramFiles/unsupervised-videos/cudamat/cudamat.py", line 1869, in empty
raise generate_exception(err_code)
cudamat.cudamat.CUDAMatException: CUBLAS error.

Could you please help me to fix it?
Thanks a lot.

How do you handle numerical issues?

Instead of relying on math libraries, it looks like you implement your own kernel for forward propagation. I heard that a small number adding with a large number can cause numerical problems. In your program, how do you handle this problem?

How did you do Fprop?

Dear developers,

I am a newbie in LSTM so I read your code carefully to gain a deep understanding.

Basically, the code for Fprop runs like:
for each batch: for each LSTM: LSTM.Fprop()
where batch is the "input_frame" with shape (batch_size, input_dims) and LSTM units are stored in list "models_".

Let's take video patch as an example, i.e., "python lstm_combo.py models/lstm_combo_1layer_ucf101_patches.pbtxt datasets/ucf101_patches.pbtxt datasets/ucf101_patches_valid.pbtxt 1".

If you add print statements to show their shape or length, it outputs:
len(models_) = 1
input_frame= (100, 3072)

This means there is only one LSTM object in the "models_" list. Well, if you look at Fprop of LSTM class, it allocates memory for whole network, for example, "w_input_" variable.

My questions are:

  1. Is each LSTM object a stacked LSTM network?
  2. According to your LSTM Fprop implementation and your cuda kernel kLSTMFprop(), are you multiplying different "w" with "x" first and then in cuda kernel summing different components up?
  3. Just to make sure, "ucf101_sample_train_patches.npy" has shape (9000, 20, 3, 32, 32) where 20 means 20 frames right? What is following code doing?

for t in xrange(self.enc_seq_length_): self.lstm_stack_enc_.Fprop(input_frame=self.v_.col_slice(t * self.num_dims_, (t+1) * self.num_dims_))

Any help will be appreciated. Thanks

CUDAMatException

envy@ub1404:/os_pri/github/unsupervised-videos$ python lstm_combo.py models/lstm_combo_1layer_mnist.pbtxt datasets/bouncing_mnist.pbtxt datasets/bouncing_mnist_valid.pbtxt 1
invalid device ordinal
Traceback (most recent call last):
File "lstm_combo.py", line 402, in
board = LockGPU(board=board_id)
File "/home/envy/os_pri/github/unsupervised-videos/util.py", line 144, in LockGPU
cm.cuda_set_device(board)
File "/home/envy/os_pri/github/unsupervised-videos/cudamat/cudamat.py", line 2273, in cuda_set_device
raise generate_exception(err_code)
cudamat.cudamat.CUDAMatException: CUDA error: no error
envy@ub1404:
/os_pri/github/unsupervised-videos$

Question about back propagation

In cudamat/cudamat_kernels.cu line 1934, the code is "if (!init) d_c_in[p] = grad_c;".

But in the first state of decoder and future LSTM, both of their init_state are the last state of encoder. So I guess that the derivation of encoder's last cell state should be propagated from both decoder and future LSTM. Should the code be "if (!init) d_c_in[p] += grad_c;" ?

Problem about moving MNIST

bounce-off problem

digit moving is in fact based on digit patch(2828), not digit itself. So the bounce-off is exactly based on digit patch. In most case, digit will bounce back before digit arrives at the edge of outer box(6464) ,due to white padding in digit patch.
Does it matter for the training? What problem will it cause?

digit overlap problem

data_handler.py about line 417

    """ Put b on top of a."""
   def Overlap(self, a, b):
    # S1: original by author, can not make sure that b is on top of a
    #return np.maximum(a, b)

    #S2: digit patch overlap,consistent  with bounce-off process 
    #return b

    # S3: digit overlap, but inconsistent with bounce-off process
    return np.where(b==0,a,b)

As mentioned by the notes above,

  • S3 is truly digit overlap
  • S2 is digit patch overlap
  • S1 is something else, but it is the original code in the project

Is that a problem?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.