日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CS231n(1):图片分类笔记与KNN编程作业

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CS231n(1):图片分类笔记与KNN编程作业 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本博客筆記部分為CS231n官網筆記,這里對其進行引用,在此表示感謝。
課程官網地址為:http://vision.stanford.edu/teaching/cs231n/syllabus.html

本次課程對應B站教學視頻為:
https://www.bilibili.com/video/av58778425?p=4
https://www.bilibili.com/video/av58778425?p=5
https://www.bilibili.com/video/av58778425?p=6

作業Github地址為:https://github.com/cs231n/cs231n.github.io/commit/f1cfea7d43784031ddae770e3870ab8e22d1d70e

This is an introductory lecture designed to introduce people from outside of Computer Vision to the Image Classification problem, and the data-driven approach. The Table of Contents:

文章目錄

      • 1)Image Classification
      • 2)Nearest Neighbor Classifier
        • k - Nearest Neighbor Classifier
      • 3)Validation sets for Hyperparameter tuning
      • 4)Pros and Cons of Nearest Neighbor classifier
      • 5)Summary
      • 6)Summary: Applying kNN in practice
      • 7)Further Reading
      • 8)KNN練習
        • 導入依賴庫
        • Two_loops練習(參考答案)
        • One_loop練習(參考答案)
        • No_loop(參考答案)
        • Cross-validation(參考答案)

1)Image Classification

Motivation. In this section we will introduce the Image Classification problem, which is the task of assigning an input image one label from a fixed set of categories. This is one of the core problems in Computer Vision that, despite its simplicity, has a large variety of practical applications. Moreover, as we will see later in the course, many other seemingly distinct Computer Vision tasks (such as object detection, segmentation) can be reduced to image classification.

Example. For example, in the image below an image classification model takes a single image and assigns probabilities to 4 labels, {cat, dog, hat, mug}. As shown in the image, keep in mind that to a computer an image is represented as one large 3-dimensional array of numbers. In this example, the cat image is 248 pixels wide, 400 pixels tall, and has three color channels Red,Green,Blue (or RGB for short). Therefore, the image consists of 248 x 400 x 3 numbers, or a total of 297,600 numbers. Each number is an integer that ranges from 0 (black) to 255 (white). Our task is to turn this quarter of a million numbers into a single label, such as “cat”.


The task in Image Classification is to predict a single label (or a distribution over labels as shown here to indicate our confidence) for a given image. Images are 3-dimensional arrays of integers from 0 to 255, of size Width x Height x 3. The 3 represents the three color channels Red, Green, Blue.


Challenges. Since this task of recognizing a visual concept (e.g. cat) is relatively trivial for a human to perform, it is worth considering the challenges involved from the perspective of a Computer Vision algorithm. As we present (an inexhaustive) list of challenges below, keep in mind the raw representation of images as a 3-D array of brightness values:

  • Viewpoint variation. A single instance of an object can be oriented in many ways with respect to the camera.

  • Scale variation.Viisual classes often exhibit variation in their size (size in the real world, not only in terms of their extent in the image).

  • Deformation. Many objects of interest are not rigid bodies and can be deformed in extreme ways.

  • Occlusion.The objects of interest can be occluded. Sometimes only a small portion of an object (as little as few pixels) could be visible.

  • Illumination conditions. The effects of illumination are drastic on the pixel level.

  • Background clutter. The objects of interest may blend into their environment, making them hard to identify.

  • Intra-class variation. The classes of interest can often be relatively broad, such as chair. There are many different types of these objects, each with their own appearance.

A good image classification model must be invariant to the cross product of all these variations, while simultaneously retaining sensitivity to the inter-class variations.



Data-driven approach. How might we go about writing an algorithm that can classify images into distinct categories? Unlike writing an algorithm for, for example, sorting a list of numbers, it is not obvious how one might write an algorithm for identifying cats in images. Therefore, instead of trying to specify what every one of the categories of interest look like directly in code, the approach that we will take is not unlike one you would take with a child: we’re going to provide the computer with many examples of each class and then develop learning algorithms that look at these examples and learn about the visual appearance of each class. This approach is referred to as a data-driven approach, since it relies on first accumulating a training dataset of labeled images. Here is an example of what such a dataset might look like:


An example training set for four visual categories. In practice we may have thousands of categories and hundreds of thousands of images for each category.


The image classification pipeline. We’ve seen that the task in Image Classification is to take an array of pixels that represents a single image and assign a label to it. Our complete pipeline can be formalized as follows:

  • Input: Our input consists of a set of N images, each labeled with one of K different classes. We refer to this data as the training set.

  • Learning: Our task is to use the training set to learn what every one of the classes looks like. We refer to this step as training a classifier, or learning a model.

  • Evaluation:in the end, we evaluate the quality of the classifier by asking it to predict labels for a new set of images that it has never seen before. We will then compare the true labels of these images to the ones predicted by the classifier. Intuitively, we’re hoping that a lot of the predictions match up with the true answers (which we call the ground truth).

2)Nearest Neighbor Classifier

As our first approach, we will develop what we call a Nearest Neighbor Classifier. This classifier has nothing to do with Convolutional Neural Networks and it is very rarely used in practice, but it will allow us to get an idea about the basic approach to an image classification problem.

Example image classification dataset: CIFAR-10. One popular toy image classification dataset is the CIFAR-10 dataset. This dataset consists of 60,000 tiny images that are 32 pixels high and wide. Each image is labeled with one of 10 classes (for example “airplane, automobile, bird, etc”). These 60,000 images are partitioned into a training set of 50,000 images and a test set of 10,000 images. In the image below you can see 10 random example images from each one of the 10 classes:


Left: Example images from the CIFAR-10 dataset. Right: first column shows a few test images and next to each we show the top 10 nearest neighbors in the training set according to pixel-wise difference.


Suppose now that we are given the CIFAR-10 training set of 50,000 images (5,000 images for every one of the labels), and we wish to label the remaining 10,000. The nearest neighbor classifier will take a test image, compare it to every single one of the training images, and predict the label of the closest training image. In the image above and on the right you can see an example result of such a procedure for 10 example test images. Notice that in only about 3 out of 10 examples an image of the same class is retrieved, while in the other 7 examples this is not the case. For example, in the 8th row the nearest training image to the horse head is a red car, presumably due to the strong black background. As a result, this image of a horse would in this case be mislabeled as a car.

You may have noticed that we left unspecified the details of exactly how we compare two images, which in this case are just two blocks of 32 x 32 x 3. One of the simplest possibilities is to compare the images pixel by pixel and add up all the differences. In other words, given two images and representing them as vectors
I1,I2I_{1}, I_{2}I1?,I2?, a reasonable choice for comparing them might be the L1 distance:
d1(I1,I2)=∑p∣I1p?I2p∣d_1 (I_1, I_2) = \sum_{p} \left| I^p_1 - I^p_2 \right| d1?(I1?,I2?)=p?I1p??I2p?

Where the sum is taken over all pixels. Here is the procedure visualized:



An example of using pixel-wise differences to compare two images with L1 distance (for one color channel in this example). Two images are subtracted elementwise and then all differences are added up to a single number. If two images are identical the result will be zero. But if the images are very different the result will be large.


Let’s also look at how we might implement the classifier in code. First, let’s load the CIFAR-10 data into memory as 4 arrays: the training data/labels and the test data/labels. In the code below, Xtr (of size 50,000 x 32 x 32 x 3) holds all the images in the training set, and a corresponding 1-dimensional array Ytr (of length 50,000) holds the training labels (from 0 to 9):

Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide # flatten out all images to be one-dimensional Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072 Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072

Now that we have all images stretched out as rows, here is how we could train and evaluate a classifier:

nn = NearestNeighbor() # create a Nearest Neighbor classifier class nn.train(Xtr_rows, Ytr) # train the classifier on the training images and labels Yte_predict = nn.predict(Xte_rows) # predict labels on the test images # and now print the classification accuracy, which is the average number # of examples that are correctly predicted (i.e. label matches) print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )

Notice that as an evaluation criterion, it is common to use the accuracy, which measures the fraction of predictions that were correct. Notice that all classifiers we will build satisfy this one common API: they have a train(X,y) function that takes the data and the labels to learn from. Internally, the class should build some kind of model of the labels and how they can be predicted from the data. And then there is a predict(X) function, which takes new data and predicts the labels. Of course, we’ve left out the meat of things - the actual classifier itself. Here is an implementation of a simple Nearest Neighbor classifier with the L1 distance that satisfies this template:

import numpy as npclass NearestNeighbor(object):def __init__(self):passdef train(self, X, y):""" X is N x D where each row is an example. Y is 1-dimension of size N """# the nearest neighbor classifier simply remembers all the training dataself.Xtr = Xself.ytr = ydef predict(self, X):""" X is N x D where each row is an example we wish to predict label for """num_test = X.shape[0]# lets make sure that the output type matches the input typeYpred = np.zeros(num_test, dtype = self.ytr.dtype)# loop over all test rowsfor i in xrange(num_test):# find the nearest training image to the i'th test image# using the L1 distance (sum of absolute value differences)distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)min_index = np.argmin(distances) # get the index with smallest distanceYpred[i] = self.ytr[min_index] # predict the label of the nearest examplereturn Ypred

If you ran this code, you would see that this classifier only achieves 38.6% on CIFAR-10. That’s more impressive than guessing at random (which would give 10% accuracy since there are 10 classes), but nowhere near human performance (which is estimated at about 94%) or near state-of-the-art Convolutional Neural Networks that achieve about 95%, matching human accuracy (see the leaderboard of a recent Kaggle competition on CIFAR-10).

The choice of distance. There are many other ways of computing distances between vectors. Another common choice could be to instead use the L2 distance, which has the geometric interpretation of computing the euclidean distance between two vectors. The distance takes the form:
d2(I1,I2)=∑p(I1p?I2p)2d_2 (I_1, I_2) = \sqrt{\sum_{p} \left( I^p_1 - I^p_2 \right)^2} d2?(I1?,I2?)=p?(I1p??I2p?)2?

In other words we would be computing the pixelwise difference as before, but this time we square all of them, add them up and finally take the square root. In numpy, using the code from above we would need to only replace a single line of code. The line that computes the distances:

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))

Note that I included the np.sqrt call above, but in a practical nearest neighbor application we could leave out the square root operation because square root is a monotonic function. That is, it scales the absolute sizes of the distances but it preserves the ordering, so the nearest neighbors with or without it are identical. If you ran the Nearest Neighbor classifier on CIFAR-10 with this distance, you would obtain 35.4% accuracy (slightly lower than our L1 distance result).

L1 vs. L2. It is interesting to consider differences between the two metrics. In particular, the L2 distance is much more unforgiving than the L1 distance when it comes to differences between two vectors. That is, the L2 distance prefers many medium disagreements to one big one. L1 and L2 distances (or equivalently the L1/L2 norms of the differences between a pair of images) are the most commonly used special cases of a p-norm.

k - Nearest Neighbor Classifier

You may have noticed that it is strange to only use the label of the nearest image when we wish to make a prediction. Indeed, it is almost always the case that one can do better by using what’s called a k-Nearest Neighbor Classifier. The idea is very simple: instead of finding the single closest image in the training set, we will find the top k closest images, and have them vote on the label of the test image. In particular, when k = 1, we recover the Nearest Neighbor classifier. Intuitively, higher values of k have a smoothing effect that makes the classifier more resistant to outliers:


An example of the difference between Nearest Neighbor and a 5-Nearest Neighbor classifier, using 2-dimensional points and 3 classes (red, blue, green). The colored regions show the decision boundaries induced by the classifier with an L2 distance. The white regions show points that are ambiguously classified (i.e. class votes are tied for at least two classes). Notice that in the case of a NN classifier, outlier datapoints (e.g. green point in the middle of a cloud of blue points) create small islands of likely incorrect predictions, while the 5-NN classifier smooths over these irregularities, likely leading to better generalization on the test data (not shown). Also note that the gray regions in the 5-NN image are caused by ties in the votes among the nearest neighbors (e.g. 2 neighbors are red, next two neighbors are blue, last neighbor is green).


In practice, you will almost always want to use k-Nearest Neighbor. But what value of k should you use? We turn to this problem next.

3)Validation sets for Hyperparameter tuning

The k-nearest neighbor classifier requires a setting for k. But what number works best? Additionally, we saw that there are many different distance functions we could have used: L1 norm, L2 norm, there are many other choices we didn’t even consider (e.g. dot products). These choices are called hyperparameters and they come up very often in the design of many Machine Learning algorithms that learn from data. It’s often not obvious what values/settings one should choose.

You might be tempted to suggest that we should try out many different values and see what works best. That is a fine idea and that’s indeed what we will do, but this must be done very carefully. In particular, we cannot use the test set for the purpose of tweaking hyperparameters. Whenever you’re designing Machine Learning algorithms, you should think of the test set as a very precious resource that should ideally never be touched until one time at the very end. Otherwise, the very real danger is that you may tune your hyperparameters to work well on the test set, but if you were to deploy your model you could see a significantly reduced performance. In practice, we would say that you overfit to the test set. Another way of looking at it is that if you tune your hyperparameters on the test set, you are effectively using the test set as the training set, and therefore the performance you achieve on it will be too optimistic with respect to what you might actually observe when you deploy your model. But if you only use the test set once at end, it remains a good proxy for measuring the generalization of your classifier (we will see much more discussion surrounding generalization later in the class).

Evaluate on the test set only a single time, at the very end.

Luckily, there is a correct way of tuning the hyperparameters and it does not touch the test set at all. The idea is to split our training set in two: a slightly smaller training set, and what we call a validation set. Using CIFAR-10 as an example, we could for example use 49,000 of the training images for training, and leave 1,000 aside for validation. This validation set is essentially used as a fake test set to tune the hyper-parameters.

Here is what this might look like in the case of CIFAR-10:

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before # recall Xtr_rows is 50,000 x 3072 matrix Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation Yval = Ytr[:1000] Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train Ytr = Ytr[1000:]# find hyperparameters that work best on the validation set validation_accuracies = [] for k in [1, 3, 5, 10, 20, 50, 100]:# use a particular value of k and evaluation on validation datann = NearestNeighbor()nn.train(Xtr_rows, Ytr)# here we assume a modified NearestNeighbor class that can take a k as inputYval_predict = nn.predict(Xval_rows, k = k)acc = np.mean(Yval_predict == Yval)print 'accuracy: %f' % (acc,)# keep track of what works on the validation setvalidation_accuracies.append((k, acc))

By the end of this procedure, we could plot a graph that shows which values of k work best. We would then stick with this value and evaluate once on the actual test set.

Split your training set into training set and a validation set. Use validation set to tune all hyperparameters. At the end run a single time on the test set and report performance.

Cross-validation. In cases where the size of your training data (and therefore also the validation data) might be small, people sometimes use a more sophisticated technique for hyperparameter tuning called cross-validation. Working with our previous example, the idea is that instead of arbitrarily picking the first 1000 datapoints to be the validation set and rest training set, you can get a better and less noisy estimate of how well a certain value of k works by iterating over different validation sets and averaging the performance across these. For example, in 5-fold cross-validation, we would split the training data into 5 equal folds, use 4 of them for training, and 1 for validation. We would then iterate over which fold is the validation fold, evaluate the performance, and finally average the performance across the different folds.



Example of a 5-fold cross-validation run for the parameter k. For each value of k we train on 4 folds and evaluate on the 5th. Hence, for each k we receive 5 accuracies on the validation fold (accuracy is the y-axis, each result is a point). The trend line is drawn through the average of the results for each k and the error bars indicate the standard deviation. Note that in this particular case, the cross-validation suggests that a value of about k = 7 works best on this particular dataset (corresponding to the peak in the plot). If we used more than 5 folds, we might expect to see a smoother (i.e. less noisy) curve.


In practice. In practice, people prefer to avoid cross-validation in favor of having a single validation split, since cross-validation can be computationally expensive. The splits people tend to use is between 50%-90% of the training data for training and rest for validation. However, this depends on multiple factors: For example if the number of hyperparameters is large you may prefer to use bigger validation splits. If the number of examples in the validation set is small (perhaps only a few hundred or so), it is safer to use cross-validation. Typical number of folds you can see in practice would be 3-fold, 5-fold or 10-fold cross-validation.



Common data splits. A training and test set is given. The training set is split into folds (for example 5 folds here). The folds 1-4 become the training set. One fold (e.g. fold 5 here in yellow) is denoted as the Validation fold and is used to tune the hyperparameters. Cross-validation goes a step further and iterates over the choice of which fold is the validation fold, separately from 1-5. This would be referred to as 5-fold cross-validation. In the very end once the model is trained and all the best hyperparameters were determined, the model is evaluated a single time on the test data (red).


4)Pros and Cons of Nearest Neighbor classifier

It is worth considering some advantages and drawbacks of the Nearest Neighbor classifier. Clearly, one advantage is that it is very simple to implement and understand. Additionally, the classifier takes no time to train, since all that is required is to store and possibly index the training data. However, we pay that computational cost at test time, since classifying a test example requires a comparison to every single training example. This is backwards, since in practice we often care about the test time efficiency much more than the efficiency at training time. In fact, the deep neural networks we will develop later in this class shift this tradeoff to the other extreme: They are very expensive to train, but once the training is finished it is very cheap to classify a new test example. This mode of operation is much more desirable in practice.

As an aside, the computational complexity of the Nearest Neighbor classifier is an active area of research, and several Approximate Nearest Neighbor (ANN) algorithms and libraries exist that can accelerate the nearest neighbor lookup in a dataset (e.g. FLANN). These algorithms allow one to trade off the correctness of the nearest neighbor retrieval with its space/time complexity during retrieval, and usually rely on a pre-processing/indexing stage that involves building a kdtree, or running the k-means algorithm.

The Nearest Neighbor Classifier may sometimes be a good choice in some settings (especially if the data is low-dimensional), but it is rarely appropriate for use in practical image classification settings. One problem is that images are high-dimensional objects (i.e. they often contain many pixels), and distances over high-dimensional spaces can be very counter-intuitive. The image below illustrates the point that the pixel-based L2 similarities we developed above are very different from perceptual similarities:



Pixel-based distances on high-dimensional data (and images especially) can be very unintuitive. An original image (left) and three other images next to it that are all equally far away from it based on L2 pixel distance. Clearly, the pixel-wise distance does not correspond at all to perceptual or semantic similarity.


Here is one more visualization to convince you that using pixel differences to compare images is inadequate. We can use a visualization technique called t-SNE to take the CIFAR-10 images and embed them in two dimensions so that their (local) pairwise distances are best preserved. In this visualization, images that are shown nearby are considered to be very near according to the L2 pixelwise distance we developed above:



CIFAR-10 images embedded in two dimensions with t-SNE. Images that are nearby on this image are considered to be close based on the L2 pixel distance. Notice the strong effect of background rather than semantic class differences. Click here for a bigger version of this visualization.


In particular, note that images that are nearby each other are much more a function of the general color distribution of the images, or the type of background rather than their semantic identity. For example, a dog can be seen very near a frog since both happen to be on white background. Ideally we would like images of all of the 10 classes to form their own clusters, so that images of the same class are nearby to each other regardless of irrelevant characteristics and variations (such as the background). However, to get this property we will have to go beyond raw pixels.

5)Summary

In summary:

  • We introduced the problem of Image Classification, in which we are given a set of images that are all labeled with a single category. We are then asked to predict these categories for a novel set of test images and measure the accuracy of the predictions.

  • We introduced a simple classifier called the Nearest Neighbor classifier. We saw that there are multiple hyper-parameters (such as value of k, or the type of distance used to compare examples) that
    are associated with this classifier and that there was no obvious way of choosing them.

  • We saw that the correct way to set these hyperparameters is to split your training data into two: a training set and a fake test set, which we call validation set. We try different hyperparameter values and keep the values that lead to the best performance on the validation set.

  • If the lack of training data is a concern, we discussed a procedure called cross-validation, which can help reduce noise in estimating which hyperparameters work best.

  • Once the best hyperparameters are found, we fix them and perform a single evaluation on the actual test set.

  • We saw that Nearest Neighbor can get us about 40% accuracy on CIFAR-10. It is simple to implement but requires us to store the entire training set and it is expensive to evaluate on a test image.

  • Finally, we saw that the use of L1 or L2 distances on raw pixel values is not adequate since the
    distances correlate more strongly with backgrounds and color distributions of images than with their semantic content.

In next lectures we will embark on addressing these challenges and eventually arrive at solutions that give 90% accuracies, allow us to completely discard the training set once learning is complete, and they will allow us to evaluate a test image in less than a millisecond.

6)Summary: Applying kNN in practice

If you wish to apply kNN in practice (hopefully not on images, or perhaps as only a baseline) proceed as follows:

  • Preprocess your data: Normalize the features in your data (e.g. one pixel in images) to have zero mean and unit variance. We will cover this in more detail in later sections, and chose not to cover data normalization in this section because pixels in images are usually homogeneous and do not exhibit widely different distributions, alleviating the need for data normalization.
  • If your data is very high-dimensional, consider using a dimensionality reduction technique such as PCA (wiki ref, CS229ref, blog ref) or even Random Projections.
  • Split your training data randomly into train/val splits. As a rule of thumb, between 70-90% of your data usually goes to the train split. This setting depends on how many hyperparameters you have and how much of an influence you expect them to have. If there are many hyperparameters to estimate, you should err on the side of having larger validation set to estimate them effectively. If you are concerned about the size of your validation data, it is best to split the training data into folds and perform cross-validation. If you can afford the computational budget it is always safer to go with cross-validation (the more folds the better, but more expensive).
  • Train and evaluate the kNN classifier on the validation data (for all folds, if doing cross-validation) for many
    choices of k (e.g. the more the better) and across different distance types (L1 and L2 are good candidates)
  • If your kNN classifier is running too long, consider using an Approximate Nearest Neighbor library (e.g. FLANN) to accelerate the retrieval (at cost of some accuracy).
  • Take note of the hyperparameters that gave the best results. There is a question of whether you should use the full training set with the best hyperparameters, since the optimal hyperparameters might change if you were to fold the validation data into your training set (since the size of the data would be larger). In practice it is cleaner to not use the validation data in the final classifier and consider it to be burned on estimating the hyperparameters. Evaluate the best model on the test set. Report the test set accuracy and declare the result to be the performance of the kNN classifier on your data.
  • 7)Further Reading

    Here are some (optional) links you may find interesting for further reading:

    • A Few Useful Things to Know about Machine Learning, where especially section 6 is related but the whole paper is a warmly recommended reading.

    • Recognizing and Learning Object Categories, a short course of object categorization at ICCV 2005.


    8)KNN練習

    導入依賴庫

    Complete and hand in this completed worksheet (including its outputs and any supporting code outside of the worksheet) with your assignment submission. For more details see the assignments page on the course website.

    The kNN classifier consists of two stages:

    • During training, the classifier takes the training data and simply remembers it
    • During testing, kNN classifies every test image by comparing to all training images and transfering the labels of the k most similar training examples
    • The value of k is cross-validated

    In this exercise you will implement these steps and understand the basic Image Classification pipeline, cross-validation, and gain proficiency in writing efficient, vectorized code.

    # Run some setup code for this notebook.import random import numpy as np from cs231n.data_utils import load_CIFAR10 import matplotlib.pyplot as plt# This is a bit of magic to make matplotlib figures appear inline in the notebook # rather than in a new window. %matplotlib inline plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots plt.rcParams['image.interpolation'] = 'nearest' plt.rcParams['image.cmap'] = 'gray'# Some more magic so that the notebook will reload external python modules; # see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython %reload_ext autoreload %autoreload 2

    在這里加載圖片文件CIFAR-10,加載圖片之前需要運行壓縮文件中的.sh文件進行下載.

    # Load the raw CIFAR-10 data. cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'# Cleaning up variables to prevent loading data multiple times (which may cause memory issue) try:del X_train, y_traindel X_test, y_testprint('Clear previously loaded data.') except:passX_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)# As a sanity check, we print out the size of the training and test data. print('Training data shape: ', X_train.shape) print('Training labels shape: ', y_train.shape) print('Test data shape: ', X_test.shape) print('Test labels shape: ', y_test.shape)

    圖片文件共分為10類,這里先首先觀察圖片,每類圖片選取7張。

    # Visualize some examples from the dataset. # We show a few examples of training images from each class. classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] num_classes = len(classes) samples_per_class = 7 for y, cls in enumerate(classes):idxs = np.flatnonzero(y_train == y)idxs = np.random.choice(idxs, samples_per_class, replace=False)for i, idx in enumerate(idxs):plt_idx = i * num_classes + y + 1plt.subplot(samples_per_class, num_classes, plt_idx)plt.imshow(X_train[idx].astype('uint8'))plt.axis('off')if i == 0:plt.title(cls) plt.show()


    設定訓練集和測試集大小,訓練集大小為5000張圖片,測試集大小為500張圖片。

    # Subsample the data for more efficient code execution in this exercise num_training = 5000 mask = list(range(num_training)) X_train = X_train[mask] y_train = y_train[mask]num_test = 500 mask = list(range(num_test)) X_test = X_test[mask] y_test = y_test[mask]# Reshape the image data into rows X_train = np.reshape(X_train, (X_train.shape[0], -1)) X_test = np.reshape(X_test, (X_test.shape[0], -1)) print(X_train.shape, X_test.shape) from cs231n.classifiers import KNearestNeighbor# Create a kNN classifier instance. # Remember that training a kNN classifier is a noop: # the Classifier simply remembers the data and does no further processing classifier = KNearestNeighbor() classifier.train(X_train, y_train)

    We would now like to classify the test data with the kNN classifier. Recall that we can break down this process into two steps:

  • First we must compute the distances between all test examples and all train examples.
  • Given these distances, for each test example we find the k nearest examples and have them vote for the label
  • Lets begin with computing the distance matrix between all training and test examples. For example, if there are Ntr training examples and Nte test examples, this stage should result in a Nte x Ntr matrix where each element (i,j) is the distance between the i-th test and j-th train example.

    Note: For the three distance computations that we require you to implement in this notebook, you may not use the np.linalg.norm() function that numpy provides.

    First, open cs231n/classifiers/k_nearest_neighbor.py and implement the function compute_distances_two_loops that uses a (very inefficient) double loop over all pairs of (test, train) examples and computes the distance matrix one element at a time.


    Two_loops練習(參考答案)

    def compute_distances_two_loops(self, X):"""Compute the distance between each test point in X and each training pointin self.X_train using a nested loop over both the training data and thetest data.Inputs:- X: A numpy array of shape (num_test, D) containing test data.Returns:- dists: A numpy array of shape (num_test, num_train) where dists[i, j]is the Euclidean distance between the ith test point and the jth trainingpoint."""num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))for i in range(num_test):for j in range(num_train):###################################################################### TODO: ## Compute the l2 distance between the ith test point and the jth ## training point, and store the result in dists[i, j]. You should ## not use a loop over dimension, nor use np.linalg.norm(). ####################################################################### *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****dists[i,j] = np.sqrt(np.sum(np.square(X[i] - self.X_train[j])))# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****return dists # Open cs231n/classifiers/k_nearest_neighbor.py and implement # compute_distances_two_loops.# Test your implementation: dists = classifier.compute_distances_two_loops(X_test) print(dists.shape) # We can visualize the distance matrix: each row is a single test example and # its distances to training examples plt.imshow(dists, interpolation='none') plt.show()

    # Now implement the function predict_labels and run the code below: # We use k = 1 (which is Nearest Neighbor). y_test_pred = classifier.predict_labels(dists, k=1)# Compute and print the fraction of correctly predicted examples num_correct = np.sum(y_test_pred == y_test) accuracy = float(num_correct) / num_test print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))

    You should expect to see approximately 27% accuracy. Now lets try out a larger k, say k = 5:

    y_test_pred = classifier.predict_labels(dists, k=5) num_correct = np.sum(y_test_pred == y_test) accuracy = float(num_correct) / num_test print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))

    You should expect to see a slightly better performance than with k = 1.

    We can also use other distance metrics such as L1 distance.
    For pixel values pij(k)p_{ij}^{(k)}pij(k)? at location (i,j)(i,j)(i,j) of some image IkI_kIk?,

    the mean μ\muμ across all pixels over all images is μ=1nhw∑k=1n∑i=1h∑j=1wpij(k)\mu=\frac{1}{nhw}\sum_{k=1}^n\sum_{i=1}^{h}\sum_{j=1}^{w}p_{ij}^{(k)}μ=nhw1?k=1n?i=1h?j=1w?pij(k)?
    And the pixel-wise mean μij\mu_{ij}μij? across all images is
    μij=1n∑k=1npij(k).\mu_{ij}=\frac{1}{n}\sum_{k=1}^np_{ij}^{(k)}.μij?=n1?k=1n?pij(k)?.
    The general standard deviation σ\sigmaσ and pixel-wise standard deviation σij\sigma_{ij}σij? is defined similarly.

    Which of the following preprocessing steps will not change the performance of a Nearest Neighbor classifier that uses L1 distance? Select all that apply.

  • Subtracting the mean μ\muμ (p~ij(k)=pij(k)?μ\tilde{p}_{ij}^{(k)}=p_{ij}^{(k)}-\mup~?ij(k)?=pij(k)??μ.)
  • Subtracting the per pixel mean μij\mu_{ij}μij? (p~ij(k)=pij(k)?μij\tilde{p}_{ij}^{(k)}=p_{ij}^{(k)}-\mu_{ij}p~?ij(k)?=pij(k)??μij?.)
  • Subtracting the mean μ\muμ and dividing by the standard deviation σ\sigmaσ.
  • Subtracting the pixel-wise mean μij\mu_{ij}μij? and dividing by the pixel-wise standard deviation σij\sigma_{ij}σij?.
  • Rotating the coordinate axes of the data.

  • One_loop練習(參考答案)

    def compute_distances_one_loop(self, X):"""Compute the distance between each test point in X and each training pointin self.X_train using a single loop over the test data.Input / Output: Same as compute_distances_two_loops"""num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))for i in range(num_test):######################################################################## TODO: ## Compute the l2 distance between the ith test point and all training ## points, and store the result in dists[i, :]. ## Do not use np.linalg.norm(). ######################################################################### *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****dists[i] = np.sqrt(np.sum(np.square(self.X_train - X[i]), axis = 1))# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****return dists# Now lets speed up distance matrix computation by using partial vectorization # with one loop. Implement the function compute_distances_one_loop and run the # code below: dists_one = classifier.compute_distances_one_loop(X_test)# To ensure that our vectorized implementation is correct, we make sure that it # agrees with the naive implementation. There are many ways to decide whether # two matrices are similar; one of the simplest is the Frobenius norm. In case # you haven't seen it before, the Frobenius norm of two matrices is the square # root of the squared sum of differences of all elements; in other words, reshape # the matrices into vectors and compute the Euclidean distance between them. difference = np.linalg.norm(dists - dists_one, ord='fro') print('One loop difference was: %f' % (difference, )) if difference < 0.001:print('Good! The distance matrices are the same') else:print('Uh-oh! The distance matrices are different')

    No_loop(參考答案)

    def compute_distances_no_loops(self, X):"""Compute the distance between each test point in X and each training pointin self.X_train using no explicit loops.Input / Output: Same as compute_distances_two_loops"""num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))########################################################################## TODO: ## Compute the l2 distance between all test points and all training ## points without using any explicit loops, and store the result in ## dists. ## ## You should implement this function using only basic array operations; ## in particular you should not use functions from scipy, ## nor use np.linalg.norm(). ## ## HINT: Try to formulate the l2 distance using matrix multiplication ## and two broadcast sums. ########################################################################### *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****dists = np.sqrt(-2*np.dot(X, self.X_train.T) + np.sum(np.square(self.X_train), axis = 1) + np.transpose([np.sum(np.square(X), axis = 1)]))# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****return dists# Now implement the fully vectorized version inside compute_distances_no_loops # and run the code dists_two = classifier.compute_distances_no_loops(X_test)# check that the distance matrix agrees with the one we computed before: difference = np.linalg.norm(dists - dists_two, ord='fro') print('No loop difference was: %f' % (difference, )) if difference < 0.001:print('Good! The distance matrices are the same') else:print('Uh-oh! The distance matrices are different') # Let's compare how fast the implementations are def time_function(f, *args):"""Call a function f with args and return the time (in seconds) that it took to execute."""import timetic = time.time()f(*args)toc = time.time()return toc - tictwo_loop_time = time_function(classifier.compute_distances_two_loops, X_test) print('Two loop version took %f seconds' % two_loop_time)one_loop_time = time_function(classifier.compute_distances_one_loop, X_test) print('One loop version took %f seconds' % one_loop_time)no_loop_time = time_function(classifier.compute_distances_no_loops, X_test) print('No loop version took %f seconds' % no_loop_time)# You should see significantly faster performance with the fully vectorized implementation!# NOTE: depending on what machine you're using, # you might not see a speedup when you go from two loops to one loop, # and might even see a slow-down.

    Cross-validation(參考答案)

    We have implemented the k-Nearest Neighbor classifier but we set the value k = 5 arbitrarily. We will now determine the best value of this hyperparameter with cross-validation.

    num_folds = 5 k_choices = [1, 3, 5, 8, 10, 12, 15, 20, 50, 100]X_train_folds = [] y_train_folds = []################################################################################ # TODO: # # Split up the training data into folds. After splitting, X_train_folds and # # y_train_folds should each be lists of length num_folds, where # # y_train_folds[i] is the label vector for the points in X_train_folds[i]. # # Hint: Look up the numpy array_split function. # ################################################################################ # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)***** X_train_folds.extend(np.array_split(X_train,num_folds)) y_train_folds.extend(np.array_split(y_train,num_folds)) # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****# A dictionary holding the accuracies for different values of k that we find # when running cross-validation. After running cross-validation, # k_to_accuracies[k] should be a list of length num_folds giving the different # accuracy values that we found when using that value of k. k_to_accuracies = {}################################################################################ # TODO: # # Perform k-fold cross validation to find the best value of k. For each # # possible value of k, run the k-nearest-neighbor algorithm num_folds times, # # where in each case you use all but one of the folds as training data and the # # last fold as a validation set. Store the accuracies for all fold and all # # values of k in the k_to_accuracies dictionary. # ################################################################################ # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)***** for k in k_choices:k_to_accuracies[k] = []for i in range(num_folds):X_train = np.concatenate([X_train_folds[j] for j in range(num_folds) if j!= i])y_train = np.concatenate([y_train_folds[j] for j in range(num_folds) if j!= i])classifier = KNearestNeighbor()classifier.train(X_train, y_train)x_valid = X_train_folds[i]y_valid = y_train_folds[i]y_predict = classifier.predict(x_valid, k)accuracy = np.sum(y_predict == y_valid) / len(y_valid)k_to_accuracies[k].append(accuracy)# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****# Print out the computed accuracies for k in sorted(k_to_accuracies):for accuracy in k_to_accuracies[k]:print('k = %d, accuracy = %f' % (k, accuracy))

    k = 1, accuracy = 0.248438
    k = 1, accuracy = 0.237500
    k = 1, accuracy = 0.229687
    k = 1, accuracy = 0.285938
    k = 1, accuracy = 0.270313
    k = 3, accuracy = 0.228125
    k = 3, accuracy = 0.232813
    k = 3, accuracy = 0.240625
    k = 3, accuracy = 0.251563
    k = 3, accuracy = 0.248438
    k = 5, accuracy = 0.234375
    k = 5, accuracy = 0.245312
    k = 5, accuracy = 0.257812
    k = 5, accuracy = 0.271875
    k = 5, accuracy = 0.253125
    k = 8, accuracy = 0.231250
    k = 8, accuracy = 0.248438
    k = 8, accuracy = 0.281250
    k = 8, accuracy = 0.271875
    k = 8, accuracy = 0.260937
    k = 10, accuracy = 0.231250
    k = 10, accuracy = 0.257812
    k = 10, accuracy = 0.275000
    k = 10, accuracy = 0.276562
    k = 10, accuracy = 0.253125
    k = 12, accuracy = 0.225000
    k = 12, accuracy = 0.259375
    k = 12, accuracy = 0.279687
    k = 12, accuracy = 0.275000
    k = 12, accuracy = 0.242188
    k = 15, accuracy = 0.234375
    k = 15, accuracy = 0.268750
    k = 15, accuracy = 0.284375
    k = 15, accuracy = 0.257812
    k = 15, accuracy = 0.253125
    k = 20, accuracy = 0.245312
    k = 20, accuracy = 0.265625
    k = 20, accuracy = 0.290625
    k = 20, accuracy = 0.284375
    k = 20, accuracy = 0.253125
    k = 50, accuracy = 0.235937
    k = 50, accuracy = 0.243750
    k = 50, accuracy = 0.271875
    k = 50, accuracy = 0.242188
    k = 50, accuracy = 0.254688
    k = 100, accuracy = 0.240625
    k = 100, accuracy = 0.239063
    k = 100, accuracy = 0.254688
    k = 100, accuracy = 0.246875
    k = 100, accuracy = 0.246875

    # plot the raw observations for k in k_choices:accuracies = k_to_accuracies[k]plt.scatter([k] * len(accuracies), accuracies)# plot the trend line with error bars that correspond to standard deviation accuracies_mean = np.array([np.mean(v) for k,v in sorted(k_to_accuracies.items())]) accuracies_std = np.array([np.std(v) for k,v in sorted(k_to_accuracies.items())]) plt.errorbar(k_choices, accuracies_mean, yerr=accuracies_std) plt.title('Cross-validation on k') plt.xlabel('k') plt.ylabel('Cross-validation accuracy') plt.show()

    # Based on the cross-validation results above, choose the best value for k, # retrain the classifier using all the training data, and test it on the test # data. You should be able to get above 28% accuracy on the test data. best_k = 5classifier = KNearestNeighbor() classifier.train(X_train, y_train) y_test_pred = classifier.predict(X_test, k=best_k)# Compute and display the accuracy num_correct = np.sum(y_test_pred == y_test) accuracy = float(num_correct) / num_test print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))

    總結

    以上是生活随笔為你收集整理的CS231n(1):图片分类笔记与KNN编程作业的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    免费av一级电影 | 丁香激情五月婷婷 | 视频福利在线观看 | 在线精品视频免费播放 | 在线免费观看视频你懂的 | 亚洲最新av网址 | 天天爱天天操天天爽 | 亚洲国产一区二区精品专区 | 久久麻豆视频 | 国产午夜在线观看视频 | 欧洲成人免费 | 久久av免费 | 不卡av在线免费观看 | 亚洲免费视频观看 | 国产精品免费视频网站 | 天天艹天天操 | 日韩欧美一区二区不卡 | 国产主播大尺度精品福利免费 | 久久免费资源 | 欧美一区二区伦理片 | www.久久精品视频 | 91成人亚洲 | 国产专区精品 | 久草电影在线 | 五月天六月婷婷 | 999久久| 人人天天夜夜 | 日本性xxxxx 亚洲精品午夜久久久 | 色在线中文字幕 | 国产激情小视频在线观看 | 最近中文字幕国语免费高清6 | 久色免费视频 | 日韩精品视频在线观看免费 | 特及黄色片 | 婷婷香蕉 | 国产精品久久久久久久久久妇女 | 久久午夜国产精品 | 亚洲播放一区 | 黄网在线免费观看 | 在线黄色观看 | 日本性高潮视频 | 国产成人精品女人久久久 | 999亚洲国产996395 | 久久精品国产亚洲精品2020 | 日本黄色免费在线观看 | 成人三级黄色 | 欧美一区日韩精品 | 国产又粗又猛又爽又黄的视频先 | 中文字幕一区二区三区乱码不卡 | 在线看的av网站 | 天天色天天草天天射 | 国产精品一区二区三区四区在线观看 | 亚洲精品午夜久久久久久久 | 久久久精品影视 | 国产在线精品一区二区三区 | 91视频观看免费 | www黄色软件 | 国产一二三四在线观看视频 | 日本黄网站 | 国产呻吟在线 | 成 人 黄 色 视频 免费观看 | 91麻豆精品国产91 | 国产亚洲资源 | 久久亚洲二区 | 成人免费视频视频在线观看 免费 | 亚洲狠狠丁香婷婷综合久久久 | 日精品在线观看 | 色视频网站免费观看 | 91精品一区国产高清在线gif | av免费网站观看 | 成年人国产精品 | 91视频一8mav | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产精品一区二区三区在线 | 欧美视频99 | 97精品国产一二三产区 | 日本护士三级少妇三级999 | 日韩亚洲在线视频 | 天天综合天天综合 | 青青久草在线视频 | 久久草在线视频国产 | 91插插插免费视频 | 国产福利av | 一区二区三区高清在线观看 | 国产特级毛片 | 成人黄色短片 | 欧美一区二区三区不卡 | 黄色大片日本免费大片 | 亚洲天堂网在线播放 | 天天射天天艹 | 麻豆视频免费看 | 黄色天堂在线观看 | 国产自在线 | 久久久久久久久久久久久国产精品 | 天天干,天天操,天天射 | 日本女人的性生活视频 | 91精品一区二区在线观看 | 国产999免费视频 | 激情网婷婷 | 日韩v在线| 黄a在线 | 毛片的网址 | 性色在线视频 | 久久免费公开视频 | 日韩免费高清在线观看 | 91av网站在线观看 | 国产蜜臀av| 精品视频不卡 | 婷婷久久五月天 | 久久三级视频 | 在线观看亚洲免费视频 | 天天弄天天干 | 91视视频在线直接观看在线看网页在线看 | 久久久久久久久久毛片 | 天天草视频 | 精品久久久久久久久久 | 日韩在线观看视频免费 | 丁香综合五月 | 福利电影一区二区 | 久久综合九色综合97_ 久久久 | 视频三区在线 | 精品亚洲一区二区三区 | 丁香激情综合久久伊人久久 | 99精彩视频在线观看免费 | 亚洲免费在线观看视频 | 日韩国产欧美在线视频 | 国产精品成人免费一区久久羞羞 | 国产在线免费观看 | 成年人电影免费看 | 久久论理| 97视频久久久 | 91在线蜜桃臀 | 激情影院在线 | 日韩精品一区二区在线观看 | 久章草在线观看 | 天天干天天干天天射 | 女人高潮特级毛片 | 中文字幕一区二区在线观看 | 91精彩视频在线观看 | 国产一区二区精 | 黄色av电影在线 | 欧美一区二区精品在线 | 欧美最猛性xxxxx(亚洲精品) | 99九九视频 | 久久激情综合网 | 在线免费看黄网站 | 久久视频免费在线 | 96精品高清视频在线观看软件特色 | 成人av高清在线 | 久久久精品欧美一区二区免费 | 国产成人精品久久亚洲高清不卡 | av免费试看 | 免费能看的黄色片 | 五月激情丁香婷婷 | 日韩欧美高清一区二区 | 伊色综合久久之综合久久 | 国产精品久久久久久久婷婷 | 九九热中文字幕 | 91亚洲精品久久久中文字幕 | 日韩av免费网站 | 黄色日批网站 | 很黄很色很污的网站 | 国产二区视频在线观看 | 超级碰碰视频 | 欧美一区二区三区在线 | 精品国产免费一区二区三区五区 | 日日干美女 | 欧美91在线 | 国产一区久久久 | 婷婷色综合 | 日日麻批40分钟视频免费观看 | 色综合天天做天天爱 | 欧美精品久久久久久久久久久 | 久久成人午夜 | 国产成人a亚洲精品 | 日韩精品一区二区三区丰满 | 亚洲高清视频在线 | 伊人天堂久久 | 婷婷五月情 | 成人一区二区三区在线 | 国产高清99| 久久九精品 | 日本最新一区二区三区 | 91手机电视 | 国产精品久久久久久a | 亚洲春色综合另类校园电影 | 最新中文字幕在线观看视频 | 国产不卡精品 | 亚洲人av免费网站 | 福利电影久久 | 三级av在线 | 国产又粗又硬又爽视频 | 国产99久久精品一区二区永久免费 | 久久综合久久综合九色 | 亚洲国产精品成人va在线观看 | 福利av影院| 97视频在线看 | 天天操夜操视频 | 欧美一级片在线免费观看 | 国产成人精品网站 | 探花视频在线观看+在线播放 | 中文字幕乱码亚洲精品一区 | 96香蕉视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 一区二区网 | www.久久久.com | 麻豆国产视频下载 | japanesefreesex中国少妇 | 国产中文字幕一区 | 天天爽人人爽 | 最近高清中文在线字幕在线观看 | 国产99久久久国产精品免费二区 | 久久艹人人| 成人黄色小说视频 | 欧美一区在线观看视频 | 久久国产精品99久久人人澡 | 国产精品久久久影视 | 激情自拍av | 欧美成人基地 | 综合中文字幕 | 国产午夜精品久久久久久久久久 | 免费成人在线观看 | 国产成人精品一区一区一区 | 狠狠狠色丁香婷婷综合久久88 | 9幺看片| 国产资源在线免费观看 | 大荫蒂欧美视频另类xxxx | 日韩视频一 | 亚洲午夜精品久久久 | 久久久久久久久久亚洲精品 | 亚洲人人精品 | 国产中文a | 国产精品美女久久久久久久久久久 | 69精品 | 午夜在线观看 | 亚洲经典在线 | 日韩高清不卡一区二区三区 | 在线视频麻豆 | 久久精品国产免费看久久精品 | 97在线观看免费高清完整版在线观看 | 久久精品视频在线免费观看 | 久久成人午夜 | 九九免费精品视频在线观看 | 一区二区三区日韩在线观看 | 高清色免费 | 久久久久久久久爱 | 国产在线播放一区二区三区 | 麻豆视频在线观看免费 | 久久久国产精品麻豆 | www.99在线观看 | 成人av资源网 | 日韩久久在线 | 激情视频91 | 国产天天综合 | 日韩精品一区二区三区水蜜桃 | 色噜噜狠狠色综合中国 | 精品免费国产一区二区三区四区 | 欧美一级片在线观看视频 | 中文字幕色播 | av免费电影在线观看 | 五月天激情开心 | 成人免费网站在线观看 | 日韩午夜电影院 | 99久在线精品99re8热视频 | 久久精品波多野结衣 | 久久久久黄色 | 毛片网在线观看 | 久久国产视屏 | 99精品国产在热久久 | 国内精品久久久久影院男同志 | 亚洲一级影院 | 亚洲特级片 | 国产又粗又猛又色又黄视频 | 日本不卡123 | 久草在线视频首页 | 狠狠色伊人亚洲综合网站色 | 国产伦精品一区二区三区四区视频 | 久久久久久综合网天天 | 亚洲欧美日韩一二三区 | 免费亚洲精品 | 最新久久久 | 人人狠狠综合久久亚洲婷 | 一区二区网| 欧美日韩中文字幕综合视频 | 亚洲最新精品 | 在线观看日韩免费视频 | 国产打女人屁股调教97 | 九九久 | 久久久久久久久精 | 视频成人永久免费视频 | 国产精品毛片网 | 精品一区二区在线免费观看 | 天天综合网~永久入口 | 懂色av一区二区在线播放 | 免费观看的av网站 | 亚洲日本精品视频 | 亚洲国产精品第一区二区 | 深爱激情综合 | 久久五月婷婷综合 | 久久免费av | 91视频这里只有精品 | a在线观看国产 | 亚洲精品视频在线 | 日韩久久在线 | 国产成人久久精品 | 欧美日韩在线精品 | 天天摸天天干天天操天天射 | 午夜精品一区二区三区免费 | 日韩高清www | 国产午夜三级一区二区三桃花影视 | 色婷婷视频 | 九九热视频在线 | 色久天| 久久成人高清视频 | 国产一区国产二区在线观看 | 黄色在线观看免费网站 | 最新国产精品亚洲 | 在线免费高清一区二区三区 | 少妇bbw搡bbbb搡bbb | 天天操天天色综合 | 成人黄色大片网站 | 亚洲一区免费在线 | 波多野结衣电影一区二区 | 亚洲欧美视屏 | 天天干天天操人体 | 91视频在线观看大全 | 久久激情视频网 | 久要激情网 | 欧美综合干| 国产中文a| 伊人亚洲综合 | 91.dizhi永久地址最新 | 91xav| 亚洲码国产日韩欧美高潮在线播放 | 欧美调教网站 | 欧美成人猛片 | 国产成人av免费在线观看 | 国产精品一区二区电影 | 天天天天天天天天操 | 99操视频 | 黄色一级性片 | 99久久精品无码一区二区毛片 | 亚洲欧洲国产精品 | 亚洲精品色婷婷 | 久操视频在线观看 | 在线观看久久 | 久久不见久久见免费影院 | 91亚洲激情 | 毛片永久新网址首页 | 国产69精品久久久久99尤 | 国产成人久久精品77777 | 免费看片成年人 | 九九热精 | 国产精品久久一区二区无卡 | 91欧美在线| 免费成人看片 | 在线99 | 午夜视频免费在线观看 | 99精品国产视频 | 成人一级电影在线观看 | 欧日韩在线视频 | 91伊人| 精品一区二区三区久久 | 日本最新高清不卡中文字幕 | 蜜臀av免费一区二区三区 | 天天插日日操 | 中文字幕中文字幕在线中文字幕三区 | 日本成人中文字幕在线观看 | 国产免费久久久久 | 99热国内精品 | 一级精品视频在线观看宜春院 | 欧美淫aaa免费观看 日韩激情免费视频 | 天天干天天干天天干天天干天天干天天干 | 成人网在线免费视频 | 91精品小视频| 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 少妇搡bbbb搡bbb搡忠贞 | 亚洲精品999| 9999在线视频 | 日本精品久久久久久 | 特级xxxxx欧美 | 91看片淫黄大片一级在线观看 | 五月天婷婷在线观看视频 | 国产91在线 | 美洲 | 三级大片网站 | 91在线播放综合 | 97在线超碰 | 日韩剧 | 色婷婷久久久综合中文字幕 | 一区二区三区四区五区在线 | 亚洲电影第一页av | 亚洲综合在线五月 | 亚洲干 | 国产精品一区二区精品视频免费看 | 九色琪琪久久综合网天天 | 日韩精品久久一区二区 | 国产不卡免费视频 | 天天操操 | 久久激情视频 久久 | 久产久精国产品 | 日韩黄色在线 | 在线观看视频一区二区三区 | 国产精品视频免费在线观看 | 国产中文字幕三区 | 69久久久久久久 | 国产剧情av在线播放 | 黄色免费大片 | 成人av在线播放网站 | 99视频精品免费视频 | 最近中文字幕久久 | 91亚色免费视频 | 亚洲一级影院 | 国产日韩视频在线观看 | 久久综合偷偷噜噜噜色 | 区一区二区三区中文字幕 | 在线免费色视频 | 色网站在线看 | 毛片视频电影 | 精品欧美一区二区三区久久久 | av在线免费网 | 成人久久电影 | 久久综合九色综合97_ 久久久 | 97人人看| 天天操天天玩 | 国产午夜精品一区二区三区欧美 | 九九综合在线 | 久草色在线观看 | 午夜精品视频免费在线观看 | 国产精品久久久久高潮 | 中文av网站| 欧美专区亚洲专区 | 麻豆传媒视频在线播放 | 亚洲激情av | 日韩日韩日韩日韩 | 成人97人人超碰人人99 | 国产一区视频在线 | 中文字幕在线网 | 狠狠色噜噜狠狠狠狠 | 96av在线| 国产探花视频在线播放 | 日韩理论在线视频 | 99视屏 | 亚洲欧洲国产视频 | 国产午夜精品一区二区三区嫩草 | www四虎影院 | 成人在线黄色电影 | 久久久午夜精品理论片中文字幕 | 手机在线看片日韩 | 久久精品国产一区二区电影 | 国产精品高清免费在线观看 | 国产亚洲精品bv在线观看 | 久久久综合电影 | 亚洲电影黄色 | 免费看一级一片 | 在线观看日韩专区 | 99成人在线视频 | 中文字幕在线观看完整版 | 天天色天天操综合 | 久久精品国产成人精品 | www免费| 激情文学综合丁香 | 一级黄色大片在线观看 | 激情av在线播放 | 日韩欧美一区二区在线观看 | 久草在线手机观看 | 国产免费三级在线观看 | 六月婷婷久香在线视频 | 亚洲成人资源在线观看 | 精品国产乱码久久久久久1区二区 | 香蕉网在线观看 | 婷婷久月 | 中文字幕中文字幕在线中文字幕三区 | 国产专区一 | 国产一级在线看 | 久久精品96 | 91精品黄色| 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲国产免费网站 | 一区 二区电影免费在线观看 | 久久久久久久久久久久99 | 国产尤物视频在线 | 草久草久 | 爱爱av网站| 日本久久高清视频 | 人成在线免费视频 | 99国产精品久久久久久久久久 | 超碰个人在线 | 久久久久国产视频 | 91尤物国产尤物福利在线播放 | 国产精品丝袜在线 | 久久精品79国产精品 | 亚洲精品日韩av | 久久精品电影院 | 日韩精品字幕 | 激情av网 | 在线免费观看黄色大片 | www狠狠操| 国产高清成人 | 久草在线观看视频免费 | 国精产品一二三线999 | 国产精品12| 91在线入口 | 成人黄色小说在线观看 | 国产精品欧美一区二区三区不卡 | 91麻豆精品 | 国产拍在线 | 国内精品视频一区二区三区八戒 | 在线观看av网 | 日韩电影久久 | 久久99精品热在线观看 | 久久综合之合合综合久久 | 久久观看最新视频 | 日韩视频精品在线 | 久草com| 欧美日韩视频一区二区三区 | 久久国产精品99久久久久久丝袜 | 欧美精品久久久久久久久久 | 久久国产视频网站 | 中国黄色一级大片 | 亚洲综合视频在线播放 | 国产精品一区二区三区电影 | av福利资源 | 日本韩国精品一区二区在线观看 | 国产午夜精品久久久久久久久久 | 亚洲电影一区二区 | 五月婷婷丁香色 | www.亚洲精品视频 | 亚洲久草在线 | 日韩久久精品一区二区 | 日日爽夜夜操 | 亚洲综合色视频在线观看 | 亚洲日韩中文字幕 | 日韩| 欧美天天干 | 福利电影久久 | 婷婷激情5月天 | 天天操天天舔天天爽 | 少妇bbw搡bbbb搡bbb | 中文字幕亚洲欧美 | 九九热免费在线视频 | 免费久久久 | 黄色电影在线免费观看 | 欧美综合久久久 | 中文字幕在线精品 | 亚洲天天在线日亚洲洲精 | 激情自拍av| 久艹视频在线观看 | 中文字幕久久精品一区 | 日韩专区av | 五月婷婷香蕉 | 日本久久成人中文字幕电影 | 久久精品3| 国产黄色av影视 | 香蕉视频在线观看免费 | 亚洲视频精选 | 国产精品久久久久久久久免费看 | 日韩午夜电影网 | 成年人精品 | 国产91国语对白在线 | 五月婷婷六月丁香在线观看 | 激情视频二区 | 午夜一级免费电影 | 人人网av| 黄p网站在线观看 | 不卡电影一区二区三区 | 91精品视频一区二区三区 | 2018亚洲男人天堂 | 欧美最新大片在线看 | 欧美日韩一区二区在线观看 | 日本在线中文在线 | 婷婷在线不卡 | 在线视频成人 | av高清网站在线观看 | 99亚洲精品 | 99久久精品国产网站 | www色婷婷com | 91激情视频在线观看 | 成人av中文字幕在线观看 | 国产精品二区在线 | 免费又黄又爽 | 国产小视频免费观看 | 97久久久免费福利网址 | 精品在线视频播放 | 国产91av视频在线观看 | 青草视频免费观看 | 亚洲精品国产精品国自产观看浪潮 | av电影在线免费 | 成人午夜毛片 | 免费精品国产va自在自线 | 久草视频播放 | 国产精选在线观看 | 久久国内精品99久久6app | 成人久久电影 | 91桃色在线播放 | 国产精品入口66mio女同 | 精品美女久久 | 天天干天天干天天干天天干天天干天天干 | 97国产精品久久 | 在线观看一级视频 | 91精品在线视频观看 | 成人夜晚看av | 日韩在线二区 | 欧美日韩不卡在线 | 午夜精品久久久久久中宇69 | 操操日日| 欧美激情h | 在线观看免费成人 | 日韩系列 | 国产精品久久久区三区天天噜 | 粉嫩一二三区 | 亚洲精品在线观看中文字幕 | www五月婷婷 | 色av婷婷| 精品亚洲二区 | 日本精品中文字幕在线观看 | 精品美女久久久久 | 狠狠撸电影 | 亚洲精品乱码久久久一二三 | 久久成人欧美 | 999久久国产精品免费观看网站 | 日韩理论片在线观看 | 麻豆高清免费国产一区 | 亚洲最新视频在线 | 婷婷六月在线 | 久久99国产精品免费网站 | 久久99精品国产一区二区三区 | 色在线高清 | 中文字幕一区二区三区在线视频 | 亚洲aⅴ一区二区三区 | 久热超碰 | 成人av影视在线 | 国产精品久久久久影院日本 | 午夜av影院| 丁香五月网久久综合 | 亚洲成年人免费网站 | 草莓视频在线观看免费观看 | 亚洲精品乱码久久久久久写真 | 国产视频欧美视频 | 国产亚洲婷婷免费 | 在线看成人av | 亚洲专区在线播放 | 中文字幕日本在线观看 | 黄p在线播放 | 美女久久久久 | 国产九九九九九 | 午夜精品久久久久久久久久久久 | 亚洲精品一区二区精华 | 久久国产精品99久久久久久老狼 | 免费精品视频在线观看 | 99精品国产免费久久 | 伊人婷婷激情 | 国产女人40精品一区毛片视频 | 日日摸日日添夜夜爽97 | 91精品一区在线观看 | 久久综合中文字幕 | 激情图片区 | 黄污在线观看 | 亚洲成人资源在线观看 | 精品欧美一区二区三区久久久 | 亚洲精品国产第一综合99久久 | 91毛片在线 | 国产一区二区综合 | 久草在线最新免费 | 人人澡人人草 | 亚洲 欧洲 国产 日本 综合 | 色在线免费观看 | 黄色网大全 | 午夜久久福利 | 久久精品一区二区三区视频 | 911av视频| 欧美aaaxxxx做受视频 | 特级黄色视频毛片 | 国产五月色婷婷六月丁香视频 | 色综合婷婷久久 | 婷婷av网 | 欧美一区三区四区 | 久久少妇免费视频 | 在线观看精品视频 | 亚洲国产日韩av | www.婷婷色 | 色综合久久综合网 | 麻豆国产网站入口 | 亚洲婷婷网| 日韩在线视频一区二区三区 | 黄色a级片在线观看 | 在线天堂8√ | 亚洲精品一区二区三区高潮 | 天天爽人人爽夜夜爽 | 国产成人一区二区啪在线观看 | 丰满少妇一级 | 成人资源网 | 午夜视频在线观看一区二区三区 | 福利一区在线视频 | 久久精品视频免费观看 | 亚洲最新视频在线 | 国产在线久草 | 激情五月婷婷综合网 | 99精品久久只有精品 | 亚洲精品中文字幕在线 | 美女视频网| 国产一区二区三区免费观看视频 | 久久精品99国产国产精 | 成人在线视频你懂的 | 久久小视频 | 日韩欧美有码在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 婷婷久久亚洲 | 黄色影院在线免费观看 | 欧美午夜精品久久久久久孕妇 | 韩日精品中文字幕 | 日韩在线一区二区免费 | 国产福利一区在线观看 | 91亚洲综合 | 99视频在线观看一区三区 | 日韩av高清在线观看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 天天射,天天干 | 国产精品久久电影网 | 97在线观看 | 亚洲成a人片综合在线 | 久久久久久久久久亚洲精品 | 亚洲午夜精品一区二区三区电影院 | 国产精品成人久久久久 | 青春草国产视频 | 欧美性生爱 | 日韩一级黄色大片 | 国产成人久久精品77777 | 四虎影视成人精品国库在线观看 | 国产偷在线 | 色综合www| 久久伊人国产精品 | 成年人电影毛片 | 欧美性色综合 | 久久九九精品 | 夜夜骑天天操 | 久久成人18免费网站 | 99视频免费在线观看 | 国产91电影在线观看 | 色婷婷啪啪免费在线电影观看 | 亚洲成人高清在线 | 最新av网址在线 | 亚州av成人 | 国内精品久久久久久久97牛牛 | 成人欧美日韩国产 | 成人夜晚看av | 国产福利免费在线观看 | 国产一级电影 | 天天操夜夜爱 | 9在线观看免费高清完整 | 午夜久久久久久久久久影院 | 久久丝袜视频 | 国产理论影院 | 亚洲精品国产精品国自产在线 | 亚洲精品在线观看视频 | 91九色在线视频 | 久久爱综合 | 日韩视 | 久久99偷拍视频 | 天堂v中文 | 天天做天天爱天天综合网 | 欧美日韩aa | 成av在线| 色干干 | 日本久久久久久久久久久 | 91 在线视频 | 99精品国产99久久久久久福利 | 久9在线| 91av在线视频播放 | av中文国产 | 久久久久久免费 | 国产精品a级 | 久久久久伊人 | 91视频这里只有精品 | 日韩电影中文,亚洲精品乱码 | 国产日韩欧美在线播放 | 伊人五月 | 亚洲精品高清视频在线观看 | 亚洲欧洲精品一区二区精品久久久 | 国产成人在线精品 | 麻豆国产视频下载 | 在线免费观看国产黄色 | 成人精品国产 | 日韩高清无线码2023 | 欧美网址在线观看 | 国产视频一区在线免费观看 | 日韩精品一区二区三区丰满 | 成人午夜黄色 | 久久99热精品这里久久精品 | 久久综合给合久久狠狠色 | 成人宗合网 | 中文字幕韩在线第一页 | 国产精品av免费 | 婷婷5月色 | 婷婷视频在线 | 操老逼免费视频 | 日韩中文字幕免费看 | 怡红院av | 玖玖国产精品视频 | 久久99精品国产99久久 | 精品久久综合 | 欧美在线观看小视频 | 色99色 | 国产视频不卡 | 亚洲视频在线观看免费 | 日本中文乱码卡一卡二新区 | 久久色在线播放 | 中文字幕乱码电影 | 久久精品在线视频 | 国产高清福利在线 | 一级欧美黄 | 五月婷婷综 | 亚洲精品福利在线观看 | 日韩一级片观看 | 一区二区三区在线观看中文字幕 | 国产午夜一级毛片 | 一区二区三区在线免费播放 | 中文字幕在线视频一区 | 欧美日韩午夜在线 | 国产精品1区 | 超碰人人乐 | 97人人澡人人爽人人模亚洲 | 亚洲美女在线国产 | 一级a性色生活片久久毛片波多野 | 日韩丝袜在线观看 | 久久久电影 | 一本—道久久a久久精品蜜桃 | 欧美 国产 视频 | 国产精品粉嫩 | 免费下载高清毛片 | 麻豆一区二区 | 四虎影视成人永久免费观看视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品国产成人在线 | 欧美天堂久久 | 中文字幕一区二区三区乱码在线 | 欧美网址在线观看 | 日本久久视频 | 欧美日在线观看 | 国产免费一区二区三区网站免费 | 国产精品99久久久久 | 国产精品s色 | 婷婷亚洲五月色综合 | 99精品国产99久久久久久福利 | 欧美在线18 | 日日爽日日操 | 国产尤物在线 | 久久久久97国产 | 成人免费视频网 | 久久久久欠精品国产毛片国产毛生 | 欧美一级电影 | 欧美日韩高清在线 | 九九涩涩av台湾日本热热 | 91av视频在线免费观看 | 美女免费视频一区 | 美女久久久久久久 | 欧美精品国产精品 | 久久久国产一区二区三区四区小说 | 99精品在线 | 色综合久久88色综合天天 | 国产一级精品在线观看 | 午夜精品一区二区三区可下载 | 国产一区二区久久久久 | 中文av一区二区 | 91精品第一页 | 日韩一二区在线观看 | 国产精品手机播放 | 免费视频99 | 国产日韩在线观看一区 | 亚洲人久久久 | 在线免费观看欧美日韩 | 91中文字幕在线 | 国内外成人在线视频 | 超碰在线cao | 欧美坐爱视频 | 久草视频观看 | 久久久久久国产精品久久 | 天天操天天射天天 | 91激情视频在线观看 | av中文字幕在线电影 | 国产精品乱码一区二三区 | 久久永久免费视频 | 欧美精品三级在线观看 | 五月婷婷六月综合 | 国产日韩精品在线 | 综合在线亚洲 | 91在线视频观看 | 久久日韩精品 | 亚洲国产欧美在线看片xxoo | 国产精品mm | 欧美日韩精品网站 | 久久香蕉国产精品麻豆粉嫩av | 亚洲精品午夜久久久久久久久久久 | 97成人精品 | 天天干天天操人体 | 超碰成人免费电影 | 天天干 夜夜操 | 亚洲精品五月 | 亚洲乱码久久 | 成人毛片在线观看 | 久久爱资源网 | 怡红院av久久久久久久 | 国产精品美女久久 | 国产精品免费观看网站 | 亚洲激情校园春色 | 国产a国产| 色老板在线视频 | 在线视频久久 | 免费久久久久久 | 丝袜制服天堂 | 五月婷婷六月综合 | 丁香视频五月 | 五月天久久 | 色吊丝在线永久观看最新版本 | 99re中文字幕 | 日韩区欧美久久久无人区 | 国产精品国产三级国产aⅴ9色 | 成人97视频一区二区 | av在线之家电影网站 | 2019精品手机国产品在线 | av在观看 | 狠狠躁夜夜a产精品视频 | 久久成人精品电影 | 中文字幕韩在线第一页 | 久久婷五月 | 色香蕉在线视频 | 欧美国产大片 | 中文字幕视频一区二区 | www久久99| 久久热亚洲 | 中文字幕在线观看国产 | 欧美精品中文 | 国产精品久久二区 | 在线a人v观看视频 | 亚洲自拍偷拍色图 | 亚洲国产资源 | 中文av不卡 | 波多野结衣在线观看一区 | 天天干天天干天天色 | 99久久99久久精品 | 天堂在线免费视频 | 五月天婷婷免费视频 | 国产视频黄 | 色综合天天天天做夜夜夜夜做 | 国产在线专区 | 国产精品久久一区二区三区, | 精品国产一区二区三区久久 | 亚欧洲精品视频在线观看 | www久久 | 中文字幕永久 | 日韩成人xxxx | 午夜精品久久久久久久99水蜜桃 | 亚洲乱码精品久久久久 | 日日干天天爽 | 成人网中文字幕 | 青春草视频在线播放 | 亚洲精品99 | 久久观看最新视频 | 黄色录像av | 亚洲国产一区二区精品专区 | 在线www色 | 日韩欧美一级二级 | 色www精品视频在线观看 | 国产精品不卡视频 | 久草视频免费在线播放 | 中文资源在线播放 | 久久久久福利视频 | 久久国产精品免费观看 | 免费人成在线观看网站 | 高清视频一区二区三区 | 99久久999久久久精玫瑰 | 91精品国产自产在线观看永久 | 女人久久久久 | 日韩高清二区 | 免费一级片视频 | 国产精品尤物 | 丁香激情网 | 国产精品永久免费视频 | 国产自产高清不卡 | 91成人小视频 | 国产成人一区二区三区久久精品 | 亚洲高清在线 | 国产糖心vlog在线观看 | 国色综合 | 欧美精品国产综合久久 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 激情综合色图 | 国产精品午夜av | 国产高清视频在线 | 在线岛国av | 久久久穴 | 国产黄色a | av免费在线看网站 | 天堂中文在线播放 | 美女网站色| 欧美在线视频一区二区三区 | 中文字幕在线观看2018 | 国产在线一卡 | 97精品视频在线播放 |