Horses And Humans

Beginning

Imports

Python

from functools import partial
from pathlib import Path
import random
import zipfile

PyPi

from expects import (
    be_true,
    expect,
)
from holoviews.operation.datashader import datashade
from keras import backend
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import (ImageDataGenerator,
                                                  img_to_array, load_img)
import cv2
import holoviews
import matplotlib.pyplot as pyplot
import numpy
import requests
import tensorflow

My Stuff

from graeae import EmbedHoloviews
Embed = partial(EmbedHoloviews, 
                folder_path="../../files/posts/keras/horses-and-humans/")
holoviews.extension("bokeh")

Middle

The Data Set

OUTPUT = "~/data/datasets/images/horse-or-human/training/"
output_path = Path(OUTPUT).expanduser()
if not output_path.is_dir():
    print("Downloading the images")
    URL = ("https://storage.googleapis.com/"
           "laurencemoroney-blog.appspot.com/"
           "horse-or-human.zip")
    response = requests.get(URL)
    ZIP = "/tmp/horse-or-human.zip"
    with open(ZIP, "wb") as writer:
        writer.write(response.content)
    print(f"Downloaded zip to {ZIP}")
    with zipfile.ZipFile(ZIP, "r") as unzipper:
        unzipper.extractall(output_path)
else:
    print("Files exist, not downloading")
expect(output_path.is_dir()).to(be_true)
for thing in output_path.iterdir():
    print(thing)
data_path = output_path
Files exist, not downloading
/home/athena/data/datasets/images/horse-or-human/training/horses
/home/athena/data/datasets/images/horse-or-human/training/humans

The convention for training models for computer vision appears to be that you use the folder names to label the contents of the images within them. In this case we have horses and humans.

Here's what some of the files themselves are named.

horses_path = output_path/"horses"
humans_path = output_path/"humans"

for path in (horses_path, humans_path):
    print(path.name)
    for index, image in enumerate(path.iterdir()):
        print(f"File: {image.name}")
        if index == 9:
            break
    print()
horses
File: horse48-5.png
File: horse45-8.png
File: horse13-5.png
File: horse34-4.png
File: horse46-5.png
File: horse02-3.png
File: horse06-3.png
File: horse32-1.png
File: horse25-3.png
File: horse04-3.png

humans
File: human01-07.png
File: human02-11.png
File: human13-07.png
File: human10-10.png
File: human15-06.png
File: human05-15.png
File: human06-18.png
File: human16-28.png
File: human02-24.png
File: human10-05.png

So, in this case you can tell what they are from the file-names as well. How many images are there?

horse_files = list(horses_path.iterdir())
human_files = list(humans_path.iterdir())
print(f"Horse Images: {len(horse_files)}")
print(f"Human Images: {len(human_files)})")
print(f"Image Shape: {pyplot.imread(str(horse_files[0])).shape}")
Horse Images: 500
Human Images: 527)
Image Shape: (300, 300, 4)

This is sort of a small data-set, and it's odd that there are more humans than horses. Let's see what some of them look like. I'm assuming all the files have the same shape. In this case it looks like they are 300 x 300 with four channels (RGB and alpha?).

height = width = 300
count = 4
columns = 2
horse_plots = [datashade(holoviews.RGB.load_image(str(horse)).opts(
    height=height,
    width=width,
))
               for horse in horse_files[:count]]
human_plots = [datashade(holoviews.RGB.load_image(str(human))).opts(
    height=height,
    width=width,
)
               for human in human_files[:count]]

plot = holoviews.Layout(horse_plots + human_plots).cols(2).opts(
    title="Horses and Humans")
Embed(plot=plot, file_name="horses_and_humans", 
      height_in_pixels=900)()

Figure Missing

As you can see, the people in the images aren't really humans (and it may not be so obvious, but they aren't horses either), these are computer-generated images.

A Model

As before, the model will be a sequential model with convolutional layers. In this case we'll have five convolutional layers before passing the convolved images to the fully-connected layer. Although my inspection showed that the images have 4 channels, the model in the example only uses 3.

Also, in this case we are doing a binary classification (it's either a human or a horse, so instead of the softmax activation function on the output layer we're using a Sigmoid function (documentation link).

model = tensorflow.keras.models.Sequential()

The Input Layer

The input layer is a Convolutional layer with 16 layers and a 3 x 3 filter (all the convolutions use the same filter shape). All the convolutional layers are also followed by a max-pooling layer that halves their size.

model.add(tensorflow.keras.layers.Conv2D(16, (3,3), 
                                         activation='relu', 
                                         input_shape=(300, 300, 3)))
model.add(tensorflow.keras.layers.MaxPooling2D(2, 2))

The Rest Of The Convolutional Layers

The remaining convolutional layers increase the depth by doubling until they reach 64.

# The second convolution
model.add(tensorflow.keras.layers.Conv2D(32, (3,3), 
                                         activation='relu'))
model.add(tensorflow.keras.layers.MaxPooling2D(2,2))

# The third convolution
model.add(tensorflow.keras.layers.Conv2D(64, (3,3), 
                                         activation='relu'))
model.add(tensorflow.keras.layers.MaxPooling2D(2,2))

# The fourth convolution
model.add(tensorflow.keras.layers.Conv2D(64, (3,3), 
                                         activation='relu'))
model.add(tensorflow.keras.layers.MaxPooling2D(2,2))

# The fifth convolution
model.add(tensorflow.keras.layers.Conv2D(64, (3,3), 
                                         activation='relu'))
model.add(tensorflow.keras.layers.MaxPooling2D(2,2))

The Fully Connected Layer

Once we have the convolved version of our image, we feed it into the fully-connected layer to get a classification.

First we flatten the input into a vector.

model.add(tensorflow.keras.layers.Flatten())

Then we feed the input into a 512 neuron fully-connected layer.

model.add(tensorflow.keras.layers.Dense(512, activation='relu'))

And now we get to our output layer which makes the prediction of whether the image is a human or a horse.

model.add(tensorflow.keras.layers.Dense(1, activation='sigmoid'))

One thing that's not so obvious is what the output means - is it predicting that it's a human or that it's a horse? There isn't really anything to indicate which is which. Presumably, like the case with the MNIST and Fashion MNIST, the alphabetical ordering of the folders is what determines what we're predicting.

A Summary of the Model.

print(model.summary())
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_10 (Conv2D)           (None, 298, 298, 16)      448       
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 149, 149, 16)      0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 147, 147, 32)      4640      
_________________________________________________________________
max_pooling2d_11 (MaxPooling (None, 73, 73, 32)        0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 71, 71, 64)        18496     
_________________________________________________________________
max_pooling2d_12 (MaxPooling (None, 35, 35, 64)        0         
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 33, 33, 64)        36928     
_________________________________________________________________
max_pooling2d_13 (MaxPooling (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_14 (Conv2D)           (None, 14, 14, 64)        36928     
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 7, 7, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 3136)              0         
_________________________________________________________________
dense_5 (Dense)              (None, 512)               1606144   
_________________________________________________________________
dense_6 (Dense)              (None, 1)                 513       
=================================================================
Total params: 1,704,097
Trainable params: 1,704,097
Non-trainable params: 0
_________________________________________________________________
None

That's a lot of parameters… It's interesting to note that by the time the data gets fed into the Flatten layer it has been reduced to a 7 x 7 x 64 matrix.

print(f"300 x 300 x 3 = {300 * 300 * 3:,}")
300 x 300 x 3 = 270,000

So the original input has been reduced form 270,000 pixels to 3,136 when it gets to the fully-connected layer.

Compile the Model

The optimizer we're going to use is the RMSprop optimizer, which, unlike SGD, tunes the learning rate as it progresses. Also, since we only have two categories, the loss function will be binary crossentropy. Our metric will once again be accuracy.

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=0.001),
              metrics=['acc'])

Transform the Data

We're going to use the ImageDataGenerator to preprocess the images to get them to normalized and batched. This class also supports transforming the images to create more variety in the training set.

training_data_generator = ImageDataGenerator(rescale=1/255)

The flow_from_directory method takes a path to the directory of images and generates batches of augmented data.

training_batches = training_data_generator.flow_from_directory(
    data_path, 
    target_size=(300, 300),
    batch_size=128,
    class_mode='binary')
Found 1027 images belonging to 2 classes.

Training the Model

history = model.fit_generator(
    training_batches,
    steps_per_epoch=8,  
    epochs=15,
    verbose=2)
Epoch 1/15
8/8 - 5s - loss: 0.7879 - acc: 0.5732
Epoch 2/15
8/8 - 4s - loss: 0.7427 - acc: 0.6615
Epoch 3/15
8/8 - 4s - loss: 0.8984 - acc: 0.6897
Epoch 4/15
8/8 - 4s - loss: 0.3973 - acc: 0.8165
Epoch 5/15
8/8 - 4s - loss: 0.2011 - acc: 0.9188
Epoch 6/15
8/8 - 5s - loss: 1.2254 - acc: 0.7373
Epoch 7/15
8/8 - 4s - loss: 0.2228 - acc: 0.8902
Epoch 8/15
8/8 - 4s - loss: 0.1798 - acc: 0.9333
Epoch 9/15
8/8 - 5s - loss: 0.2079 - acc: 0.9287
Epoch 10/15
8/8 - 4s - loss: 0.3128 - acc: 0.8999
Epoch 11/15
8/8 - 4s - loss: 0.0782 - acc: 0.9722
Epoch 12/15
8/8 - 4s - loss: 0.0683 - acc: 0.9711
Epoch 13/15
8/8 - 4s - loss: 0.1263 - acc: 0.9789
Epoch 14/15
8/8 - 5s - loss: 0.6828 - acc: 0.8574
Epoch 15/15
8/8 - 4s - loss: 0.0453 - acc: 0.9855

The training loss is very low and we seem to have reached 100% accuracy.

Looking At Some Predictions

test_path = Path("~/test_images/").expanduser()
height = width = 400
plots = [datashade(holoviews.RGB.load_image(str(path))).opts(
    title=f"{path.name}",
    height=height,
    width=width
) for path in test_path.iterdir()]
plot = holoviews.Layout(plots).cols(2).opts(title="Test Images")
Embed(plot=plot, file_name="test_images", height_in_pixels=900)()

Figure Missing

Horse

target_size = (300, 300)

images = (("horse.jpg", "Horse"), 
          ("centaur.jpg", "Centaur"), 
          ("tomb_figure.jpg", "Statue of a Man Riding a Horse"),
          ("rembrandt.jpg", "Woman"))
for filename, label in images:
    loaded = cv2.imread(str(test_path/filename))
    x = cv2.resize(loaded, target_size)
    x = numpy.reshape(x, (1, 300, 300, 3))
    prediction = model.predict(x)
    predicted = "human" if prediction[0] > 0.5 else "horse"
    print(f"The {label} is a {predicted}.")
The Horse is a horse.
The Centaur is a horse.
The Statue of a Man Riding a Horse is a human.
The Woman is a horse.

Strangely, the model predicted the woman was a horse.

Visualizing The Layer Outputs

outputs = [layer.output for layer in model.layers[1:]]
new_model = Model(inputs=model.input, outputs=outputs)
image_path = random.choice(horse_files + human_files)
image = load_img(image_path, target_size=target_size)
x = img_to_array(image)
x = x.reshape((1,) + x.shape)

x /= 255.

predictions = new_model.predict(x)
layer_names = [layer.name for layer in model.layers]
for layer_name, feature_map in zip(layer_names, predictions):
  if len(feature_map.shape) == 4:
    # Just do this for the conv / maxpool layers, not the fully-connected layers
    n_features = feature_map.shape[-1]  # number of features in feature map
    # The feature map has shape (1, size, size, n_features)
    size = feature_map.shape[1]
    # We will tile our images in this matrix
    display_grid = numpy.zeros((size, size * n_features))
    for i in range(n_features):
      # Postprocess the feature to make it visually palatable
      x = feature_map[0, :, :, i]
      x -= x.mean()
      x /= x.std()
      x *= 64
      x += 128
      x = numpy.clip(x, 0, 255).astype('uint8')
      # We'll tile each filter into this big horizontal grid
      display_grid[:, i * size : (i + 1) * size] = x
    # Display the grid
    scale = 20. / n_features
    pyplot.figure(figsize=(scale * n_features, scale))
    pyplot.title(layer_name)
    pyplot.grid(False)
    pyplot.imshow(display_grid, aspect='auto', cmap='viridis')

layer_visualization.png

Some of the images seem blank (or nearly so). It's hard to really interpret what's going on here.

End

Source

This is a walk-through of the Course 1 - Part 8 - Lesson 2 - Notebook.ipynb on github.

Convolution Exploration

Beginning

This is a look at how convolution and pooling works. We're going to create three filters and apply them to an image to see how it changes them. Then we're going to apply Max-Pooling to the same image to see how this affects it.

Imports

Python

from argparse import Namespace
from functools import partial

PyPi

import cv2
import holoviews
import numpy
from scipy import misc

My Stuff

from graeae import EmbedHoloviews

Some Setup

The Plotting

holoviews.extension("bokeh")
Embed = partial(EmbedHoloviews,
               folder_path="../../files/posts/keras/convolution-exploration/")
Plot = Namespace(
    width=700,
    height=700,
)

Middle

The Ascent

This is an exploration of how convolutions work that uses a grayscale image provided by scipy called ascent.

image = misc.ascent()
plot = holoviews.Image(image).opts(
    title="Ascent",
    height=Plot.height,
    width=Plot.width,
    tools=["hover"],
)
Embed(plot=plot, file_name="ascent")()

Figure Missing

Note that, as I mentioned before, this is a grayscale image - Holoviews artificially tints it.

Now we're going to make a copy of the image and get its dimensions.

transformed_image = numpy.copy(image)
rows, columns = transformed_image.shape
print(f"Rows: {rows}, Columns: {columns}")
Rows: 512, Columns: 512

Creating Filters

A First Filter

Our filter is going to be a 3 x 3 array. The original lesson said that it is an edge-detector, but I don't think that that's the case.

filter_1 = numpy.array([[-1, -2, -1], 
                        [0, 0, 0], 
                        [1, 2, 1]])
print(filter_1.sum())
0
  • Applying the Filter

    To apply the filter we need to traverse the cells and multiply the filter by the values of the image that match the current location of the filter. Since the filter is a 3 x 3 array, there is a 1-pixel "padding" around the center so when we do the traversals we start and end one row and column away from the each edge. After multiplying the filter by the section of the image that it overlays, we sum it and then make sure that it stays within the 0 - 255 range that's valid for images. Finally, the value our filter created is stored back into our transformed_image.

    class Convolver:
        """Applies a convolution to an image
    
        Args:
         image: the source image to convolve
         image_filter: the filter to apply
         identifier: something to identify the filter
        """
        def __init__(self, image: numpy.ndarray, image_filter: numpy.ndarray,
                     identifier: str):
            self.image = image
            self.identifier = identifier
            self._image_filter = None
            self.image_filter = image_filter
            self._transformed_image = None
            self._rows = None
            self._columns = None
            return
    
        @property
        def image_filter(self) -> numpy.ndarray:
            """The filter to apply to the image"""
            return self._image_filter
    
        @image_filter.setter
        def image_filter(self, new_filter: numpy.ndarray) -> None:
            """Stores the filter normalized to zero or one"""
            if new_filter.sum() != 0:
                new_filter = new_filter/new_filter.sum()
                print(f"Filter sum: {new_filter.sum()}")
            self._image_filter = new_filter
            return
    
        @property
        def rows(self) -> int:
            """the number of rows in the image"""
            if self._rows is None:
                self._rows, self._columns = self.image.shape
            return self._rows
    
        @property
        def columns(self) -> int:
            """number of columns in the image"""
            if self._columns is None:
                self._rows, self._columns = self.image.shape
            return self._rows
    
        @property
        def transformed_image(self) -> numpy.ndarray:
            """The image to transform"""
            if self._transformed_image is None:
                self._transformed_image = self.image.copy()
                for row in range(1, self.rows - 1):
                    for column in range(1, self.columns - 1):
                        convolution = (
                            self._transformed_image[
                                row - 1: row + 2, 
                                column-1: column + 2] * self.image_filter).sum()
                        convolution = max(0, convolution)
                        convolution = min(255, convolution)
                        self._transformed_image[row, column] = convolution
            return self._transformed_image
    
        def plot(self) -> None:
            """Plots the transformed image
           """
            height = width = Plot.height - 200
            image_1 = holoviews.Image(self.transformed_image).opts(
                height=height,
                width=width,
            )
            image_2 = holoviews.Image(self.image).opts(
                height=height,
                width=width,
            )
            plot = (image_2 + image_1).opts(
                title=f"Ascent Transformed ({self.identifier})"
            )
            Embed(plot=plot, file_name=self.identifier, 
                  height_in_pixels=height + 100)()
    
  • Looking at the Convolution's Output
    convolver = Convolver(image, filter_1, "filter_1")
    convolver.plot()
    

    Figure Missing

    This looks like it might be a contrast filter.

Try Another Filter

filter_2 = numpy.array([
    [0, 1, 0], 
    [1, -4, 1], 
    [0, 1, 0]])
convolver = Convolver(image, filter_2, "filter_2")
convolver.plot()

Figure Missing

I'm not sure what that filter is. It seems to find the darkest parts of the image.

Filter 3

filter_3 = numpy.array([
    [-1, 0, 1], 
    [-2, 0, 2], 
    [-1, 0, 1]])
convolver = Convolver(image, filter_3, "filter_3")
convolver.plot()

Figure Missing

I'm not sure exactly what that's doing. Based on what the filter looks like I would guess that it's finding vertical and horizontal lines.

Pooling

Now we'll look at what happens when you apply a halving (2, 2) pooling to an image. This iterates over every other pixel, looking at the current pixel, the pixel to the right, below and diagonally below and to the right and keeping the highest value in those four pixels.

output = numpy.zeros((int(rows/2), int(columns/2)))
stride = 2
for row in range(0, rows, stride):
    for column in range(0, columns, stride):
        pixel = image[row: row+2, column: column+2].max()
        output[int(row/2), int(column/2)] = pixel

print(f"Original Shape: {image.shape}")
print(f"Pooled Shape: {output.shape}")
Original Shape: (512, 512)
Pooled Shape: (256, 256)
plot = holoviews.Image(output).opts(
    height=Plot.height,
    width=Plot.width,
    title="Ascent With Pooling",
)
Embed(plot=plot, file_name="pooling")()

Figure Missing

The thing to note here is that, even though the image is half the size, you can still make out the features (although there is some loss of resolution).

Convolutional Neural Networks and Fashion MNIST

Beginning

The goal of this exercise is to create a model that can classify the Fashion MNIST data better than our previous single hidden-layer model.

Imports

PyPi

import matplotlib.pyplot as pyplot
import numpy
import seaborn
import tensorflow

My Stuff

from graeae.timers import Timer

Set Up

The Timer

TIMER = Timer()

The Data

(training_images, training_labels), (testing_images, testing_labels) = (
    tensorflow.keras.datasets.fashion_mnist.load_data())

training_images = training_images / 255
testing_images = testing_images / 255

Plotting

Middle

Some Exploratory Work

A Baseline Model

Our baseline that we want to beat is a model with a single dense hidden layer with 128 nodes.

model = tensorflow.keras.models.Sequential()
model.add(tensorflow.keras.layers.Flatten())
model.add(tensorflow.keras.layers.Dense(128, activation=tensorflow.nn.relu))
model.add(tensorflow.keras.layers.Dense(10, activation=tensorflow.nn.softmax))

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", 
              metrics=["accuracy"])
with TIMER:
    model.fit(training_images, training_labels, epochs=10, verbose=2)
loss, accuracy = model.evaluate(testing_images, testing_labels, verbose=0)
print(f"Testing Loss: {loss:.2f} Testing Accuracy: {accuracy: .2f}")
WARNING: Logging before flag parsing goes to stderr.
W0703 11:50:56.498819 140182964418368 deprecation.py:506] From /home/brunhilde/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
2019-07-03 11:50:56,502 graeae.timers.timer start: Started: 2019-07-03 11:50:56.502607
I0703 11:50:56.502984 140182964418368 timer.py:70] Started: 2019-07-03 11:50:56.502607
Epoch 1/10
60000/60000 - 5s - loss: 0.4973 - acc: 0.8252
Epoch 2/10
60000/60000 - 5s - loss: 0.3742 - acc: 0.8656
Epoch 3/10
60000/60000 - 5s - loss: 0.3382 - acc: 0.8775
Epoch 4/10
60000/60000 - 5s - loss: 0.3146 - acc: 0.8839
Epoch 5/10
60000/60000 - 4s - loss: 0.2976 - acc: 0.8897
Epoch 6/10
60000/60000 - 4s - loss: 0.2818 - acc: 0.8963
Epoch 7/10
60000/60000 - 4s - loss: 0.2707 - acc: 0.9002
Epoch 8/10
60000/60000 - 5s - loss: 0.2597 - acc: 0.9039
Epoch 9/10
60000/60000 - 5s - loss: 0.2502 - acc: 0.9066
Epoch 10/10
60000/60000 - 5s - loss: 0.2409 - acc: 0.9094
2019-07-03 11:51:42,904 graeae.timers.timer end: Ended: 2019-07-03 11:51:42.904683
I0703 11:51:42.904865 140182964418368 timer.py:77] Ended: 2019-07-03 11:51:42.904683
2019-07-03 11:51:42,907 graeae.timers.timer end: Elapsed: 0:00:46.402076
I0703 11:51:42.907317 140182964418368 timer.py:78] Elapsed: 0:00:46.402076
Testing Loss: 0.36 Testing Accuracy:  0.87

A Convolutional Neural Network

The convolutional layer expects a single tensor instead of a feed of many of them so you need to reshape the input to make it work.

training_images = training_images.reshape(60000, 28, 28, 1)
testing_images = testing_images.reshape(10000, 28, 28, 1)

Our model starts with a Conv2D layer. The arguments we're using are:

  • filters: the dimensionality of the output space (the number of output filters in the convolution)
  • kernel_size: The height and width of the convolution window
  • activation: The activation function for the output
  • input_shape: If this is the first layer in the model you have to tell it what the input shape is

The output of the convolutional layers go to a MaxPool2D layer. The only argument we're passing in is pool_size, the factors by which to downsize the input. Using (2, 2) will reduce the size in half. After the convolutions and pooling are applied, the output is sent through a version of the fully-connected network that we were using before (see the baseline model above).

  • A Model Builder

    Something to make it a little easier to re-use things. Note that in the original notebook the first example has 64 filters in the CNN, but later it says that it's better to start with 32 (and the exercises expect that you used 32) so I'm using that as the default value.

    def get_stop(loss=0.02):
        class Stop(tensorflow.keras.callbacks.Callback):
            def on_epoch_end(self, epoch, logs={}):
                if (logs.get("loss") < loss):
                    print(f"Stopping point reached at epoch {epoch}")
                    self.model.stop_training = True
        stop = Stop()
        return stop
    
    class ModelBuilder:
        """Builds, trains, and tests our model
    
        Args:
         training_images: images to train on
         training_labels: labels for the training data
         testing_images: images to test the trained model with
         testing_labels: labels for the testing data
         additional_convolutions: convolutions besides the input convolution
         epochs: number of times to repeat training
         filters: number of filters in the output of the convolutional layers
         use_callback: use the Stop to end trainig
         callback_loss: loss to use for the callback
        """
        def __init__(self, training_images: numpy.ndarray=training_images,
                     training_labels: numpy.ndarray=training_labels,
                     testing_images: numpy.ndarray=testing_images,
                     testing_labels: numpy.ndarray=testing_labels,
                     additional_convolutions: int=1, 
                     epochs: int=10, 
                     filters: int=32,
                     use_callback: bool=False,
                     callback_loss: float=0) -> None:
            self.training_images = training_images
            self.training_labels = training_labels
            self.testing_images = testing_images
            self.testing_labels = testing_labels
    
            self.additional_convolutions = additional_convolutions
            self.epochs = epochs
            self.filters = filters
            self.use_callback = use_callback
            self.callback_loss = callback_loss
            self._model = None
            self._callback = None
            return
    
        @property
        def callback(self) -> Stop:
            """The callback to stop the training"""
            if self._callback is None:
                self._callback = get_stop(self.callback_loss)
            return self._callback
    
        @property
        def model(self) -> tensorflow.keras.models.Sequential:
            """Our CNN Model"""
            if self._model is None:
                self._model = tensorflow.keras.models.Sequential()
                self._model.add(tensorflow.keras.layers.Conv2D(
                    self.filters, (3, 3), 
                    activation="relu", 
                    input_shape=(28, 28, 1)))
                self._model.add(tensorflow.keras.layers.MaxPooling2D(2, 2))
    
                for convolution in range(self.additional_convolutions):
                    self._model.add(tensorflow.keras.layers.Conv2D(self.filters, (3, 3), 
                                                                   activation="relu"))
                    self._model.add(tensorflow.keras.layers.MaxPooling2D(2, 2))
                self._model.add(tensorflow.keras.layers.Flatten())
                self._model.add(tensorflow.keras.layers.Dense(128, activation="relu"))
                self._model.add(tensorflow.keras.layers.Dense(10, activation="softmax"))
                self._model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", 
                                    metrics=["accuracy"])
            return self._model
    
        def print_summary(self):
            """Print out the summary for the model"""
            print(self.model.summary())
            return
    
        def fit(self):
            """
           Fit the model to the training data
           """
            if self.use_callback:
                self.model.fit(self.training_images, self.training_labels, 
                               epochs=self.epochs, verbose=2, 
                               callbacks=[self.callback])
            else:
                self.model.fit(self.training_images, self.training_labels, 
                               epochs=self.epochs, verbose=2)
            return
    
        def test(self) -> tuple:
            """Check the loss and accuracy of the model against the testing set
    
           Returns:
            (loss, accuracy): the output of the evaluation of the testing data
           """
            return self.model.evaluate(self.testing_images, self.testing_labels, verbose=0)
    
        def __call__(self):
            """Builds and tests the model"""
            self.fit()
            loss, accuracy = self.test()
            print(f"Testing Loss: {loss:.2f}  Testing Accuracy: {accuracy:.2f}")
            return
    
    # model = create_model()
    builder = ModelBuilder(epochs=5)
    builder.print_summary()
    
    Model: "sequential_17"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_32 (Conv2D)           (None, 26, 26, 32)        320       
    _________________________________________________________________
    max_pooling2d_32 (MaxPooling (None, 13, 13, 32)        0         
    _________________________________________________________________
    conv2d_33 (Conv2D)           (None, 11, 11, 32)        9248      
    _________________________________________________________________
    max_pooling2d_33 (MaxPooling (None, 5, 5, 32)          0         
    _________________________________________________________________
    flatten_17 (Flatten)         (None, 800)               0         
    _________________________________________________________________
    dense_34 (Dense)             (None, 128)               102528    
    _________________________________________________________________
    dense_35 (Dense)             (None, 10)                1290      
    =================================================================
    Total params: 113,386
    Trainable params: 113,386
    Non-trainable params: 0
    _________________________________________________________________
    None
    

Layer By Layer

  • Our input is a set of 28 x 28 images.
  • Because we didn't pad the images, the convolutional layer "trims" off one row and column on each side (the center cell can't reach the outermost cells) so we get a 26 x 26 grid with 64 filters (which is what we set up in the definition).
  • The Max Pooling layer the halves the image so we have 13 x 13 grid with 64 filters
  • The next convolution layer once again trims off one row on each side so we have a 11 x 11 grid with 64 filters
  • Then the Max Pooling halves the grid once again so we have a 5 x 5 grid with 64 filters
  • The Flatten layer outputs a vector with 1,600 cells (5 x 5 x 64 = 1,600).
  • The first Dense layer has 128 neurons in it so that's the size of the output
  • And the final Dense layer converts it to 10 outputs to match the number of labels we have
builder()
Epoch 1/5
60000/60000 - 17s - loss: 0.4671 - acc: 0.8290
Epoch 2/5
60000/60000 - 17s - loss: 0.3149 - acc: 0.8844
Epoch 3/5
60000/60000 - 17s - loss: 0.2688 - acc: 0.9003
Epoch 4/5
60000/60000 - 17s - loss: 0.2414 - acc: 0.9112
Epoch 5/5
60000/60000 - 17s - loss: 0.2175 - acc: 0.9198
Testing Loss: 0.28  Testing Accuracy: 0.89

Using the Convolutional Neural Network we've gone from 88% to 91% accuracy.

10 Epochs

Using five epochs it appears that the loss is still going down while the accuracy is going up. What happens with ten epochs?

builder_10 = ModelBuilder(epochs=10)
builder_10()
Epoch 1/10
60000/60000 - 16s - loss: 0.4807 - acc: 0.8242
Epoch 2/10
60000/60000 - 16s - loss: 0.3233 - acc: 0.8825
Epoch 3/10
60000/60000 - 15s - loss: 0.2776 - acc: 0.8976
Epoch 4/10
60000/60000 - 16s - loss: 0.2474 - acc: 0.9082
Epoch 5/10
60000/60000 - 16s - loss: 0.2273 - acc: 0.9155
Epoch 6/10
60000/60000 - 16s - loss: 0.2030 - acc: 0.9240
Epoch 7/10
60000/60000 - 16s - loss: 0.1854 - acc: 0.9314
Epoch 8/10
60000/60000 - 16s - loss: 0.1693 - acc: 0.9361
Epoch 9/10
60000/60000 - 15s - loss: 0.1540 - acc: 0.9419
Epoch 10/10
60000/60000 - 16s - loss: 0.1419 - acc: 0.9467
Testing Loss: 0.26  Testing Accuracy: 0.91

It looks like it's still learning.

15 Epochs

builder_15 = ModelBuilder(epochs=15)
builder_15()
Epoch 1/15
60000/60000 - 16s - loss: 0.4754 - acc: 0.8260
Epoch 2/15
60000/60000 - 16s - loss: 0.3155 - acc: 0.8834
Epoch 3/15
60000/60000 - 16s - loss: 0.2725 - acc: 0.9001
Epoch 4/15
60000/60000 - 16s - loss: 0.2447 - acc: 0.9096
Epoch 5/15
60000/60000 - 16s - loss: 0.2199 - acc: 0.9180
Epoch 6/15
60000/60000 - 16s - loss: 0.1996 - acc: 0.9248
Epoch 7/15
60000/60000 - 16s - loss: 0.1813 - acc: 0.9316
Epoch 8/15
60000/60000 - 16s - loss: 0.1666 - acc: 0.9372
Epoch 9/15
60000/60000 - 16s - loss: 0.1525 - acc: 0.9430
Epoch 10/15
60000/60000 - 15s - loss: 0.1374 - acc: 0.9484
Epoch 11/15
60000/60000 - 16s - loss: 0.1257 - acc: 0.9527
Epoch 12/15
60000/60000 - 15s - loss: 0.1135 - acc: 0.9569
Epoch 13/15
60000/60000 - 16s - loss: 0.1025 - acc: 0.9615
Epoch 14/15
60000/60000 - 15s - loss: 0.0937 - acc: 0.9647
Epoch 15/15
60000/60000 - 16s - loss: 0.0849 - acc: 0.9682
Testing Loss: 0.34  Testing Accuracy: 0.91

It looks like it's started to overfit, the accuracy is okay, but the loss is a little worse.

20 Epochs

builder = ModelBuilder(epochs=20)
builder()
Epoch 1/20
60000/60000 - 16s - loss: 0.4759 - acc: 0.8264
Epoch 2/20
60000/60000 - 16s - loss: 0.3218 - acc: 0.8822
Epoch 3/20
60000/60000 - 16s - loss: 0.2767 - acc: 0.8982
Epoch 4/20
60000/60000 - 16s - loss: 0.2469 - acc: 0.9083
Epoch 5/20
60000/60000 - 16s - loss: 0.2218 - acc: 0.9177
Epoch 6/20
60000/60000 - 16s - loss: 0.2015 - acc: 0.9244
Epoch 7/20
60000/60000 - 16s - loss: 0.1848 - acc: 0.9309
Epoch 8/20
60000/60000 - 15s - loss: 0.1698 - acc: 0.9361
Epoch 9/20
60000/60000 - 14s - loss: 0.1525 - acc: 0.9424
Epoch 10/20
60000/60000 - 15s - loss: 0.1435 - acc: 0.9457
Epoch 11/20
60000/60000 - 16s - loss: 0.1306 - acc: 0.9504
Epoch 12/20
60000/60000 - 15s - loss: 0.1172 - acc: 0.9556
Epoch 13/20
60000/60000 - 15s - loss: 0.1079 - acc: 0.9594
Epoch 14/20
60000/60000 - 15s - loss: 0.0993 - acc: 0.9626
Epoch 15/20
60000/60000 - 15s - loss: 0.0900 - acc: 0.9658
Epoch 16/20
60000/60000 - 15s - loss: 0.0829 - acc: 0.9686
Epoch 17/20
60000/60000 - 15s - loss: 0.0746 - acc: 0.9720
Epoch 18/20
60000/60000 - 16s - loss: 0.0713 - acc: 0.9736
Epoch 19/20
60000/60000 - 15s - loss: 0.0638 - acc: 0.9760
Epoch 20/20
60000/60000 - 15s - loss: 0.0594 - acc: 0.9781
Testing Loss: 0.45  Testing Accuracy: 0.91

It looks like it might be overfitting - both the loss and the accuracy went down a little.

Visualizing the Convolutions and Pooling

print(testing_labels[:100])
[9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 4 8 0 2 5 7 9 1 4 6 0 9 3 8 8 3 3 8 0 7
 5 7 9 6 1 3 7 6 7 2 1 2 2 4 4 5 8 2 2 8 4 8 0 7 7 8 5 1 1 2 3 9 8 7 0 2 6
 2 3 1 2 8 4 1 8 5 9 5 0 3 2 0 6 5 3 6 7 1 8 0 1 4 2]
model = builder_10.model
figure, axis_array = pyplot.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
CONVOLUTION_NUMBER = 1

layer_outputs = [layer.output for layer in model.layers]

activation_model = tensorflow.keras.models.Model(inputs = model.input, outputs = layer_outputs)

for x in range(0,4):
  f1 = activation_model.predict(testing_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axis_array[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axis_array[0,x].grid(False)
  f2 = activation_model.predict(testing_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axis_array[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axis_array[1,x].grid(False)
  f3 = activation_model.predict(testing_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axis_array[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axis_array[2,x].grid(False)

layer_visualization.png

Exercises

1. Try editing the convolutions. Change the 32s to either 16 or 64. What impact will this have on accuracy and/or training time.

  • 16 Nodes
    builder = ModelBuilder(filters=16)
    with TIMER:
        builder()
    
    2019-07-03 12:06:27,700 graeae.timers.timer start: Started: 2019-07-03 12:06:27.700578
    I0703 12:06:27.700625 140182964418368 timer.py:70] Started: 2019-07-03 12:06:27.700578
    Epoch 1/10
    60000/60000 - 17s - loss: 0.5169 - acc: 0.8100
    Epoch 2/10
    60000/60000 - 17s - loss: 0.3536 - acc: 0.8714
    Epoch 3/10
    60000/60000 - 17s - loss: 0.3075 - acc: 0.8873
    Epoch 4/10
    60000/60000 - 17s - loss: 0.2808 - acc: 0.8959
    Epoch 5/10
    60000/60000 - 16s - loss: 0.2590 - acc: 0.9027
    Epoch 6/10
    60000/60000 - 17s - loss: 0.2419 - acc: 0.9100
    Epoch 7/10
    60000/60000 - 17s - loss: 0.2276 - acc: 0.9156
    Epoch 8/10
    60000/60000 - 17s - loss: 0.2140 - acc: 0.9182
    Epoch 9/10
    60000/60000 - 17s - loss: 0.2030 - acc: 0.9233
    Epoch 10/10
    60000/60000 - 17s - loss: 0.1934 - acc: 0.9266
    2019-07-03 12:09:18,226 graeae.timers.timer end: Ended: 2019-07-03 12:09:18.226577
    I0703 12:09:18.226756 140182964418368 timer.py:77] Ended: 2019-07-03 12:09:18.226577
    2019-07-03 12:09:18,229 graeae.timers.timer end: Elapsed: 0:02:50.525999
    I0703 12:09:18.229464 140182964418368 timer.py:78] Elapsed: 0:02:50.525999
    Testing Loss: 0.29  Testing Accuracy: 0.90
    

    The smaller model had slightly more loss than the 32 node model as well as a little less accuracy.

  • 64 Nodes
    builder = ModelBuilder(filters=64)
    with TIMER:
        builder()
    
    2019-07-03 12:09:19,711 graeae.timers.timer start: Started: 2019-07-03 12:09:19.711082
    I0703 12:09:19.711113 140182964418368 timer.py:70] Started: 2019-07-03 12:09:19.711082
    Epoch 1/10
    60000/60000 - 19s - loss: 0.4367 - acc: 0.8428
    Epoch 2/10
    60000/60000 - 18s - loss: 0.2923 - acc: 0.8929
    Epoch 3/10
    60000/60000 - 18s - loss: 0.2472 - acc: 0.9087
    Epoch 4/10
    60000/60000 - 18s - loss: 0.2156 - acc: 0.9205
    Epoch 5/10
    60000/60000 - 18s - loss: 0.1893 - acc: 0.9298
    Epoch 6/10
    60000/60000 - 18s - loss: 0.1665 - acc: 0.9380
    Epoch 7/10
    60000/60000 - 18s - loss: 0.1460 - acc: 0.9456
    Epoch 8/10
    60000/60000 - 18s - loss: 0.1285 - acc: 0.9500
    Epoch 9/10
    60000/60000 - 18s - loss: 0.1142 - acc: 0.9568
    Epoch 10/10
    60000/60000 - 18s - loss: 0.0972 - acc: 0.9621
    2019-07-03 12:12:23,275 graeae.timers.timer end: Ended: 2019-07-03 12:12:23.274851
    I0703 12:12:23.275002 140182964418368 timer.py:77] Ended: 2019-07-03 12:12:23.274851
    2019-07-03 12:12:23,277 graeae.timers.timer end: Elapsed: 0:03:03.563769
    I0703 12:12:23.277686 140182964418368 timer.py:78] Elapsed: 0:03:03.563769
    Testing Loss: 0.32  Testing Accuracy: 0.91
    

    This has the same accuracy as the 32 node model but with a slight increase in the loss.

2. Remove the final Convolution. What impact will this have on accuracy or training time?

builder = ModelBuilder(additional_convolutions=0)
with TIMER:
    builder()
2019-07-03 12:12:24,795 graeae.timers.timer start: Started: 2019-07-03 12:12:24.795249
I0703 12:12:24.795282 140182964418368 timer.py:70] Started: 2019-07-03 12:12:24.795249
Epoch 1/10
60000/60000 - 14s - loss: 0.3897 - acc: 0.8607
Epoch 2/10
60000/60000 - 14s - loss: 0.2642 - acc: 0.9042
Epoch 3/10
60000/60000 - 14s - loss: 0.2218 - acc: 0.9187
Epoch 4/10
60000/60000 - 14s - loss: 0.1883 - acc: 0.9306
Epoch 5/10
60000/60000 - 14s - loss: 0.1619 - acc: 0.9391
Epoch 6/10
60000/60000 - 14s - loss: 0.1387 - acc: 0.9482
Epoch 7/10
60000/60000 - 14s - loss: 0.1171 - acc: 0.9564
Epoch 8/10
60000/60000 - 14s - loss: 0.1000 - acc: 0.9629
Epoch 9/10
60000/60000 - 14s - loss: 0.0831 - acc: 0.9702
Epoch 10/10
60000/60000 - 14s - loss: 0.0728 - acc: 0.9729
2019-07-03 12:14:46,396 graeae.timers.timer end: Ended: 2019-07-03 12:14:46.396417
I0703 12:14:46.396641 140182964418368 timer.py:77] Ended: 2019-07-03 12:14:46.396417
2019-07-03 12:14:46,400 graeae.timers.timer end: Elapsed: 0:02:21.601168
I0703 12:14:46.400143 140182964418368 timer.py:78] Elapsed: 0:02:21.601168
Testing Loss: 0.31  Testing Accuracy: 0.92

Once again the accuracy is a little better than the 32 node model but the testing loss is also a little higher. We probably need more data.

3. How about adding more Convolutions? What impact do you think this will have? Experiment with it.

"results output"body
# Out[21]:

4. In the previous lesson you implemented a callback to check on the loss function and to cancel training once it hit a certain amount. See if you can implement that here!

builder = ModelBuilder(use_callback=True, epochs=100, callback_loss=0.19)
with TIMER:
    builder()
2019-07-03 15:20:50,279 graeae.timers.timer start: Started: 2019-07-03 15:20:50.279833
I0703 15:20:50.279866 140182964418368 timer.py:70] Started: 2019-07-03 15:20:50.279833
Epoch 1/100
60000/60000 - 17s - loss: 0.4773 - acc: 0.8277
Epoch 2/100
60000/60000 - 17s - loss: 0.3204 - acc: 0.8840
Epoch 3/100
60000/60000 - 17s - loss: 0.2777 - acc: 0.8986
Epoch 4/100
60000/60000 - 17s - loss: 0.2463 - acc: 0.9089
Epoch 5/100
60000/60000 - 17s - loss: 0.2220 - acc: 0.9179
Epoch 6/100
60000/60000 - 17s - loss: 0.2029 - acc: 0.9250
Epoch 7/100
Stopping point reached at epoch 6
60000/60000 - 17s - loss: 0.1827 - acc: 0.9314
2019-07-03 15:22:51,538 graeae.timers.timer end: Ended: 2019-07-03 15:22:51.537895
I0703 15:22:51.538049 140182964418368 timer.py:77] Ended: 2019-07-03 15:22:51.537895
2019-07-03 15:22:51,540 graeae.timers.timer end: Elapsed: 0:02:01.258062
I0703 15:22:51.540425 140182964418368 timer.py:78] Elapsed: 0:02:01.258062
Testing Loss: 0.25  Testing Accuracy: 0.91

This does about the same as the 10 epoch version, so we didn't save much, but it gives us a way to stop without guessing the number of epochs.

End

Source

Handwriting Recognition Exercise

Beginning

The goal of this exercise is to train a classifier on the MNIST dataset that reaches 99% during training without using a fixed number of training epochs.

Imports

Python

from argparse import Namespace
from functools import partial
import random

From PyPi

import holoviews
import tensorflow

My Stuff

from graeae.visualization.embed import EmbedHoloview

The Plotting

embed = partial(
    EmbedHoloview, 
    folder_path="../../files/posts/keras/handwriting-recognition-exercise/")
Plot = Namespace(
    size=600,
)
holoviews.extension("bokeh")

The Dataset

(training_images, training_labels), (testing_images, testing_labels) = (
    tensorflow.keras.datasets.mnist.load_data())

Middle

The Dataset

What do we have here?

rows, x, y = training_images.shape
print(f"Training Images: {rows:,} ({x} x {y})")
Training Images: 60,000 (28 x 28)

The Fashion MNIST dataset that I looked at previously was meant to be a drop-in replacement for this data set so it has the same number of images and the images are the same size.

index = random.randrange(len(training_images))
image = training_images[index]
plot = holoviews.Image(
    image,
).opts(
    tools=["hover"],
    title=f"MNIST Handwritten {training_labels[index]}",
    width=Plot.size,
    height=Plot.size,
    )
embed(plot=plot, file_name="sample_image")()

Figure Missing

The dataset is a set of hand-written digits (one each image) that we want to be able to classify.

print(training_images.min())
print(training_images.max())
0
255

The images are 28 x 28 matrices of values from 0 (representing black) to 255 (representing white).

Normalizing the Data

We want the values to be from 0 to 1 so I'm going to normalize them.

training_images_normalized = training_images/255
testing_images_normalized = testing_images/255
print(training_images_normalized.max())
print(training_images_normalized.min())
1.0
0.0

The Model

This is going to be a model with one hidden layer.

def build_model(units: int=128):
    """Build a sequential model with one hidden layer

    Args:
     units: number of units in the hidden layer
    """
    model = tensorflow.keras.models.Sequential()

    # flatten the image
    model.add(tensorflow.keras.layers.Flatten())

    # the hidden layer
    model.add(tensorflow.keras.layers.Dense(units=units, 
                                            activation=tensorflow.nn.relu))
    model.add(tensorflow.keras.layers.Dense(units=10,
                                            activation=tensorflow.nn.softmax))
    return model

The Callback

To make the training end at 99% accuracy I'll add a callback.

class Stop(tensorflow.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        print(logs)
        if ("acc" in logs) and  (logs.get("acc") >= 0.99):
            print(f"Stopping point reached at epoch {epoch}")
            print(f"Model Accuracy: {logs.get('accuracy')}")
            self.model.stop_training = True
def train(units=128):
    """Build and trains the model

    Args:
     units: number of neurons in the hidden layer
    """
    callbacks = Stop()
    model = build_model(units)
    model.compile(
        optimizer = "adam",
        loss = "sparse_categorical_crossentropy",
        metrics=["accuracy"]
    )
    model.fit(training_images_normalized, training_labels,
              epochs=100, callbacks=[callbacks], verbose=2)
    return model
def test(model, outcome_key):
    """tests the model"""
    loss, accuracy = model.evaluate(testing_images, testing_labels, verbose=0)
    outcomes[outcome_key] = (loss, accuracy)
    print(f"Testing: Loss={loss}, Accuracy: {accuracy}")

    print("\nTesting A Prediction")
    classifications = model.predict(testing_images)
    index = random.randrange(len(classifications))
    selected = classifications[index]
    print(selected)

    print(f"expected label: {testing_labels[index]}")
    print(f"actual label: {selected.argmax()}")
    return

Trying Some Models

128 Nodes

model = train()
outcomes = {}
test(model, "128 Nodes")
Epoch 1/100
{'loss': 0.2586968289529284, 'acc': 0.92588335}
60000/60000 - 2s - loss: 0.2587 - acc: 0.9259
Epoch 2/100
{'loss': 0.11452680859503647, 'acc': 0.9655833}
60000/60000 - 2s - loss: 0.1145 - acc: 0.9656
Epoch 3/100
{'loss': 0.0795439642144988, 'acc': 0.97606665}
60000/60000 - 2s - loss: 0.0795 - acc: 0.9761
Epoch 4/100
{'loss': 0.05808031236998116, 'acc': 0.9816667}
60000/60000 - 2s - loss: 0.0581 - acc: 0.9817
Epoch 5/100
{'loss': 0.04466566459426346, 'acc': 0.98588336}
60000/60000 - 2s - loss: 0.0447 - acc: 0.9859
Epoch 6/100
{'loss': 0.03590909656824855, 'acc': 0.9885333}
60000/60000 - 2s - loss: 0.0359 - acc: 0.9885
Epoch 7/100
{'loss': 0.02741284582785641, 'acc': 0.9912}
Stopping point reached at epoch 6
Model Accuracy: None
60000/60000 - 2s - loss: 0.0274 - acc: 0.9912
Testing: Loss=15.376291691160201, Accuracy: 0.9764000177383423

Testing A Prediction
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
expected label: 0
actual label: 0

Well, here we can see why the Fashion MNIST data set was created, even with this simple network we were able to reach our goal in 7 epochs. Even the testing accuracy and loss was pretty good.

End

Source

Beyond Hello

Beginning

This is going to use keras (and tensorflow) to learn to categorize images in the Fashion MNIST dataset.

Imports

Python

from argparse import Namespace
from functools import partial

import random

PyPi

from tabulate import tabulate
import holoviews
import pandas
import tensorflow

My Stuff

from graeae.visualization.embed import EmbedHoloview
from graeae.timers import Timer

The Timer

TIMER = Timer()

The Plotting

embed = partial(EmbedHoloview, folder_path="../../files/posts/keras/beyond-hello/")
Plot = Namespace(
    size=600,
    height=1000,
    width=800,
)
holoviews.extension("bokeh")

The Data Set

Keras includes the fashion mnist dataset and can be retrieved using the datasets.fashion_mnist property.

(training_images, training_labels), (testing_images, testing_labels) = tensorflow.keras.datasets.fashion_mnist.load_data()

Unfortunately the function doesn't let you pass in the path to where you're going to store the files (it's stored in ~/.keras/datasets/fashion-mnist/).

Middle

Looking At The dataset

The Labels

There are 10 categories of images encoded as integers in the label sets. The keras site lists them as these:

Label Description
0 T-Shirt/Top
1 Trouser
2 Pullover
3 Dress
4 Coat
5 Sandal
6 Shirt
7 Sneaker
8 Bag
9 Ankle Boot

To make it easier to interpret later on I'll make a secret decoder ring.

labels = {
    0: "T-Shirt/Top",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7 : "Sneaker",
    8: "Bag",
    9 : "Ankle Boot"
    }

The Number Of Images

print(type(training_images))
rows, width, height = training_images.shape
print(f"rows: {rows:,} image: {width} x {height}")
rows, width, height = testing_images.shape
print(f"rows: {rows:,} image: {width} x {height}")
<class 'numpy.ndarray'>
rows: 60,000 image: 28 x 28
rows: 10,000 image: 28 x 28

We have 60,000 grayscale 28 by 28 pixel images to use for training (it would be 28 x 28 x 3 if the images were RGB) and 10,000 grayscale 28 by 28 pixel images to use for testing.

A Sample Image

index = random.randrange(len(training_images))
image = training_images[index]
plot = holoviews.Image(
    image,
).opts(
    tools=["hover"],
    title=f"Label {training_labels[index]} ({labels[training_labels[index]]})",
    width=Plot.size,
    height=Plot.size,
    )
embed(plot=plot, file_name="sample_image")()

Figure Missing

Although it looks like it's a color image that's because holoviews adds artificial coloring to it. If you hover over the images the x and y values are the pixel coordinates and the z values are the grayscale values (so if you hover over black it should be 0, and if you hover over a white pixel it should be 255).

Normalizing The Data

Since the pixel values are from 0 (black) to 255 (white) we need to normalize them to values from 0 to 1 to work with a neural network.

print(f"minimum value: {training_images.min()} maximum value: {training_images.max()}")
training_images_normalized = training_images / 255.0
testing_images_normalized = testing_images / 255.0
print(f"minimum value: {training_images_normalized.min()} maximum value: {training_images_normalized.max()}")
minimum value: 0 maximum value: 255
minimum value: 0.0 maximum value: 1.0

The Example

This is a worked example given in the original notebook.

Define The Model

Once again the network will be a Sequential one - a linear stack of layers, and there will be three layers, a Flatten layer to flatten our image into a vector with 784 cells (instead of a 28 x 28 matrix), followed by two dense, or fully-connected, layers.

Each of the dense layers will get an activation function. The first dense layer (the hidden layer) gets a ReLU (Rectified Linear Unit) function which makes it non-linear by returning the input only if it is greater than 0, otherwise it returns 0 (so it filters out negative numbers), and the second dense layer gets a softmax function to identify the biggest value (and thus our most likely label for the input).

 model = tensorflow.keras.models.Sequential()
 model.add(tensorflow.keras.layers.Flatten())
 model.add(tensorflow.keras.layers.Dense(128, activation=tensorflow.nn.relu))
 model.add(tensorflow.keras.layers.Dense(10, activation=tensorflow.nn.softmax))

There are 10 labels to predict so the last layer has 10 neurons.

Compile The Model

This time we're going to compile the model using the adam optimizer. confusingly, there's two of them in tensorflow, the "regular" one, and a keras version. we'll use the non-keras version. The loss, however, is the keras version as is the accuracy, which is just the number correct divided by the total count.

 model.compile(optimizer = "adam",
               loss = 'sparse_categorical_crossentropy',
               metrics=['accuracy'])

And now we fit it.

 model.fit(training_images_normalized, training_labels, epochs=5, verbose=2)
Epoch 1/5
60000/60000 - 2s - loss: 0.5015 - acc: 0.8242
Epoch 2/5
60000/60000 - 2s - loss: 0.3796 - acc: 0.8635
Epoch 3/5
60000/60000 - 2s - loss: 0.3420 - acc: 0.8754
Epoch 4/5
60000/60000 - 2s - loss: 0.3176 - acc: 0.8830
Epoch 5/5
60000/60000 - 2s - loss: 0.2975 - acc: 0.8908

At the end of training the model is about 89% accurate.

Check The Model Against The Test-Data

The sequential model's evaluate method will let us test it against the test set.

 loss, accuracy = model.evaluate(testing_images, 
                                 testing_labels, 
                                 verbose=0)
 outcomes = {128: (loss, accuracy)}
 print(f"loss: {loss:.2f} accuracy: {accuracy:.2f}")
loss: 53.34 accuracy: 0.86

It had an accuracy of about 85%.

Exercises

Exercise 1

What does the output of the next code-block mean?

classifications = model.predict(testing_images)
print(classifications[0])
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

Since we used the softmax method, the output is a vector representing the 10 labels, with a 1 where the predicted label is (so in this case it predicts 9).

image = testing_images[index]
plot = holoviews.Image(
    image,
).opts(
    tools=["hover"],
    title=f"Label {testing_labels[index]} ({labels[testing_labels[index]]})",
    height=Plot.size,
    width=Plot.size,
    )
embed(plot=plot, file_name="exercise_1_image")()

Figure Missing

print(f"Expected Label: {testing_labels[0]}, {labels[testing_labels[0]]}")
print(f"Actual Label: {classifications[0].argmax()}, {labels[classifications[0].argmax()]}")
Expected Label: 9, Ankle Boot
Actual Label: 9, Ankle Boot

So our model predicts that the first image is an ankle boot, which is correct.

Exercise 2

Experiment with different values for the number of units in the dense layer.

def create_and_test_model(units: int, epochs: int=5):
    """creates, trains and tests the model

    args:
     units: number of units for the dense layer
     epochs: number of times to train the model
    """
    print(f"building a model with {units} units in the dense layer")
    model = tensorflow.keras.models.Sequential()
    # add the matrix -> vector layer
    model.add(tensorflow.keras.layers.Flatten())

    # add the layer that does the work
    model.add(tensorflow.keras.layers.Dense(units=units,
                                            activation=tensorflow.nn.relu))
    model.add(tensorflow.keras.layers.Dense(10, 
                                            activation=tensorflow.nn.softmax))

    model.compile(optimizer = "adam",
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])
    TIMER.message = "finished training the model"
    with TIMER:
        model.fit(training_images_normalized, training_labels, 
                  epochs=epochs, verbose=2)
    print()
    loss, accuracy = model.evaluate(testing_images, testing_labels, verbose=0)
    print(f"testing: loss={loss}, accuracy={100 * accuracy}%")
    classifications = model.predict(testing_images)
    index = random.randrange(len(classifications))
    selected = classifications[index]
    print(selected)

    print(f"expected label: {testing_labels[index]}, "
          f"{labels[testing_labels[index]]}")
    print(f"actual label: {selected.argmax()}, {labels[selected.argmax()]}")
    return loss, accuracy
  • 512 Neurons
    units = 512
    loss, accuracy = create_and_test_model(units)
    outcomes[units] = (loss, accuracy)
    
    2019-06-30 11:40:58,135 graeae.timers.timer start: Started: 2019-06-30 11:40:58.135283
    I0630 11:40:58.135326 140129240835904 timer.py:70] Started: 2019-06-30 11:40:58.135283
    building a model with 512 units in the dense layer
    Epoch 1/5
    60000/60000 - 2s - loss: 0.4738 - acc: 0.8316
    Epoch 2/5
    60000/60000 - 2s - loss: 0.3585 - acc: 0.8680
    Epoch 3/5
    60000/60000 - 2s - loss: 0.3218 - acc: 0.8819
    Epoch 4/5
    60000/60000 - 2s - loss: 0.2971 - acc: 0.8904
    Epoch 5/5
    60000/60000 - 2s - loss: 0.2808 - acc: 0.8963
    2019-06-30 11:41:09,089 graeae.timers.timer end: Ended: 2019-06-30 11:41:09.089237
    I0630 11:41:09.089263 140129240835904 timer.py:77] Ended: 2019-06-30 11:41:09.089237
    2019-06-30 11:41:09,089 graeae.timers.timer end: Elapsed: 0:00:10.953954
    I0630 11:41:09.089937 140129240835904 timer.py:78] Elapsed: 0:00:10.953954
    
    testing: loss=65.45295433635712, accuracy=84.96999740600586%
    [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
    expected label: 8, Bag
    actual label: 8, Bag
    

    The model with the 512 neuron layer has less loss and better accuracy when compared to the original model with a 128 neuron layer.

  • 1020 Neurons
    units = 1024
    loss, accuracy = create_and_test_model(units)
    outcomes[units] = (loss, accuracy)
    
    2019-06-30 11:41:11,857 graeae.timers.timer start: Started: 2019-06-30 11:41:11.857953
    I0630 11:41:11.857974 140129240835904 timer.py:70] Started: 2019-06-30 11:41:11.857953
    building a model with 1024 units in the dense layer
    Epoch 1/5
    60000/60000 - 3s - loss: 0.4707 - acc: 0.8323
    Epoch 2/5
    60000/60000 - 3s - loss: 0.3588 - acc: 0.8696
    Epoch 3/5
    60000/60000 - 2s - loss: 0.3229 - acc: 0.8815
    Epoch 4/5
    60000/60000 - 3s - loss: 0.2973 - acc: 0.8891
    Epoch 5/5
    60000/60000 - 2s - loss: 0.2786 - acc: 0.8957
    2019-06-30 11:41:25,030 graeae.timers.timer end: Ended: 2019-06-30 11:41:25.030862
    I0630 11:41:25.030889 140129240835904 timer.py:77] Ended: 2019-06-30 11:41:25.030862
    2019-06-30 11:41:25,031 graeae.timers.timer end: Elapsed: 0:00:13.172909
    I0630 11:41:25.031725 140129240835904 timer.py:78] Elapsed: 0:00:13.172909
    
    testing: loss=54.632147045129535, accuracy=86.79999709129333%
    [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
    expected label: 9, Ankle Boot
    actual label: 7, Sneaker
    

    The model did slightly better than the original 128 unit model, probably because fewer nodes don't give it enough "knobs" to tune to make an accurate match. Oddly it didn't do as well as the 512 unit model, perhaps because with that many neurons we need more data (or more epochs?). On this run it got the prediction for the single case wrong, although it doesn't usually (it should happen around 13 % of the time if the accuracy holds up).

    units = 1024
    loss, accuracy = create_and_test_model(units, epochs=10)
    outcomes[units] = (loss, accuracy)
    
    2019-06-30 11:41:27,717 graeae.timers.timer start: Started: 2019-06-30 11:41:27.717040
    I0630 11:41:27.717062 140129240835904 timer.py:70] Started: 2019-06-30 11:41:27.717040
    building a model with 1024 units in the dense layer
    Epoch 1/10
    60000/60000 - 3s - loss: 0.4665 - acc: 0.8330
    Epoch 2/10
    60000/60000 - 3s - loss: 0.3593 - acc: 0.8675
    Epoch 3/10
    60000/60000 - 3s - loss: 0.3181 - acc: 0.8830
    Epoch 4/10
    60000/60000 - 3s - loss: 0.2964 - acc: 0.8899
    Epoch 5/10
    60000/60000 - 3s - loss: 0.2763 - acc: 0.8965
    Epoch 6/10
    60000/60000 - 3s - loss: 0.2621 - acc: 0.9021
    Epoch 7/10
    60000/60000 - 2s - loss: 0.2496 - acc: 0.9052
    Epoch 8/10
    60000/60000 - 3s - loss: 0.2384 - acc: 0.9109
    Epoch 9/10
    60000/60000 - 2s - loss: 0.2279 - acc: 0.9149
    Epoch 10/10
    60000/60000 - 2s - loss: 0.2209 - acc: 0.9165
    2019-06-30 11:41:54,160 graeae.timers.timer end: Ended: 2019-06-30 11:41:54.160517
    I0630 11:41:54.160544 140129240835904 timer.py:77] Ended: 2019-06-30 11:41:54.160517
    2019-06-30 11:41:54,161 graeae.timers.timer end: Elapsed: 0:00:26.443477
    I0630 11:41:54.161170 140129240835904 timer.py:78] Elapsed: 0:00:26.443477
    
    testing: loss=64.08433327770233, accuracy=86.41999959945679%
    [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
    expected label: 0, T-Shirt/Top
    actual label: 0, T-Shirt/Top
    

    It seems to be overfitting the data, it looks like we'd need more data for this many nodes. According to the original notebook, this should be more accurate, but that's not true of the test-set. Maybe they meant in comparison to the original 128 unit network, not the 512 unit network.

    print("|Units | Loss | Accuracy|")
    print("|-+-+-|")
    for units, (loss, accuracy) in outcomes.items():
        print(f"|{units}| {loss:.2f}| {accuracy: .2f}|")
    
    Units Loss Accuracy
    128 53.34 0.86
    512 65.45 0.85
    1024 64.08 0.86

Exercise: Another Layer

What happens if you add another layer between the 512 unit layer and the output?

print("Adding an extra layer with 256 units")
model = tensorflow.keras.models.Sequential()

model.add(tensorflow.keras.layers.Flatten())

model.add(tensorflow.keras.layers.Dense(units=512,
                                        activation=tensorflow.nn.relu))
model.add(tensorflow.keras.layers.Dense(units=256,
                                        activation=tensorflow.nn.relu))
model.add(tensorflow.keras.layers.Dense(10, activation=tensorflow.nn.softmax))

model.compile(optimizer = tensorflow.train.AdamOptimizer(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(training_images_normalized, training_labels, epochs=5, verbose=2)
print()
loss, accuracy = model.evaluate(testing_images, testing_labels, verbose=0)
print(f"Testing: loss={loss}, accuracy={100 * accuracy}%")
classifications = model.predict(testing_images)
print(classifications[0])

print(f"Expected Label: {testing_labels[0]}, {labels[testing_labels[0]]}")
print(f"Actual Label: {classifications.argmax()}, {labels[classifications.argmax()]}")
Adding an extra layer with 256 units
Epoch 1/5
60000/60000 - 3s - loss: 0.4672 - acc: 0.8305
Epoch 2/5
60000/60000 - 3s - loss: 0.3549 - acc: 0.8695
Epoch 3/5
60000/60000 - 4s - loss: 0.3202 - acc: 0.8819
Epoch 4/5
60000/60000 - 4s - loss: 0.2975 - acc: 0.8904
Epoch 5/5
60000/60000 - 4s - loss: 0.2787 - acc: 0.8960

Testing: loss=46.68517806854248, accuracy=87.18000054359436%
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
Expected Label: 9, Ankle Boot
Actual Label: 9, Ankle Boot

The testing accuracy was slightly lower (pretty much the same) but it improved the loss.

Exercise: More Epochs

What happens if you train for 15 or 30 epochs?

  • 15 Epochs
    create_and_test_model(512, 15)
    
    2019-06-30 11:42:17,312 graeae.timers.timer start: Started: 2019-06-30 11:42:17.312462
    I0630 11:42:17.312490 140129240835904 timer.py:70] Started: 2019-06-30 11:42:17.312462
    building a model with 512 units in the dense layer
    Epoch 1/15
    60000/60000 - 4s - loss: 0.4746 - acc: 0.8299
    Epoch 2/15
    60000/60000 - 3s - loss: 0.3558 - acc: 0.8697
    Epoch 3/15
    60000/60000 - 2s - loss: 0.3230 - acc: 0.8804
    Epoch 4/15
    60000/60000 - 2s - loss: 0.2969 - acc: 0.8892
    Epoch 5/15
    60000/60000 - 2s - loss: 0.2804 - acc: 0.8954
    Epoch 6/15
    60000/60000 - 2s - loss: 0.2644 - acc: 0.9022
    Epoch 7/15
    60000/60000 - 2s - loss: 0.2526 - acc: 0.9058
    Epoch 8/15
    60000/60000 - 2s - loss: 0.2427 - acc: 0.9093
    Epoch 9/15
    60000/60000 - 2s - loss: 0.2331 - acc: 0.9122
    Epoch 10/15
    60000/60000 - 2s - loss: 0.2217 - acc: 0.9166
    Epoch 11/15
    60000/60000 - 2s - loss: 0.2136 - acc: 0.9191
    Epoch 12/15
    60000/60000 - 2s - loss: 0.2046 - acc: 0.9232
    Epoch 13/15
    60000/60000 - 2s - loss: 0.1997 - acc: 0.9250
    Epoch 14/15
    60000/60000 - 2s - loss: 0.1919 - acc: 0.9279
    Epoch 15/15
    60000/60000 - 2s - loss: 0.1863 - acc: 0.9294
    2019-06-30 11:42:54,542 graeae.timers.timer end: Ended: 2019-06-30 11:42:54.542345
    I0630 11:42:54.542373 140129240835904 timer.py:77] Ended: 2019-06-30 11:42:54.542345
    2019-06-30 11:42:54,543 graeae.timers.timer end: Elapsed: 0:00:37.229883
    I0630 11:42:54.543807 140129240835904 timer.py:78] Elapsed: 0:00:37.229883
    
    testing: loss=59.34430006275177, accuracy=87.44999766349792%
    [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
    expected label: 3, Dress
    actual label: 3, Dress
    

    The accuracy went up slightly, but the loss went up even more.

  • 30 Epochs
    create_and_test_model(512, 30)
    
    2019-06-30 11:42:57,431 graeae.timers.timer start: Started: 2019-06-30 11:42:57.431973
    I0630 11:42:57.431994 140129240835904 timer.py:70] Started: 2019-06-30 11:42:57.431973
    building a model with 512 units in the dense layer
    Epoch 1/30
    60000/60000 - 2s - loss: 0.4750 - acc: 0.8312
    Epoch 2/30
    60000/60000 - 2s - loss: 0.3623 - acc: 0.8686
    Epoch 3/30
    60000/60000 - 2s - loss: 0.3226 - acc: 0.8818
    Epoch 4/30
    60000/60000 - 3s - loss: 0.2990 - acc: 0.8901
    Epoch 5/30
    60000/60000 - 2s - loss: 0.2814 - acc: 0.8961
    Epoch 6/30
    60000/60000 - 2s - loss: 0.2644 - acc: 0.9017
    Epoch 7/30
    60000/60000 - 2s - loss: 0.2529 - acc: 0.9061
    Epoch 8/30
    60000/60000 - 2s - loss: 0.2433 - acc: 0.9089
    Epoch 9/30
    60000/60000 - 2s - loss: 0.2305 - acc: 0.9124
    Epoch 10/30
    60000/60000 - 2s - loss: 0.2211 - acc: 0.9164
    Epoch 11/30
    60000/60000 - 2s - loss: 0.2133 - acc: 0.9186
    Epoch 12/30
    60000/60000 - 2s - loss: 0.2065 - acc: 0.9222
    Epoch 13/30
    60000/60000 - 2s - loss: 0.1998 - acc: 0.9243
    Epoch 14/30
    60000/60000 - 2s - loss: 0.1905 - acc: 0.9284
    Epoch 15/30
    60000/60000 - 2s - loss: 0.1828 - acc: 0.9307
    Epoch 16/30
    60000/60000 - 2s - loss: 0.1782 - acc: 0.9322
    Epoch 17/30
    60000/60000 - 2s - loss: 0.1714 - acc: 0.9348
    Epoch 18/30
    60000/60000 - 2s - loss: 0.1672 - acc: 0.9367
    Epoch 19/30
    60000/60000 - 2s - loss: 0.1622 - acc: 0.9390
    Epoch 20/30
    60000/60000 - 2s - loss: 0.1556 - acc: 0.9405
    Epoch 21/30
    60000/60000 - 2s - loss: 0.1518 - acc: 0.9422
    Epoch 22/30
    60000/60000 - 2s - loss: 0.1463 - acc: 0.9445
    Epoch 23/30
    60000/60000 - 2s - loss: 0.1451 - acc: 0.9441
    Epoch 24/30
    60000/60000 - 2s - loss: 0.1408 - acc: 0.9468
    Epoch 25/30
    60000/60000 - 2s - loss: 0.1340 - acc: 0.9499
    Epoch 26/30
    60000/60000 - 2s - loss: 0.1325 - acc: 0.9488
    Epoch 27/30
    60000/60000 - 2s - loss: 0.1271 - acc: 0.9520
    Epoch 28/30
    60000/60000 - 2s - loss: 0.1246 - acc: 0.9532
    Epoch 29/30
    60000/60000 - 2s - loss: 0.1235 - acc: 0.9539
    Epoch 30/30
    60000/60000 - 2s - loss: 0.1199 - acc: 0.9550
    2019-06-30 11:44:03,867 graeae.timers.timer end: Ended: 2019-06-30 11:44:03.867668
    I0630 11:44:03.867694 140129240835904 timer.py:77] Ended: 2019-06-30 11:44:03.867668
    2019-06-30 11:44:03,868 graeae.timers.timer end: Elapsed: 0:01:06.435695
    I0630 11:44:03.868357 140129240835904 timer.py:78] Elapsed: 0:01:06.435695
    
    testing: loss=96.21011676330566, accuracy=87.44999766349792%
    [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
    expected label: 1, Trouser
    actual label: 1, Trouser
    

    The accuracy seems to be around the same, but the loss is getting pretty high.

Early Stopping

What if you want to stop when the loss reaches a certain point? In Keras/tensorflow you can set a callback that stops the training (and other things, like plot images or store the values as you progress for later plotting.)

class Stop(tensorflow.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        if (logs.get("loss") < 0.4):
            print(f"Stopping point reached at epoch {epoch}")
            self.model.stop_training = True

The logs dict will contain all the metrics, so even though we used loss, you could also, in this case, use Mean Absolute Error.

callbacks = Stop()

model = tensorflow.keras.models.Sequential([
  tensorflow.keras.layers.Flatten(),
  tensorflow.keras.layers.Dense(512, activation=tensorflow.nn.relu),
  tensorflow.keras.layers.Dense(10, activation=tensorflow.nn.softmax)
])
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics=["accuracy"])
model.fit(training_images_normalized, training_labels, epochs=5,
          callbacks=[callbacks], verbose=2)
print()
loss, accuracy = model.evaluate(testing_images, testing_labels, verbose=0)
outcomes["512 (early stopping)"] = (loss, accuracy)
print(f"Testing: Loss={loss}, Accuracy: {accuracy}")
classifications = model.predict(testing_images)
index = random.randrange(len(classifications))
selected = classifications[index]
print(selected)

print(f"expected label: {testing_labels[index]}, {labels[testing_labels[index]]}")
print(f"actual label: {selected.argmax()}, {labels[selected.argmax()]}")
Epoch 1/5
60000/60000 - 2s - loss: 0.4765 - acc: 0.8295
Epoch 2/5
Stopping point reached at epoch 1
60000/60000 - 2s - loss: 0.3597 - acc: 0.8679

Testing: Loss=58.14345246582031, Accuracy: 0.8514999747276306
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
expected label: 9, Ankle Boot
actual label: 9, Ankle Boot

By setting a threshold for the loss we were able to stop after two epochs instead of going to the full five epochs, which saves on training time, but also sometimes reduces the performance on the testing set slightly (the training that went the full five epochs stopped at a loss of 0.28, not 0.4). I just noticed that the 512 unit network actually didn't do better this time (each time I run this notebook things change slightly) but normally it is the model that performs the best.

print("|Units | Loss | Accuracy|")
print("|-+-+-|")
for units, (loss, accuracy) in outcomes.items():
    print(f"|{units}| {loss:.2f}| {accuracy: .2f}|")
Units Loss Accuracy
128 53.34 0.86
512 65.45 0.85
1024 64.08 0.86
512 (early stopping) 58.14 0.85

End

Source

This is a re-do of the Beyond Hello World, A Computer Vision Example notebook on github by Laurence Moroney.

Hello There

Beginning

This 'Hello World' takes data created by a simple linear model and trains a neural network to model it. The actual model will take this form:

\[ y = mx + b \]

Imports

Python

from argparse import Namespace
from functools import partial
from pathlib import Path
import random

PyPi

from sklearn import linear_model
from tensorflow import keras
import holoviews
import numpy
import pandas
import tensorflow

My Stuff

from graeae.visualization.embed import EmbedHoloview as EmbedHoloviews

Set Up

Plotting

Embed = partial(EmbedHoloviews, 
                folder_path=Path("../../files/posts/keras/hello-there/"))

Plot = Namespace(
    height=800,
    width=1000,
)
holoviews.extension("bokeh")

The Random Seed

numpy.random.seed(2019)

Middle

The Data

X = 20 * numpy.random.random_sample((10,)) - 10
slope = random.randrange(2, 10)
intercept = random.randrange(200)
Y = slope * X + intercept
print(X)
print(Y)
data = pandas.DataFrame(dict(X=X,
                             Y=Y))
[ 8.06964429 -2.13838987  2.47939923  2.75754802  7.60998138 -4.01655961
  4.0439654   8.06412323  7.62763853 -1.88500404]
[121.48751002  50.03127093  82.35579458  84.30283614 118.26986963
  36.88408272  93.30775783 121.44886259 118.39346971  51.80497172]

Our line is

print("\\[")
print(f"y = {slope} x + {intercept}")
print("\\]")

\[ y = 7 x + 65 \] \[ y = 7 x + 32 \]

plot = holoviews.Scatter(dict(x=data.X, y=data.Y)).opts(
    height=Plot.height,
    width=Plot.width,
)
Embed(plot=plot, file_name="data_scatter")()

Figure Missing

Defining the Neural Network

Our model will be a fully-connected network with one layer with one neuron that takes one input.

  • Sequential : A linear stack of layers
  • Dense: A densely connected neural network layer
model = keras.Sequential()
model.add(keras.layers.Dense(units=1, input_shape=[1]))

Note: The original notebook passed the Dense layer into the constructor, but this gives a warning that you should pass in the dtype instead. Adding it to the constructed object seems to be the way they prefer to do it currently.

Compiling the Model

"Compiling" in this case means telling the model what optimizer and loss methods to use. In this case it will be Stochastic Gradient Descent and Mean Squared Error.

model.compile(optimizer='sgd', loss='mean_squared_error')

Training The Model

Training is done with the model's fit method. epochs is the number of times to repeat training.

model.fit(X, Y, epochs=500)
Epoch 1/500

10/10 [==============================] - 0s 7ms/sample - loss: 9059.2910
Epoch 2/500

10/10 [==============================] - 0s 142us/sample - loss: 3522.3921
Epoch 3/500

10/10 [==============================] - 0s 117us/sample - loss: 2619.3438
Epoch 4/500

10/10 [==============================] - 0s 96us/sample - loss: 2428.1226
Epoch 5/500

10/10 [==============================] - 0s 117us/sample - loss: 2347.3765
Epoch 6/500

10/10 [==============================] - 0s 114us/sample - loss: 2284.8735
Epoch 7/500

10/10 [==============================] - 0s 141us/sample - loss: 2226.4395
Epoch 8/500

10/10 [==============================] - 0s 125us/sample - loss: 2169.8687
Epoch 9/500

10/10 [==============================] - 0s 121us/sample - loss: 2114.7925
Epoch 10/500

10/10 [==============================] - 0s 131us/sample - loss: 2061.1226
Epoch 11/500

10/10 [==============================] - 0s 126us/sample - loss: 2008.8164
Epoch 12/500

10/10 [==============================] - 0s 139us/sample - loss: 1957.8376
Epoch 13/500

10/10 [==============================] - 0s 140us/sample - loss: 1908.1527
Epoch 14/500

10/10 [==============================] - 0s 147us/sample - loss: 1859.7283
Epoch 15/500

10/10 [==============================] - 0s 152us/sample - loss: 1812.5332
Epoch 16/500

10/10 [==============================] - 0s 140us/sample - loss: 1766.5355
Epoch 17/500

10/10 [==============================] - 0s 160us/sample - loss: 1721.7054
Epoch 18/500

10/10 [==============================] - 0s 112us/sample - loss: 1678.0129
Epoch 19/500

10/10 [==============================] - 0s 116us/sample - loss: 1635.4291
Epoch 20/500

10/10 [==============================] - 0s 114us/sample - loss: 1593.9260
Epoch 21/500

10/10 [==============================] - 0s 113us/sample - loss: 1553.4761
Epoch 22/500

10/10 [==============================] - 0s 108us/sample - loss: 1514.0527
Epoch 23/500

10/10 [==============================] - 0s 109us/sample - loss: 1475.6299
Epoch 24/500

10/10 [==============================] - 0s 98us/sample - loss: 1438.1820
Epoch 25/500

10/10 [==============================] - 0s 124us/sample - loss: 1401.6846
Epoch 26/500

10/10 [==============================] - 0s 118us/sample - loss: 1366.1134
Epoch 27/500

10/10 [==============================] - 0s 111us/sample - loss: 1331.4449
Epoch 28/500

10/10 [==============================] - 0s 102us/sample - loss: 1297.6560
Epoch 29/500

10/10 [==============================] - 0s 115us/sample - loss: 1264.7249
Epoch 30/500

10/10 [==============================] - 0s 118us/sample - loss: 1232.6293
Epoch 31/500

10/10 [==============================] - 0s 107us/sample - loss: 1201.3483
Epoch 32/500

10/10 [==============================] - 0s 108us/sample - loss: 1170.8608
Epoch 33/500

10/10 [==============================] - 0s 106us/sample - loss: 1141.1475
Epoch 34/500

10/10 [==============================] - 0s 113us/sample - loss: 1112.1881
Epoch 35/500

10/10 [==============================] - 0s 113us/sample - loss: 1083.9634
Epoch 36/500

10/10 [==============================] - 0s 117us/sample - loss: 1056.4552
Epoch 37/500

10/10 [==============================] - 0s 96us/sample - loss: 1029.6449
Epoch 38/500

10/10 [==============================] - 0s 120us/sample - loss: 1003.5151
Epoch 39/500

10/10 [==============================] - 0s 101us/sample - loss: 978.0483
Epoch 40/500

10/10 [==============================] - 0s 108us/sample - loss: 953.2279
Epoch 41/500

10/10 [==============================] - 0s 104us/sample - loss: 929.0374
Epoch 42/500

10/10 [==============================] - 0s 111us/sample - loss: 905.4608
Epoch 43/500

10/10 [==============================] - 0s 104us/sample - loss: 882.4824
Epoch 44/500

10/10 [==============================] - 0s 113us/sample - loss: 860.0872
Epoch 45/500

10/10 [==============================] - 0s 118us/sample - loss: 838.2604
Epoch 46/500

10/10 [==============================] - 0s 117us/sample - loss: 816.9874
Epoch 47/500

10/10 [==============================] - 0s 100us/sample - loss: 796.2543
Epoch 48/500

10/10 [==============================] - 0s 108us/sample - loss: 776.0475
Epoch 49/500

10/10 [==============================] - 0s 128us/sample - loss: 756.3533
Epoch 50/500

10/10 [==============================] - 0s 120us/sample - loss: 737.1589
Epoch 51/500

10/10 [==============================] - 0s 139us/sample - loss: 718.4517
Epoch 52/500

10/10 [==============================] - 0s 144us/sample - loss: 700.2191
Epoch 53/500

10/10 [==============================] - 0s 126us/sample - loss: 682.4492
Epoch 54/500

10/10 [==============================] - 0s 126us/sample - loss: 665.1305
Epoch 55/500

10/10 [==============================] - 0s 137us/sample - loss: 648.2512
Epoch 56/500

10/10 [==============================] - 0s 156us/sample - loss: 631.8002
Epoch 57/500

10/10 [==============================] - 0s 131us/sample - loss: 615.7667
Epoch 58/500

10/10 [==============================] - 0s 117us/sample - loss: 600.1400
Epoch 59/500

10/10 [==============================] - 0s 119us/sample - loss: 584.9100
Epoch 60/500

10/10 [==============================] - 0s 138us/sample - loss: 570.0665
Epoch 61/500

10/10 [==============================] - 0s 102us/sample - loss: 555.5996
Epoch 62/500

10/10 [==============================] - 0s 117us/sample - loss: 541.4998
Epoch 63/500

10/10 [==============================] - 0s 117us/sample - loss: 527.7579
Epoch 64/500

10/10 [==============================] - 0s 118us/sample - loss: 514.3649
Epoch 65/500

10/10 [==============================] - 0s 104us/sample - loss: 501.3116
Epoch 66/500

10/10 [==============================] - 0s 113us/sample - loss: 488.5895
Epoch 67/500

10/10 [==============================] - 0s 113us/sample - loss: 476.1904
Epoch 68/500

10/10 [==============================] - 0s 109us/sample - loss: 464.1059
Epoch 69/500

10/10 [==============================] - 0s 179us/sample - loss: 452.3281
Epoch 70/500

10/10 [==============================] - 0s 117us/sample - loss: 440.8490
Epoch 71/500

10/10 [==============================] - 0s 118us/sample - loss: 429.6613
Epoch 72/500

10/10 [==============================] - 0s 118us/sample - loss: 418.7576
Epoch 73/500

10/10 [==============================] - 0s 116us/sample - loss: 408.1307
Epoch 74/500

10/10 [==============================] - 0s 115us/sample - loss: 397.7733
Epoch 75/500

10/10 [==============================] - 0s 119us/sample - loss: 387.6787
Epoch 76/500

10/10 [==============================] - 0s 122us/sample - loss: 377.8404
Epoch 77/500

10/10 [==============================] - 0s 124us/sample - loss: 368.2518
Epoch 78/500

10/10 [==============================] - 0s 120us/sample - loss: 358.9065
Epoch 79/500

10/10 [==============================] - 0s 123us/sample - loss: 349.7983
Epoch 80/500

10/10 [==============================] - 0s 104us/sample - loss: 340.9213
Epoch 81/500

10/10 [==============================] - 0s 107us/sample - loss: 332.2696
Epoch 82/500

10/10 [==============================] - 0s 117us/sample - loss: 323.8374
Epoch 83/500

10/10 [==============================] - 0s 108us/sample - loss: 315.6192
Epoch 84/500

10/10 [==============================] - 0s 117us/sample - loss: 307.6096
Epoch 85/500

10/10 [==============================] - 0s 113us/sample - loss: 299.8033
Epoch 86/500

10/10 [==============================] - 0s 108us/sample - loss: 292.1950
Epoch 87/500

10/10 [==============================] - 0s 97us/sample - loss: 284.7798
Epoch 88/500

10/10 [==============================] - 0s 116us/sample - loss: 277.5528
Epoch 89/500

10/10 [==============================] - 0s 123us/sample - loss: 270.5092
Epoch 90/500

10/10 [==============================] - 0s 122us/sample - loss: 263.6443
Epoch 91/500

10/10 [==============================] - 0s 118us/sample - loss: 256.9538
Epoch 92/500

10/10 [==============================] - 0s 121us/sample - loss: 250.4329
Epoch 93/500

10/10 [==============================] - 0s 118us/sample - loss: 244.0775
Epoch 94/500

10/10 [==============================] - 0s 124us/sample - loss: 237.8834
Epoch 95/500

10/10 [==============================] - 0s 118us/sample - loss: 231.8465
Epoch 96/500

10/10 [==============================] - 0s 136us/sample - loss: 225.9629
Epoch 97/500

10/10 [==============================] - 0s 140us/sample - loss: 220.2286
Epoch 98/500

10/10 [==============================] - 0s 148us/sample - loss: 214.6397
Epoch 99/500

10/10 [==============================] - 0s 144us/sample - loss: 209.1927
Epoch 100/500

10/10 [==============================] - 0s 153us/sample - loss: 203.8839
Epoch 101/500

10/10 [==============================] - 0s 146us/sample - loss: 198.7099
Epoch 102/500

10/10 [==============================] - 0s 145us/sample - loss: 193.6671
Epoch 103/500

10/10 [==============================] - 0s 142us/sample - loss: 188.7523
Epoch 104/500

10/10 [==============================] - 0s 184us/sample - loss: 183.9622
Epoch 105/500

10/10 [==============================] - 0s 121us/sample - loss: 179.2937
Epoch 106/500

10/10 [==============================] - 0s 115us/sample - loss: 174.7437
Epoch 107/500

10/10 [==============================] - 0s 143us/sample - loss: 170.3092
Epoch 108/500

10/10 [==============================] - 0s 163us/sample - loss: 165.9872
Epoch 109/500

10/10 [==============================] - 0s 123us/sample - loss: 161.7748
Epoch 110/500

10/10 [==============================] - 0s 112us/sample - loss: 157.6694
Epoch 111/500

10/10 [==============================] - 0s 139us/sample - loss: 153.6682
Epoch 112/500

10/10 [==============================] - 0s 131us/sample - loss: 149.7685
Epoch 113/500

10/10 [==============================] - 0s 127us/sample - loss: 145.9678
Epoch 114/500

10/10 [==============================] - 0s 145us/sample - loss: 142.2635
Epoch 115/500

10/10 [==============================] - 0s 134us/sample - loss: 138.6532
Epoch 116/500

10/10 [==============================] - 0s 111us/sample - loss: 135.1345
Epoch 117/500

10/10 [==============================] - 0s 116us/sample - loss: 131.7051
Epoch 118/500

10/10 [==============================] - 0s 148us/sample - loss: 128.3628
Epoch 119/500

10/10 [==============================] - 0s 120us/sample - loss: 125.1053
Epoch 120/500

10/10 [==============================] - 0s 118us/sample - loss: 121.9304
Epoch 121/500

10/10 [==============================] - 0s 127us/sample - loss: 118.8361
Epoch 122/500

10/10 [==============================] - 0s 121us/sample - loss: 115.8204
Epoch 123/500

10/10 [==============================] - 0s 117us/sample - loss: 112.8811
Epoch 124/500

10/10 [==============================] - 0s 106us/sample - loss: 110.0165
Epoch 125/500

10/10 [==============================] - 0s 112us/sample - loss: 107.2246
Epoch 126/500

10/10 [==============================] - 0s 97us/sample - loss: 104.5035
Epoch 127/500

10/10 [==============================] - 0s 132us/sample - loss: 101.8514
Epoch 128/500

10/10 [==============================] - 0s 92us/sample - loss: 99.2667
Epoch 129/500

10/10 [==============================] - 0s 96us/sample - loss: 96.7476
Epoch 130/500

10/10 [==============================] - 0s 125us/sample - loss: 94.2923
Epoch 131/500

10/10 [==============================] - 0s 185us/sample - loss: 91.8994
Epoch 132/500

10/10 [==============================] - 0s 127us/sample - loss: 89.5672
Epoch 133/500

10/10 [==============================] - 0s 131us/sample - loss: 87.2943
Epoch 134/500

10/10 [==============================] - 0s 157us/sample - loss: 85.0790
Epoch 135/500

10/10 [==============================] - 0s 134us/sample - loss: 82.9199
Epoch 136/500

10/10 [==============================] - 0s 150us/sample - loss: 80.8156
Epoch 137/500

10/10 [==============================] - 0s 124us/sample - loss: 78.7647
Epoch 138/500

10/10 [==============================] - 0s 121us/sample - loss: 76.7658
Epoch 139/500

10/10 [==============================] - 0s 111us/sample - loss: 74.8177
Epoch 140/500

10/10 [==============================] - 0s 109us/sample - loss: 72.9190
Epoch 141/500

10/10 [==============================] - 0s 122us/sample - loss: 71.0685
Epoch 142/500

10/10 [==============================] - 0s 113us/sample - loss: 69.2649
Epoch 143/500

10/10 [==============================] - 0s 119us/sample - loss: 67.5071
Epoch 144/500

10/10 [==============================] - 0s 125us/sample - loss: 65.7940
Epoch 145/500

10/10 [==============================] - 0s 110us/sample - loss: 64.1243
Epoch 146/500

10/10 [==============================] - 0s 159us/sample - loss: 62.4970
Epoch 147/500

10/10 [==============================] - 0s 115us/sample - loss: 60.9109
Epoch 148/500

10/10 [==============================] - 0s 136us/sample - loss: 59.3652
Epoch 149/500

10/10 [==============================] - 0s 139us/sample - loss: 57.8586
Epoch 150/500

10/10 [==============================] - 0s 127us/sample - loss: 56.3903
Epoch 151/500

10/10 [==============================] - 0s 122us/sample - loss: 54.9593
Epoch 152/500

10/10 [==============================] - 0s 102us/sample - loss: 53.5645
Epoch 153/500

10/10 [==============================] - 0s 159us/sample - loss: 52.2052
Epoch 154/500

10/10 [==============================] - 0s 129us/sample - loss: 50.8803
Epoch 155/500

10/10 [==============================] - 0s 122us/sample - loss: 49.5891
Epoch 156/500

10/10 [==============================] - 0s 129us/sample - loss: 48.3307
Epoch 157/500

10/10 [==============================] - 0s 132us/sample - loss: 47.1041
Epoch 158/500

10/10 [==============================] - 0s 136us/sample - loss: 45.9088
Epoch 159/500

10/10 [==============================] - 0s 130us/sample - loss: 44.7437
Epoch 160/500

10/10 [==============================] - 0s 117us/sample - loss: 43.6082
Epoch 161/500

10/10 [==============================] - 0s 121us/sample - loss: 42.5016
Epoch 162/500

10/10 [==============================] - 0s 119us/sample - loss: 41.4230
Epoch 163/500

10/10 [==============================] - 0s 125us/sample - loss: 40.3718
Epoch 164/500

10/10 [==============================] - 0s 125us/sample - loss: 39.3473
Epoch 165/500

10/10 [==============================] - 0s 106us/sample - loss: 38.3487
Epoch 166/500

10/10 [==============================] - 0s 183us/sample - loss: 37.3755
Epoch 167/500

10/10 [==============================] - 0s 133us/sample - loss: 36.4271
Epoch 168/500

10/10 [==============================] - 0s 139us/sample - loss: 35.5026
Epoch 169/500

10/10 [==============================] - 0s 118us/sample - loss: 34.6017
Epoch 170/500

10/10 [==============================] - 0s 136us/sample - loss: 33.7236
Epoch 171/500

10/10 [==============================] - 0s 140us/sample - loss: 32.8677
Epoch 172/500

10/10 [==============================] - 0s 138us/sample - loss: 32.0336
Epoch 173/500

10/10 [==============================] - 0s 127us/sample - loss: 31.2207
Epoch 174/500

10/10 [==============================] - 0s 139us/sample - loss: 30.4284
Epoch 175/500

10/10 [==============================] - 0s 121us/sample - loss: 29.6562
Epoch 176/500

10/10 [==============================] - 0s 185us/sample - loss: 28.9036
Epoch 177/500

10/10 [==============================] - 0s 126us/sample - loss: 28.1701
Epoch 178/500

10/10 [==============================] - 0s 213us/sample - loss: 27.4552
Epoch 179/500

10/10 [==============================] - 0s 115us/sample - loss: 26.7585
Epoch 180/500

10/10 [==============================] - 0s 111us/sample - loss: 26.0794
Epoch 181/500

10/10 [==============================] - 0s 201us/sample - loss: 25.4176
Epoch 182/500

10/10 [==============================] - 0s 124us/sample - loss: 24.7726
Epoch 183/500

10/10 [==============================] - 0s 130us/sample - loss: 24.1439
Epoch 184/500

10/10 [==============================] - 0s 130us/sample - loss: 23.5312
Epoch 185/500

10/10 [==============================] - 0s 127us/sample - loss: 22.9340
Epoch 186/500

10/10 [==============================] - 0s 130us/sample - loss: 22.3520
Epoch 187/500

10/10 [==============================] - 0s 100us/sample - loss: 21.7848
Epoch 188/500

10/10 [==============================] - 0s 128us/sample - loss: 21.2319
Epoch 189/500

10/10 [==============================] - 0s 124us/sample - loss: 20.6931
Epoch 190/500

10/10 [==============================] - 0s 150us/sample - loss: 20.1680
Epoch 191/500

10/10 [==============================] - 0s 122us/sample - loss: 19.6561
Epoch 192/500

10/10 [==============================] - 0s 154us/sample - loss: 19.1573
Epoch 193/500

10/10 [==============================] - 0s 132us/sample - loss: 18.6711
Epoch 194/500

10/10 [==============================] - 0s 128us/sample - loss: 18.1973
Epoch 195/500

10/10 [==============================] - 0s 127us/sample - loss: 17.7355
Epoch 196/500

10/10 [==============================] - 0s 128us/sample - loss: 17.2854
Epoch 197/500

10/10 [==============================] - 0s 151us/sample - loss: 16.8468
Epoch 198/500

10/10 [==============================] - 0s 125us/sample - loss: 16.4192
Epoch 199/500

10/10 [==============================] - 0s 105us/sample - loss: 16.0025
Epoch 200/500

10/10 [==============================] - 0s 135us/sample - loss: 15.5964
Epoch 201/500

10/10 [==============================] - 0s 102us/sample - loss: 15.2006
Epoch 202/500

10/10 [==============================] - 0s 119us/sample - loss: 14.8149
Epoch 203/500

10/10 [==============================] - 0s 100us/sample - loss: 14.4389
Epoch 204/500

10/10 [==============================] - 0s 109us/sample - loss: 14.0725
Epoch 205/500

10/10 [==============================] - 0s 122us/sample - loss: 13.7154
Epoch 206/500

10/10 [==============================] - 0s 108us/sample - loss: 13.3673
Epoch 207/500

10/10 [==============================] - 0s 113us/sample - loss: 13.0281
Epoch 208/500

10/10 [==============================] - 0s 109us/sample - loss: 12.6975
Epoch 209/500

10/10 [==============================] - 0s 118us/sample - loss: 12.3753
Epoch 210/500

10/10 [==============================] - 0s 138us/sample - loss: 12.0612
Epoch 211/500

10/10 [==============================] - 0s 118us/sample - loss: 11.7551
Epoch 212/500

10/10 [==============================] - 0s 123us/sample - loss: 11.4568
Epoch 213/500

10/10 [==============================] - 0s 126us/sample - loss: 11.1661
Epoch 214/500

10/10 [==============================] - 0s 127us/sample - loss: 10.8827
Epoch 215/500

10/10 [==============================] - 0s 130us/sample - loss: 10.6065
Epoch 216/500

10/10 [==============================] - 0s 171us/sample - loss: 10.3374
Epoch 217/500

10/10 [==============================] - 0s 140us/sample - loss: 10.0750
Epoch 218/500

10/10 [==============================] - 0s 150us/sample - loss: 9.8193
Epoch 219/500

10/10 [==============================] - 0s 144us/sample - loss: 9.5702
Epoch 220/500

10/10 [==============================] - 0s 154us/sample - loss: 9.3273
Epoch 221/500

10/10 [==============================] - 0s 187us/sample - loss: 9.0906
Epoch 222/500

10/10 [==============================] - 0s 160us/sample - loss: 8.8599
Epoch 223/500

10/10 [==============================] - 0s 156us/sample - loss: 8.6350
Epoch 224/500

10/10 [==============================] - 0s 113us/sample - loss: 8.4159
Epoch 225/500

10/10 [==============================] - 0s 109us/sample - loss: 8.2023
Epoch 226/500

10/10 [==============================] - 0s 111us/sample - loss: 7.9942
Epoch 227/500

10/10 [==============================] - 0s 107us/sample - loss: 7.7913
Epoch 228/500

10/10 [==============================] - 0s 196us/sample - loss: 7.5936
Epoch 229/500

10/10 [==============================] - 0s 129us/sample - loss: 7.4009
Epoch 230/500

10/10 [==============================] - 0s 132us/sample - loss: 7.2131
Epoch 231/500

10/10 [==============================] - 0s 107us/sample - loss: 7.0300
Epoch 232/500

10/10 [==============================] - 0s 104us/sample - loss: 6.8516
Epoch 233/500

10/10 [==============================] - 0s 122us/sample - loss: 6.6777
Epoch 234/500

10/10 [==============================] - 0s 124us/sample - loss: 6.5083
Epoch 235/500

10/10 [==============================] - 0s 178us/sample - loss: 6.3431
Epoch 236/500

10/10 [==============================] - 0s 196us/sample - loss: 6.1821
Epoch 237/500

10/10 [==============================] - 0s 177us/sample - loss: 6.0253
Epoch 238/500

10/10 [==============================] - 0s 196us/sample - loss: 5.8724
Epoch 239/500

10/10 [==============================] - 0s 111us/sample - loss: 5.7233
Epoch 240/500

10/10 [==============================] - 0s 113us/sample - loss: 5.5781
Epoch 241/500

10/10 [==============================] - 0s 128us/sample - loss: 5.4365
Epoch 242/500

10/10 [==============================] - 0s 110us/sample - loss: 5.2986
Epoch 243/500

10/10 [==============================] - 0s 121us/sample - loss: 5.1641
Epoch 244/500

10/10 [==============================] - 0s 98us/sample - loss: 5.0330
Epoch 245/500

10/10 [==============================] - 0s 119us/sample - loss: 4.9053
Epoch 246/500

10/10 [==============================] - 0s 96us/sample - loss: 4.7808
Epoch 247/500

10/10 [==============================] - 0s 130us/sample - loss: 4.6595
Epoch 248/500

10/10 [==============================] - 0s 146us/sample - loss: 4.5413
Epoch 249/500

10/10 [==============================] - 0s 159us/sample - loss: 4.4260
Epoch 250/500

10/10 [==============================] - 0s 117us/sample - loss: 4.3137
Epoch 251/500

10/10 [==============================] - 0s 121us/sample - loss: 4.2042
Epoch 252/500

10/10 [==============================] - 0s 168us/sample - loss: 4.0975
Epoch 253/500

10/10 [==============================] - 0s 124us/sample - loss: 3.9936
Epoch 254/500

10/10 [==============================] - 0s 131us/sample - loss: 3.8922
Epoch 255/500

10/10 [==============================] - 0s 147us/sample - loss: 3.7934
Epoch 256/500

10/10 [==============================] - 0s 130us/sample - loss: 3.6972
Epoch 257/500

10/10 [==============================] - 0s 131us/sample - loss: 3.6034
Epoch 258/500

10/10 [==============================] - 0s 110us/sample - loss: 3.5119
Epoch 259/500

10/10 [==============================] - 0s 120us/sample - loss: 3.4228
Epoch 260/500

10/10 [==============================] - 0s 110us/sample - loss: 3.3359
Epoch 261/500

10/10 [==============================] - 0s 142us/sample - loss: 3.2513
Epoch 262/500

10/10 [==============================] - 0s 169us/sample - loss: 3.1688
Epoch 263/500

10/10 [==============================] - 0s 125us/sample - loss: 3.0884
Epoch 264/500

10/10 [==============================] - 0s 125us/sample - loss: 3.0100
Epoch 265/500

10/10 [==============================] - 0s 133us/sample - loss: 2.9336
Epoch 266/500

10/10 [==============================] - 0s 124us/sample - loss: 2.8591
Epoch 267/500

10/10 [==============================] - 0s 122us/sample - loss: 2.7866
Epoch 268/500

10/10 [==============================] - 0s 122us/sample - loss: 2.7159
Epoch 269/500

10/10 [==============================] - 0s 110us/sample - loss: 2.6469
Epoch 270/500

10/10 [==============================] - 0s 121us/sample - loss: 2.5798
Epoch 271/500

10/10 [==============================] - 0s 136us/sample - loss: 2.5143
Epoch 272/500

10/10 [==============================] - 0s 111us/sample - loss: 2.4505
Epoch 273/500

10/10 [==============================] - 0s 117us/sample - loss: 2.3883
Epoch 274/500

10/10 [==============================] - 0s 118us/sample - loss: 2.3277
Epoch 275/500

10/10 [==============================] - 0s 104us/sample - loss: 2.2686
Epoch 276/500

10/10 [==============================] - 0s 117us/sample - loss: 2.2110
Epoch 277/500

10/10 [==============================] - 0s 129us/sample - loss: 2.1549
Epoch 278/500

10/10 [==============================] - 0s 163us/sample - loss: 2.1002
Epoch 279/500

10/10 [==============================] - 0s 132us/sample - loss: 2.0469
Epoch 280/500

10/10 [==============================] - 0s 120us/sample - loss: 1.9950
Epoch 281/500

10/10 [==============================] - 0s 126us/sample - loss: 1.9444
Epoch 282/500

10/10 [==============================] - 0s 121us/sample - loss: 1.8950
Epoch 283/500

10/10 [==============================] - 0s 127us/sample - loss: 1.8469
Epoch 284/500

10/10 [==============================] - 0s 143us/sample - loss: 1.8001
Epoch 285/500

10/10 [==============================] - 0s 134us/sample - loss: 1.7544
Epoch 286/500

10/10 [==============================] - 0s 116us/sample - loss: 1.7099
Epoch 287/500

10/10 [==============================] - 0s 112us/sample - loss: 1.6665
Epoch 288/500

10/10 [==============================] - 0s 118us/sample - loss: 1.6242
Epoch 289/500

10/10 [==============================] - 0s 104us/sample - loss: 1.5830
Epoch 290/500

10/10 [==============================] - 0s 126us/sample - loss: 1.5428
Epoch 291/500

10/10 [==============================] - 0s 120us/sample - loss: 1.5036
Epoch 292/500

10/10 [==============================] - 0s 120us/sample - loss: 1.4655
Epoch 293/500

10/10 [==============================] - 0s 120us/sample - loss: 1.4283
Epoch 294/500

10/10 [==============================] - 0s 114us/sample - loss: 1.3920
Epoch 295/500

10/10 [==============================] - 0s 102us/sample - loss: 1.3567
Epoch 296/500

10/10 [==============================] - 0s 120us/sample - loss: 1.3223
Epoch 297/500

10/10 [==============================] - 0s 107us/sample - loss: 1.2887
Epoch 298/500

10/10 [==============================] - 0s 113us/sample - loss: 1.2560
Epoch 299/500

10/10 [==============================] - 0s 198us/sample - loss: 1.2242
Epoch 300/500

10/10 [==============================] - 0s 163us/sample - loss: 1.1931
Epoch 301/500

10/10 [==============================] - 0s 146us/sample - loss: 1.1628
Epoch 302/500

10/10 [==============================] - 0s 149us/sample - loss: 1.1333
Epoch 303/500

10/10 [==============================] - 0s 153us/sample - loss: 1.1045
Epoch 304/500

10/10 [==============================] - 0s 113us/sample - loss: 1.0765
Epoch 305/500

10/10 [==============================] - 0s 190us/sample - loss: 1.0492
Epoch 306/500

10/10 [==============================] - 0s 171us/sample - loss: 1.0226
Epoch 307/500

10/10 [==============================] - 0s 135us/sample - loss: 0.9966
Epoch 308/500

10/10 [==============================] - 0s 107us/sample - loss: 0.9713
Epoch 309/500

10/10 [==============================] - 0s 103us/sample - loss: 0.9467
Epoch 310/500

10/10 [==============================] - 0s 118us/sample - loss: 0.9227
Epoch 311/500

10/10 [==============================] - 0s 105us/sample - loss: 0.8992
Epoch 312/500

10/10 [==============================] - 0s 125us/sample - loss: 0.8764
Epoch 313/500

10/10 [==============================] - 0s 122us/sample - loss: 0.8542
Epoch 314/500

10/10 [==============================] - 0s 132us/sample - loss: 0.8325
Epoch 315/500

10/10 [==============================] - 0s 100us/sample - loss: 0.8114
Epoch 316/500

10/10 [==============================] - 0s 118us/sample - loss: 0.7908
Epoch 317/500

10/10 [==============================] - 0s 136us/sample - loss: 0.7707
Epoch 318/500

10/10 [==============================] - 0s 147us/sample - loss: 0.7511
Epoch 319/500

10/10 [==============================] - 0s 155us/sample - loss: 0.7321
Epoch 320/500

10/10 [==============================] - 0s 126us/sample - loss: 0.7135
Epoch 321/500

10/10 [==============================] - 0s 127us/sample - loss: 0.6954
Epoch 322/500

10/10 [==============================] - 0s 126us/sample - loss: 0.6778
Epoch 323/500

10/10 [==============================] - 0s 131us/sample - loss: 0.6606
Epoch 324/500

10/10 [==============================] - 0s 129us/sample - loss: 0.6438
Epoch 325/500

10/10 [==============================] - 0s 127us/sample - loss: 0.6275
Epoch 326/500

10/10 [==============================] - 0s 136us/sample - loss: 0.6115
Epoch 327/500

10/10 [==============================] - 0s 125us/sample - loss: 0.5960
Epoch 328/500

10/10 [==============================] - 0s 118us/sample - loss: 0.5809
Epoch 329/500

10/10 [==============================] - 0s 134us/sample - loss: 0.5661
Epoch 330/500

10/10 [==============================] - 0s 160us/sample - loss: 0.5518
Epoch 331/500

10/10 [==============================] - 0s 124us/sample - loss: 0.5378
Epoch 332/500

10/10 [==============================] - 0s 156us/sample - loss: 0.5241
Epoch 333/500

10/10 [==============================] - 0s 121us/sample - loss: 0.5108
Epoch 334/500

10/10 [==============================] - 0s 118us/sample - loss: 0.4979
Epoch 335/500

10/10 [==============================] - 0s 126us/sample - loss: 0.4852
Epoch 336/500

10/10 [==============================] - 0s 139us/sample - loss: 0.4729
Epoch 337/500

10/10 [==============================] - 0s 143us/sample - loss: 0.4609
Epoch 338/500

10/10 [==============================] - 0s 122us/sample - loss: 0.4492
Epoch 339/500

10/10 [==============================] - 0s 123us/sample - loss: 0.4378
Epoch 340/500

10/10 [==============================] - 0s 157us/sample - loss: 0.4267
Epoch 341/500

10/10 [==============================] - 0s 124us/sample - loss: 0.4159
Epoch 342/500

10/10 [==============================] - 0s 128us/sample - loss: 0.4053
Epoch 343/500

10/10 [==============================] - 0s 129us/sample - loss: 0.3950
Epoch 344/500

10/10 [==============================] - 0s 215us/sample - loss: 0.3850
Epoch 345/500

10/10 [==============================] - 0s 135us/sample - loss: 0.3752
Epoch 346/500

10/10 [==============================] - 0s 123us/sample - loss: 0.3657
Epoch 347/500

10/10 [==============================] - 0s 133us/sample - loss: 0.3564
Epoch 348/500

10/10 [==============================] - 0s 109us/sample - loss: 0.3474
Epoch 349/500

10/10 [==============================] - 0s 152us/sample - loss: 0.3386
Epoch 350/500

10/10 [==============================] - 0s 122us/sample - loss: 0.3300
Epoch 351/500

10/10 [==============================] - 0s 125us/sample - loss: 0.3216
Epoch 352/500

10/10 [==============================] - 0s 136us/sample - loss: 0.3134
Epoch 353/500

10/10 [==============================] - 0s 119us/sample - loss: 0.3055
Epoch 354/500

10/10 [==============================] - 0s 121us/sample - loss: 0.2977
Epoch 355/500

10/10 [==============================] - 0s 144us/sample - loss: 0.2902
Epoch 356/500

10/10 [==============================] - 0s 128us/sample - loss: 0.2828
Epoch 357/500

10/10 [==============================] - 0s 137us/sample - loss: 0.2756
Epoch 358/500

10/10 [==============================] - 0s 129us/sample - loss: 0.2686
Epoch 359/500

10/10 [==============================] - 0s 137us/sample - loss: 0.2618
Epoch 360/500

10/10 [==============================] - 0s 137us/sample - loss: 0.2552
Epoch 361/500

10/10 [==============================] - 0s 139us/sample - loss: 0.2487
Epoch 362/500

10/10 [==============================] - 0s 132us/sample - loss: 0.2424
Epoch 363/500

10/10 [==============================] - 0s 121us/sample - loss: 0.2362
Epoch 364/500

10/10 [==============================] - 0s 134us/sample - loss: 0.2303
Epoch 365/500

10/10 [==============================] - 0s 132us/sample - loss: 0.2244
Epoch 366/500

10/10 [==============================] - 0s 128us/sample - loss: 0.2187
Epoch 367/500

10/10 [==============================] - 0s 126us/sample - loss: 0.2132
Epoch 368/500

10/10 [==============================] - 0s 117us/sample - loss: 0.2078
Epoch 369/500

10/10 [==============================] - 0s 118us/sample - loss: 0.2025
Epoch 370/500

10/10 [==============================] - 0s 136us/sample - loss: 0.1973
Epoch 371/500

10/10 [==============================] - 0s 156us/sample - loss: 0.1923
Epoch 372/500

10/10 [==============================] - 0s 141us/sample - loss: 0.1875
Epoch 373/500

10/10 [==============================] - 0s 117us/sample - loss: 0.1827
Epoch 374/500

10/10 [==============================] - 0s 151us/sample - loss: 0.1781
Epoch 375/500

10/10 [==============================] - 0s 113us/sample - loss: 0.1735
Epoch 376/500

10/10 [==============================] - 0s 120us/sample - loss: 0.1691
Epoch 377/500

10/10 [==============================] - 0s 123us/sample - loss: 0.1648
Epoch 378/500

10/10 [==============================] - 0s 127us/sample - loss: 0.1607
Epoch 379/500

10/10 [==============================] - 0s 130us/sample - loss: 0.1566
Epoch 380/500

10/10 [==============================] - 0s 135us/sample - loss: 0.1526
Epoch 381/500

10/10 [==============================] - 0s 141us/sample - loss: 0.1487
Epoch 382/500

10/10 [==============================] - 0s 174us/sample - loss: 0.1450
Epoch 383/500

10/10 [==============================] - 0s 139us/sample - loss: 0.1413
Epoch 384/500

10/10 [==============================] - 0s 144us/sample - loss: 0.1377
Epoch 385/500

10/10 [==============================] - 0s 118us/sample - loss: 0.1342
Epoch 386/500

10/10 [==============================] - 0s 135us/sample - loss: 0.1308
Epoch 387/500

10/10 [==============================] - 0s 110us/sample - loss: 0.1275
Epoch 388/500

10/10 [==============================] - 0s 139us/sample - loss: 0.1242
Epoch 389/500

10/10 [==============================] - 0s 158us/sample - loss: 0.1211
Epoch 390/500

10/10 [==============================] - 0s 116us/sample - loss: 0.1180
Epoch 391/500

10/10 [==============================] - 0s 117us/sample - loss: 0.1150
Epoch 392/500

10/10 [==============================] - 0s 139us/sample - loss: 0.1121
Epoch 393/500

10/10 [==============================] - 0s 118us/sample - loss: 0.1093
Epoch 394/500

10/10 [==============================] - 0s 115us/sample - loss: 0.1065
Epoch 395/500

10/10 [==============================] - 0s 105us/sample - loss: 0.1038
Epoch 396/500

10/10 [==============================] - 0s 112us/sample - loss: 0.1012
Epoch 397/500

10/10 [==============================] - 0s 111us/sample - loss: 0.0986
Epoch 398/500

10/10 [==============================] - 0s 107us/sample - loss: 0.0961
Epoch 399/500

10/10 [==============================] - 0s 110us/sample - loss: 0.0936
Epoch 400/500

10/10 [==============================] - 0s 121us/sample - loss: 0.0913
Epoch 401/500

10/10 [==============================] - 0s 100us/sample - loss: 0.0890
Epoch 402/500

10/10 [==============================] - 0s 103us/sample - loss: 0.0867
Epoch 403/500

10/10 [==============================] - 0s 107us/sample - loss: 0.0845
Epoch 404/500

10/10 [==============================] - 0s 110us/sample - loss: 0.0824
Epoch 405/500

10/10 [==============================] - 0s 114us/sample - loss: 0.0803
Epoch 406/500

10/10 [==============================] - 0s 141us/sample - loss: 0.0782
Epoch 407/500

10/10 [==============================] - 0s 129us/sample - loss: 0.0762
Epoch 408/500

10/10 [==============================] - 0s 133us/sample - loss: 0.0743
Epoch 409/500

10/10 [==============================] - 0s 142us/sample - loss: 0.0724
Epoch 410/500

10/10 [==============================] - 0s 107us/sample - loss: 0.0706
Epoch 411/500

10/10 [==============================] - 0s 181us/sample - loss: 0.0688
Epoch 412/500

10/10 [==============================] - 0s 162us/sample - loss: 0.0670
Epoch 413/500

10/10 [==============================] - 0s 102us/sample - loss: 0.0653
Epoch 414/500

10/10 [==============================] - 0s 189us/sample - loss: 0.0637
Epoch 415/500

10/10 [==============================] - 0s 117us/sample - loss: 0.0621
Epoch 416/500

10/10 [==============================] - 0s 109us/sample - loss: 0.0605
Epoch 417/500

10/10 [==============================] - 0s 116us/sample - loss: 0.0590
Epoch 418/500

10/10 [==============================] - 0s 110us/sample - loss: 0.0575
Epoch 419/500

10/10 [==============================] - 0s 104us/sample - loss: 0.0560
Epoch 420/500

10/10 [==============================] - 0s 128us/sample - loss: 0.0546
Epoch 421/500

10/10 [==============================] - 0s 119us/sample - loss: 0.0532
Epoch 422/500

10/10 [==============================] - 0s 114us/sample - loss: 0.0518
Epoch 423/500

10/10 [==============================] - 0s 199us/sample - loss: 0.0505
Epoch 424/500

10/10 [==============================] - 0s 124us/sample - loss: 0.0493
Epoch 425/500

10/10 [==============================] - 0s 200us/sample - loss: 0.0480
Epoch 426/500

10/10 [==============================] - 0s 192us/sample - loss: 0.0468
Epoch 427/500

10/10 [==============================] - 0s 136us/sample - loss: 0.0456
Epoch 428/500

10/10 [==============================] - 0s 134us/sample - loss: 0.0444
Epoch 429/500

10/10 [==============================] - 0s 132us/sample - loss: 0.0433
Epoch 430/500

10/10 [==============================] - 0s 111us/sample - loss: 0.0422
Epoch 431/500

10/10 [==============================] - 0s 119us/sample - loss: 0.0411
Epoch 432/500

10/10 [==============================] - 0s 119us/sample - loss: 0.0401
Epoch 433/500

10/10 [==============================] - 0s 120us/sample - loss: 0.0391
Epoch 434/500

10/10 [==============================] - 0s 112us/sample - loss: 0.0381
Epoch 435/500

10/10 [==============================] - 0s 146us/sample - loss: 0.0371
Epoch 436/500

10/10 [==============================] - 0s 148us/sample - loss: 0.0362
Epoch 437/500

10/10 [==============================] - 0s 145us/sample - loss: 0.0353
Epoch 438/500

10/10 [==============================] - 0s 146us/sample - loss: 0.0344
Epoch 439/500

10/10 [==============================] - 0s 167us/sample - loss: 0.0335
Epoch 440/500

10/10 [==============================] - 0s 138us/sample - loss: 0.0326
Epoch 441/500

10/10 [==============================] - 0s 135us/sample - loss: 0.0318
Epoch 442/500

10/10 [==============================] - 0s 149us/sample - loss: 0.0310
Epoch 443/500

10/10 [==============================] - 0s 135us/sample - loss: 0.0302
Epoch 444/500

10/10 [==============================] - 0s 150us/sample - loss: 0.0295
Epoch 445/500

10/10 [==============================] - 0s 163us/sample - loss: 0.0287
Epoch 446/500

10/10 [==============================] - 0s 135us/sample - loss: 0.0280
Epoch 447/500

10/10 [==============================] - 0s 152us/sample - loss: 0.0273
Epoch 448/500

10/10 [==============================] - 0s 142us/sample - loss: 0.0266
Epoch 449/500

10/10 [==============================] - 0s 158us/sample - loss: 0.0259
Epoch 450/500

10/10 [==============================] - 0s 160us/sample - loss: 0.0252
Epoch 451/500

10/10 [==============================] - 0s 173us/sample - loss: 0.0246
Epoch 452/500

10/10 [==============================] - 0s 161us/sample - loss: 0.0240
Epoch 453/500

10/10 [==============================] - 0s 171us/sample - loss: 0.0234
Epoch 454/500

10/10 [==============================] - 0s 190us/sample - loss: 0.0228
Epoch 455/500

10/10 [==============================] - 0s 192us/sample - loss: 0.0222
Epoch 456/500

10/10 [==============================] - 0s 194us/sample - loss: 0.0216
Epoch 457/500

10/10 [==============================] - 0s 197us/sample - loss: 0.0211
Epoch 458/500

10/10 [==============================] - 0s 181us/sample - loss: 0.0206
Epoch 459/500

10/10 [==============================] - 0s 185us/sample - loss: 0.0200
Epoch 460/500

10/10 [==============================] - 0s 193us/sample - loss: 0.0195
Epoch 461/500

10/10 [==============================] - 0s 209us/sample - loss: 0.0190
Epoch 462/500

10/10 [==============================] - 0s 209us/sample - loss: 0.0185
Epoch 463/500

10/10 [==============================] - 0s 212us/sample - loss: 0.0181
Epoch 464/500

10/10 [==============================] - 0s 201us/sample - loss: 0.0176
Epoch 465/500

10/10 [==============================] - 0s 154us/sample - loss: 0.0172
Epoch 466/500

10/10 [==============================] - 0s 157us/sample - loss: 0.0167
Epoch 467/500

10/10 [==============================] - 0s 153us/sample - loss: 0.0163
Epoch 468/500

10/10 [==============================] - 0s 112us/sample - loss: 0.0159
Epoch 469/500

10/10 [==============================] - 0s 153us/sample - loss: 0.0155
Epoch 470/500

10/10 [==============================] - 0s 156us/sample - loss: 0.0151
Epoch 471/500

10/10 [==============================] - 0s 144us/sample - loss: 0.0147
Epoch 472/500

10/10 [==============================] - 0s 156us/sample - loss: 0.0143
Epoch 473/500

10/10 [==============================] - 0s 142us/sample - loss: 0.0140
Epoch 474/500

10/10 [==============================] - 0s 144us/sample - loss: 0.0136
Epoch 475/500

10/10 [==============================] - 0s 153us/sample - loss: 0.0133
Epoch 476/500

10/10 [==============================] - 0s 145us/sample - loss: 0.0129
Epoch 477/500

10/10 [==============================] - 0s 157us/sample - loss: 0.0126
Epoch 478/500

10/10 [==============================] - 0s 130us/sample - loss: 0.0123
Epoch 479/500

10/10 [==============================] - 0s 111us/sample - loss: 0.0120
Epoch 480/500

10/10 [==============================] - 0s 111us/sample - loss: 0.0117
Epoch 481/500

10/10 [==============================] - 0s 111us/sample - loss: 0.0114
Epoch 482/500

10/10 [==============================] - 0s 121us/sample - loss: 0.0111
Epoch 483/500

10/10 [==============================] - 0s 121us/sample - loss: 0.0108
Epoch 484/500

10/10 [==============================] - 0s 106us/sample - loss: 0.0105
Epoch 485/500

10/10 [==============================] - 0s 106us/sample - loss: 0.0103
Epoch 486/500

10/10 [==============================] - 0s 107us/sample - loss: 0.0100
Epoch 487/500

10/10 [==============================] - 0s 105us/sample - loss: 0.0098
Epoch 488/500

10/10 [==============================] - 0s 107us/sample - loss: 0.0095
Epoch 489/500

10/10 [==============================] - 0s 109us/sample - loss: 0.0093
Epoch 490/500

10/10 [==============================] - 0s 120us/sample - loss: 0.0090
Epoch 491/500

10/10 [==============================] - 0s 113us/sample - loss: 0.0088
Epoch 492/500

10/10 [==============================] - 0s 116us/sample - loss: 0.0086
Epoch 493/500

10/10 [==============================] - 0s 113us/sample - loss: 0.0084
Epoch 494/500

10/10 [==============================] - 0s 146us/sample - loss: 0.0081
Epoch 495/500

10/10 [==============================] - 0s 110us/sample - loss: 0.0079
Epoch 496/500

10/10 [==============================] - 0s 125us/sample - loss: 0.0077
Epoch 497/500

10/10 [==============================] - 0s 110us/sample - loss: 0.0075
Epoch 498/500

10/10 [==============================] - 0s 116us/sample - loss: 0.0074
Epoch 499/500

10/10 [==============================] - 0s 122us/sample - loss: 0.0072
Epoch 500/500

10/10 [==============================] - 0s 108us/sample - loss: 0.0070

Make a Prediction

What would y be if x=100?

input_value = [100.0]
predicted = model.predict(input_value)
print(predicted)
[[766.0348]]

The actual value is

actual = (100 * slope) + intercept
print(f"y = {actual}")
print(f"difference = {actual - predicted[0][0]}")
y = 765
difference = -1.0347900390625

So it was pretty close, but not exact.

Comparing to a Linear Regression Model

regression = linear_model.LinearRegression()
regression.fit(X.reshape(-1, 1), Y)
prediction = regression.predict([input_value])
print(prediction)
[765.]

The linear model got it exactly right, as you might expect, but this isn't really a problem that exploits the positive features of machine learning.

Building an image dataset

Beginning

Imports

Python

from pathlib import Path

PyPi

The lecture uses javascript pasted into the browser to download images but I'm going to try a python library built to download images - Google Imaged Download. The documentation mentions that it uses Selenium but it doesn't explicitly state (or at least not that I could see) that it requires you to install Chrome Driver (not Gecko Driver like I originally did), and therefore you need a Chromium-based browser as well.

from google_images_download.google_images_download import googleimagesdownload as GoogleImages
from fastai.metrics import error_rate
from fastai.vision.data import (imagenet_stats, ImageDataBunch, verify_images)
from fastai.vision.learner import cnn_learner, ClassificationInterpretation
from fastai.vision import models
from fastai.vision.transform import get_transforms

import numpy

My Stuff

from graeae import EnvironmentLoader

Set Up

The Environment

environment = EnvironmentLoader()

The Download

google_images = GoogleImages()

The Output Path

weed_path = Path(environment["WEEDS"]).expanduser()

Middle

Downloading

Dandelions

keywords = dict(
    keywords="dandelion",
    limit=1000,
    type="photo",
    output_directory=str(weed_path),
    chromedriver="/usr/local/bin/chromedriver",
)

The library can't find the chromedriver for some reason, even though it's on the path. Also, in creating the output folder it appears to expect that the output directory is a string so you have to convert the path.

paths = google_images.download(keywords)

Item no.: 1 --> Item name = dandelion
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.dandelion-benefits-1296x728-feature.jpg
Completed Image ====> 2.324083_1100.jpg
Completed Image ====> 3.DandelionFlower.jpg
Completed Image ====> 4.Dandelion-in-Spring.jpg
Completed Image ====> 5.220px-TaraxacumOfficinaleSeed.JPG
Completed Image ====> 6.dandelions-in-a-field.jpg
Completed Image ====> 7.dandelionleaves2.jpg
Completed Image ====> 8.81MteT13V7L._SX425_.jpg
Completed Image ====> 9._103888633_hi016427699.jpg
Completed Image ====> 10.21711_dandelion1.rev.1401296268.jpg
Completed Image ====> 11.dandelions-1030x687.jpg
Completed Image ====> 12.dandelions.jpg
Completed Image ====> 13.6caf5b570c7c435ea2f0258b2337b964.jpg
Completed Image ====> 14.dandelion-2065913_1920.jpg
Completed Image ====> 15.urban-foraging.png
Completed Image ====> 16.Newly-discovered-form-of-natural-flight-found-in-dandelion-seeds-730x410.jpg
Completed Image ====> 17.dandelion-uses.jpg
Completed Image ====> 18.Dandelion-GettyImages-135558263-588f7eb73df78caebc084c58.jpg
Completed Image ====> 19.Yellow-and-fluffy-white-dandelions.jpg
Completed Image ====> 20.howdandelion.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 21.Use-dandelions-for-food-and-medicine.jpg
Completed Image ====> 22.1400945145878.jpeg
Completed Image ====> 23.00951_01_dandelion.jpg
Completed Image ====> 24.Dan_1024x1024.jpg
Completed Image ====> 25.dandel08-l.jpg
Completed Image ====> 26.Dandelion-Meaning.jpg
Completed Image ====> 27.shutterstock_529155295-860x430.jpg
Completed Image ====> 28.hotw-dandelion1-e1533580213163-300x300.jpg
Completed Image ====> 29.TM_Header_Dandelion101_02.jpg
Completed Image ====> 30.2017-04-05-01.jpg
Completed Image ====> 31.dandelion-taraxacum-officinale-primary_400a4ee2-b6fd-4307-b372-d2b529c0e4dc_300x.jpg
Completed Image ====> 32.overhead.jpg
Completed Image ====> 33.dandelions_1.jpg
Completed Image ====> 34.dandelion.jpg
Completed Image ====> 35.Dandelion-seeds.jpg
Completed Image ====> 36.Dandelion-Salad-with-Warm-Pecan-Vinaigrette-500x500.jpg
Completed Image ====> 37.tankist276_shutterstock_31471963.jpg
Completed Image ====> 38.dandelion.jpg
Completed Image ====> 39.Screen_Shot_2016-01-17_at_5.52.50_PM_1024x1024.png
Completed Image ====> 40.bullseye-dandelion-blossom.jpg
Completed Image ====> 41.719fF478nPL._SL1323_.jpg
Completed Image ====> 42.Dandelion_Bloom.jpg
Completed Image ====> 43.dandelion-wine-tall18.jpg
Completed Image ====> 44.220px-Dandelion_seedhead_with_only_a_single_seed_still_attached.jpg
Completed Image ====> 45.dandelion-meadow-full_0.jpg
Completed Image ====> 46.dandelion-gummy-bears-11.jpg
Completed Image ====> 47.dan-860x430.jpg
Completed Image ====> 48.stock-photo-dandelions-130064053_master.jpg
Completed Image ====> 49.dandelion-1306911_1920.jpg
Completed Image ====> 50.image_6521e-Dandelion.jpg
Completed Image ====> 51.Dandelion-in-Australia.jpg
Completed Image ====> 52.DandelionMeanings3.jpg
Completed Image ====> 53.220px-Kantoutanpopo.jpg
Completed Image ====> 54.101618_HT_dandelion_feat.jpg
Completed Image ====> 55.Dandelion-group.JPG
Completed Image ====> 56.shutterstock_274297355-800x450.jpg
Completed Image ====> 57.dandelion-810x378.jpg
Completed Image ====> 58.dandelions-on-a-chopping-board.jpg
Completed Image ====> 59.81575be68362cb4059be6363a2aed906_grande.png
Completed Image ====> 60.16893922_web1_190519-pdn-andrew-may1-web.jpg
Completed Image ====> 61.Dandelion-in-a-gout-diet-500x300.jpg
Completed Image ====> 62.dandelion-flowers-field_0.jpg
Completed Image ====> 63.181022-dandelion-full.gif
Completed Image ====> 64.dandelion-flowers.jpg
Completed Image ====> 65.dandelion-shortbread-7.jpg
Completed Image ====> 66.1484330534065.jpg
Completed Image ====> 67.dandelion_1600.jpg
Completed Image ====> 68.vegetable-organic-dandelion-greens-1_1024x1024.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 69.IMG_0813-1024x1024.jpg
Completed Image ====> 70.f_12.jpg
Completed Image ====> 71.642x361_7_Ways_Dandelion_Tea_Could_Be_Good_for_You.jpg
Completed Image ====> 72.1525109821_5ae7543d0dc81.JPG
Completed Image ====> 73.dandelion-seed-head-400x300.jpg
Completed Image ====> 74.2017-04-05-06.jpg
Completed Image ====> 75.dandelion-1024x769.jpg
Completed Image ====> 76.1678-28-Amazing-Benefits-Of-Dandelion-Dudal-For-Skin-Hair-And-Health-ss.jpg
Completed Image ====> 77.Dandelion.width-800.jpg
Completed Image ====> 78.Basket-of-Dandelions.jpg
Completed Image ====> 79.maxresdefault.jpg
Completed Image ====> 80.dandelion-field-maigi.jpg
Completed Image ====> 81.5aec5ff6cb772.image.jpg
Completed Image ====> 82.gettyimages-157508237-1555967430.jpg
Completed Image ====> 83.dandelion-field-flora-159081.jpg
Completed Image ====> 84.dandelion-seeds.jpg
Completed Image ====> 85.7181016_xl-1050x519.png
Invalid or missing image format. Skipping...
Completed Image ====> 86.Dandelion_and_bee_350.jpg
Completed Image ====> 87.dandelion-1.jpg
Completed Image ====> 88.Dandelion-5.jpeg
Completed Image ====> 89.Benefits-Of-Dandelion.jpg
Completed Image ====> 90.Dandelion.jpg
Completed Image ====> 91.dandelions.jpg
Completed Image ====> 92.diy-dandelion-playdough-recipe.jpg
Completed Image ====> 93.47000037%402x.jpg
Completed Image ====> 94.2-dandelion-blowing-bess-hamiti.jpg
Completed Image ====> 95.dandy.jpg
Completed Image ====> 96.Dandelion-5.jpg
Completed Image ====> 97.101456886_feature.png
Completed Image ====> 98.ingredient-IQ-dandelions-1142x474-c.jpg
Completed Image ====> 99.Dandelion-5.jpg
Completed Image ====> 100.dandelion-2260690_960_720.jpg
Completed Image ====> 101.d41586-018-07032-6_16203056.jpg
Completed Image ====> 102.DandelionBG.jpg
Completed Image ====> 103.h-yellow-dandelion-flower.jpg
Completed Image ====> 104.GettyImages-145629450-581829635f9b581c0b104942.jpg
Completed Image ====> 105.115738809%282%29.jpg
Completed Image ====> 106.dandelion_smart-fix.jpg
Completed Image ====> 107.dandelion-tea-620_620x350_71484652381.jpg
Completed Image ====> 108.dandelion-1-ADJUSTED-248x300.jpg
Completed Image ====> 109.dandelion-pesto-1-1030x687.jpg
Completed Image ====> 110.Grandmas-Dandelion-Soup-overheadW-700x542.jpg
Completed Image ====> 111.Health-benefits-of-Dandelion-2.jpg
Completed Image ====> 112.814v-YsM2dL._SL1201_.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 113.making-dandelion-vinegar-500x375.jpg
Completed Image ====> 114.dandelions.jpg
Completed Image ====> 115.sow-thistle-vs-dandelion.jpg
Completed Image ====> 116.dandelions_article.jpg
Completed Image ====> 117.Dandelion_Feature_xl_10556655_(Custom).jpg
Completed Image ====> 118.Dandelion_1-2000x1180.jpg
Completed Image ====> 119.1-dandelion-seeds-bess-hamiti.jpg
Completed Image ====> 120.DandelionTincture.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 121.dandelion-leaves-500x500.png
Completed Image ====> 122.Dandelion_tires_technology_Continental.jpg
Completed Image ====> 123.violet-in-dandelions.jpg
Completed Image ====> 124.yellow-dandelions-bright-flowers-on-260nw-598445252.jpg
Completed Image ====> 125.Dandelion-300x225.jpg
Completed Image ====> 126.dandelion.jpg
Completed Image ====> 127.Dandelion%20Festival%20Webpage%20Image.jpg
Completed Image ====> 128.dandelion-3.jpg
Completed Image ====> 129.DandelionHoney-5a840cb33128340037a09e0e.jpg
Completed Image ====> 130.AN150-Dandelion-Greens-732x549-thumb.jpg
Completed Image ====> 131.Dandelion_400x400.jpg
Completed Image ====> 132.dandelion.JPG
Completed Image ====> 133.5ac3a71a821e5.image.jpg
Completed Image ====> 134.BENS_DANDELION.jpg
Completed Image ====> 135.dandelion-flowers-big.jpg
Completed Image ====> 136.sauteed-dandelions-with-eggs-leeks-and-feta-1-9-600x900.jpg
Completed Image ====> 137.13979689_f1024.jpg
Completed Image ====> 138.177102678.jpg
Completed Image ====> 139.dandelion-wine-recipe-1.jpg
Completed Image ====> 140.10881341-large.jpg
Completed Image ====> 141.DandelionTeaUpdate_Header.jpg
Completed Image ====> 142.dandelion-wild-taraxacum-officinale-seeds-amkha-seed_716.jpg
Completed Image ====> 143.dandelionbeer-banner-panorama.jpg
Completed Image ====> 144.maxresdefault.jpg
Completed Image ====> 145.east-coast-dandelion.jpg
Completed Image ====> 146.dandelion-seeds-in-the-sunlight-vector-20571994.jpg
Completed Image ====> 147.dandelions.jpg
Completed Image ====> 148.TM_Embed_Dandelion101_SS.jpg
Completed Image ====> 149.Dandelion1.jpg
Completed Image ====> 150.Washing-Dandelions.jpg
Completed Image ====> 151.best+way+to+get+rid+of+dandelions+permanently.jpeg
Completed Image ====> 152.14239953175_96bc487474_b.jpg
Completed Image ====> 153.pink_dandelion_-_3.jpg
Completed Image ====> 154.dandelion-plants.jpg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>
Completed Image ====> 155.dandelion_flower_full.jpg
Completed Image ====> 156.Common_Dandelion.jpg
Completed Image ====> 157.480453655_0.jpg
Completed Image ====> 158.dandelion-vinegar-FB.jpg
Completed Image ====> 159.medicinal-mixology-dandelion.jpg
Completed Image ====> 160.93298382-blue-abstract-dandelion-flower-texture-background-sunrise-extreme-macro-soft-focus-.jpg
Completed Image ====> 161.5b60acbc92c3f9c95ecadc52_dandelion-health-salad-flowers-161568.jpg
Completed Image ====> 162.170px-Seed_head_dandelion.jpg
Completed Image ====> 163.dandelion.jpg
Completed Image ====> 164.pexels-photo-1099105.jpeg
Invalid or missing image format. Skipping...
Completed Image ====> 165.fieldofDandelions.jpg
Completed Image ====> 166.dandelion-leaves1-400x300.jpg
Completed Image ====> 167.30f917292dac4b478a665f319c982f69.jpg
Completed Image ====> 168.dandelion-root-tea-health-benefits-bright.jpg
Completed Image ====> 169.2016-10-18-dandelion.jpg
Completed Image ====> 170.Dandelion-seeds20150806-30610-1836jds.jpg
Completed Image ====> 171.220px-A_dandelion.jpg
Completed Image ====> 172.5644-004-BBAB2EF4.jpg
Completed Image ====> 173.858X1920_2a3d0912ec2465521b06b14633c8cfac.png
Completed Image ====> 174.dandelion-flower-300x225.jpg
Completed Image ====> 175.dandelion-recipes-1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 176.5c13ef0e9848de205dc3a28d_g94Z7beTiBSs4qZSinKk9w13jAr2BFLyiT7BBYNHDZcw-v5pf_AAjSvgmYxqawn3EA45mtke5B79v6ay5rhjYrD4um0_4Ib42i9EJV7CrsuixS0tWzQfi5m55t5CX2S3Y7rBmjw7.jpeg
Completed Image ====> 177.dandelion-flower-02.jpg
Completed Image ====> 178.dan3.gif
Completed Image ====> 179.boiled-dandelion-greens-810x455.jpg
Completed Image ====> 180.dandylion_0.jpg
Completed Image ====> 181.issue43_main.jpg
Completed Image ====> 182.D5a6ytyX4AAQXsL.jpg
Completed Image ====> 183.IMG_1291-1024x1024.jpg
Completed Image ====> 184.Dandelion-Oil-Pin-2.jpg
Completed Image ====> 185.Small-Dandelion-Flower-Temporary-Tattoo-Design-Idea-Shoulder.jpg
Completed Image ====> 186.Taraxacum_officinale_02_Fr_web_2015_fullsize.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 187.wild-dandelion-recipes-jpg.jpg
Completed Image ====> 188.Pic+Dandelion+Leaf.jpg
Completed Image ====> 189.Dandelions-Harvesting-Health-Benefits-Recipes-683x1024.jpg
Completed Image ====> 190.dandy-31a.jpg
Completed Image ====> 191.08recipehealth_600-articleLarge.jpg
Completed Image ====> 192.Thumb_01.jpg
Completed Image ====> 193.dandelion-timelapse_1024.gif
Completed Image ====> 194.dandelion-1557110__340.jpg
Completed Image ====> 195.Holistic_Dadelion_3840x2160.jpg
Completed Image ====> 196.Dandelions.jpg
Completed Image ====> 197.glass-of-dandelion-mead.jpg
Completed Image ====> 198.1469054896651.jpg
Completed Image ====> 199.dandelion1.jpg
Completed Image ====> 200.970c5432eea14b5988b0c9c3d94e4656.jpg
Completed Image ====> 201.WP_20130506_004-300x225.jpg
Completed Image ====> 202.Fun-with-Dandelions-FB.jpg
Completed Image ====> 203.35405.jpg
Completed Image ====> 204.dandelion1205.jpg
Completed Image ====> 205.CarolinaFalseDandelion_DSC_2728.jpg
Completed Image ====> 206.dandelion_root_leaf_prod.jpeg
Completed Image ====> 207.maxresdefault.jpg
Completed Image ====> 208.dandelion1.jpg
Completed Image ====> 209.dandelion-salad-recipe-taraxacum-officinalis-750x420.png
Completed Image ====> 210.FOR-WEB_Dandelions.jpg
Completed Image ====> 211.abstract-black-dandelion-flying-seeds-260nw-1220847928.jpg
Completed Image ====> 212.how-control-dandelions-1.jpg
Completed Image ====> 213.DandelionFlowersForPost.jpg
Completed Image ====> 214.dandelion-leaves.jpg
Completed Image ====> 215.solitarybeeondandelion.jpg
Completed Image ====> 216.dandelion-taraxacum-officinale-4250938.jpg.webp
Completed Image ====> 217.single-stem-dandelion-artificial-flowers.jpg
Completed Image ====> 218.dandelions-682x1024.png
Completed Image ====> 219.IMG_1712-768x268.jpg
Completed Image ====> 220.Dandelion-1024x768.jpg
Completed Image ====> 221.image_16.jpg
Completed Image ====> 222.hotw-notadandelion3-wild-lettuce-Lactuca-serriola-e1533581057911-300x300.jpg
Completed Image ====> 223.russian_dandelion_rubber_root-01.jpg
Completed Image ====> 224.dandelion_seeds_full.jpg
Completed Image ====> 225.244875.jpg
Completed Image ====> 226.D3916383-6EF5-4803-8B6A-608064271CBA_w250_r0_s.jpg
Completed Image ====> 227.Manuel_Findeis_shutterstock_638530378.jpg
Completed Image ====> 228.dsc_0027.jpg
Completed Image ====> 229.dandelion-yard-harvest-2018-750x563.jpg
Completed Image ====> 230.D7l6ZWLWsAUpcKg.jpg
Completed Image ====> 231.Dandelion-Plant.jpg
Completed Image ====> 232.how-to-get-rid-of-dandelions-1-920x425.jpg
Completed Image ====> 233.ela-henry-dandelion2.jpg
Completed Image ====> 234.157482566-56a47d4e3df78cf77282b010.jpg
Completed Image ====> 235.Dandelion-DNM.jpg
Completed Image ====> 236.DANDELIONS_848x480_1241231939639.jpg
Completed Image ====> 237.dandelion-tea-new-wide.jpeg
Completed Image ====> 238.sow-thistle.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 239.dandelion-flower.jpg
Completed Image ====> 240.taraxacum-officinale-004.jpg
Completed Image ====> 241.dandelion-greens-recipes-salad-1068x713.jpg
Completed Image ====> 242.dandelion-tea-benefits.jpg
Completed Image ====> 243.Greens1_grande.jpg
Completed Image ====> 244.78425884_XS.jpg
Completed Image ====> 245.tenor.gif
Completed Image ====> 246.51hy7xMx0HL._SL500_AC_SS350_.jpg
Completed Image ====> 247.common-dandelion-300px.jpg
Completed Image ====> 248.dandy-21a.jpg
Completed Image ====> 249.dandelion-feature.jpg
Completed Image ====> 250.GettyImages-575385175-dd039eb.jpg
Completed Image ====> 251.Dandelion.jpg
Completed Image ====> 252.dandelion-greens-weeds-950x535.png
Completed Image ====> 253.GettyImages-535804358-5acd2fa6c5542e003619cd9d.jpg
Completed Image ====> 254.20130124-222423.jpg
Completed Image ====> 255.dandelion-puntarelle-salad-header.jpg
Completed Image ====> 256.FEATURED-Best-Dandelion-Killer.jpg
Completed Image ====> 257.20554032-flower-dandelion-white-on-black-background-vector-illustration.jpg
Completed Image ====> 258.lessons-learned-from-the-dandelion-facebook-post.jpg
Completed Image ====> 259.dandelions.jpg
Completed Image ====> 260.95794138-2b59-4778-bac5-04361b868857.jpg
Completed Image ====> 261.dandelion-seeds.jpg
Completed Image ====> 262.dandelion_benefits_article.jpg
Completed Image ====> 263.false-dandelion-poisoning.jpg
Completed Image ====> 264.dandelion-tea-2.jpg
Completed Image ====> 265.dandelion.jpg
Completed Image ====> 266.image.jpg
Completed Image ====> 267.flower_2_750.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 268.33984953915_d19a51a3c0.jpg
Completed Image ====> 269.dandelion-rubber-taraxagum-lab-anklam-764x375.jpg
Completed Image ====> 270.20160507-dandelion.png
Completed Image ====> 271.Dandelion-Greens-Benefits-Nutrition-and-Recipes.jpg
Completed Image ====> 272.Dandelion-Doodle-7.jpg
Completed Image ====> 273.Dandelion-Flower-in-Bloom-700x543.jpg
Completed Image ====> 274.creamy-dandelion-soup-ck-x.jpg
Completed Image ====> 275.bf064e25455239bdfff071b426af008c.jpg
Completed Image ====> 276.dandelion-magnesium-lotion-update-FB-800x419.jpg
Completed Image ====> 277.yellow-dandelion.jpg
Completed Image ====> 278.How-to-Get-Rid-of-Dandelions.jpg
Completed Image ====> 279.dandelion-in-seed.jpg
Completed Image ====> 280.2261.png
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Completed Image ====> 281.blog-featured-dandelion-20171221-1300.jpg
Completed Image ====> 282.dandelion_trueandfalse3.jpg
Completed Image ====> 283.dandelion_pic-200x300_large.jpg
Completed Image ====> 284.Maelkebotte05.jpg
Completed Image ====> 285.Dandelion.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 286.01_dandelion_things-doctors-wish-you-knew-about-using-dandelion-root-for-detox_483980608-eskymaks-760x506.jpg
Completed Image ====> 287.dandelion-vector-background.jpg
Completed Image ====> 288.Dandelion_Summer_2011-II_harvest.jpg
Completed Image ====> 289.521962154-577d12ea5f9b585875b16536.jpg
Completed Image ====> 290.1.jpg
Completed Image ====> 291.78fb14fd-2df1-4d71-a558-7c933957afb5.png
Completed Image ====> 292.Dandelions-health-benefits-Naturimedica.jpg
Completed Image ====> 293.dandelion-seed-Jev7rl3-600.jpg
Completed Image ====> 294.Dandy-beer-sm-765x1024.jpg
Completed Image ====> 295.Dandelions-at-Cottage-Creek.jpg
Completed Image ====> 296.mid_1476817137_dandelion.jpg
Completed Image ====> 297.DandelionTincture.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 298.dandelion-soap-short-pin.jpg
Completed Image ====> 299.mountain_dandelion_lg.jpg
Completed Image ====> 300.36b47bc13eb896724cc1793ab283b26f.jpg
Completed Image ====> 301.Dandelion-jelly-pin2.png
Completed Image ====> 302.Garden-Thugs-and-Bedwetters-How-to-Eat-More-Dandelion.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 303.dandelion_true.jpg
Completed Image ====> 304.dandelion-4228400__340.jpg
Completed Image ====> 305.burkmarr_dandelion_120404_2.JPG
Completed Image ====> 306.Harvesting-Dandelion-Root-Tea-from-Your-Garden.jpg
Completed Image ====> 307.dandelion-recipes.jpg
Completed Image ====> 308.dandelion-greens.jpg
Completed Image ====> 309.Fun-with-Dandelions-Cover.jpg
Completed Image ====> 310.dandelions.jpg
Completed Image ====> 311.dandelion-1311709_1920-678x381.jpg
Completed Image ====> 312.dandelion-jelly-815x1024.jpg
Completed Image ====> 313.flowers_Hawkweed_wiki.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 314.health-benefits-dandelions.png
Completed Image ====> 315.dandelion-680x248.jpg
Completed Image ====> 316.48337e5f4230737fdb3467f22a9d9a6c.jpg
Completed Image ====> 317.dandelion-wall-decal.jpg
Completed Image ====> 318.dandelion.jpg
Completed Image ====> 319.Chicory-Dandelion-Italiko-Rosso-RC106C-LSS-000_5320.jpg
Completed Image ====> 320.header-dandelion.jpg
Completed Image ====> 321.dandelion.jpg
Completed Image ====> 322.8c160acd-1672-4011-a892-1baa844cbe29-2060x1236.jpeg
Completed Image ====> 323.erock3d_dandelions_promo_830_large-900x0.jpg
Completed Image ====> 324.dandelionbasket-300x225.jpg
Completed Image ====> 325.dandelion-seeds-nature-spring-101538.jpeg
Completed Image ====> 326.Pic+Dandelions+on+Table.jpg
Completed Image ====> 327.carolina-false-dandelion-11511-carolinafalsedandelion-dsc-2746.jpg
Completed Image ====> 328.Bircham-dense-dandelions-640.jpg
Completed Image ====> 329.How-To-Harvest-Dandelion-Roots-7-Ways-To-Use-It.jpg
Completed Image ====> 330.dandelion-tea.jpg
Completed Image ====> 331.87685360_XS.jpg
Completed Image ====> 332.1280-687839744-yellow-white-dandelion-macro.jpg
Completed Image ====> 333.5-Weeds-FeaturedImage.png
Completed Image ====> 334.Dandelion-structure-251x300.jpg
Completed Image ====> 335.image_06.jpg
Completed Image ====> 336.taraxacum-officinale-005.jpg
Completed Image ====> 337.6151_IMG02499.JPG
Completed Image ====> 338.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-6.jpg
Completed Image ====> 339.D59VaEvWkAA21CS.jpg
Completed Image ====> 340.dandelion-wine-stefan-steinbauer-107535-unsplash-600x400.jpg
Completed Image ====> 341.kill-dandelion4-e1522653020254.png
Completed Image ====> 342.The-Natural-Health-Benefits-of-Dandelions744.jpg
Completed Image ====> 343.Dandelion-6.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 344.3508699639_7f84f1e059.jpg
Completed Image ====> 345.511353956_1280x720.jpg
Completed Image ====> 346.Dandelion-seed-head.JPG
Completed Image ====> 347.1469056164106.jpg
Completed Image ====> 348.Honey-bee-on-Dandelion.jpg
Completed Image ====> 349.dandelion_full_width.jpg
Completed Image ====> 350.IMG_0366-1.jpg
Completed Image ====> 351.maxresdefault.jpg
Completed Image ====> 352.Using-Dandelions-for-Gift-Giving-for-Image-Hort.jpg
Completed Image ====> 353.487456455.0.jpg
Completed Image ====> 354.DandelionsWeedsx450.jpg
Completed Image ====> 355.dandelion-seeds-close-blowing-blue-260nw-614668772.jpg
Completed Image ====> 356.Dandelion-roots-leaves-and-flowers-are-powerful-superfoods.jpg
Completed Image ====> 357.white-dandelion-closeup-natural-spring-background_78450-189.jpg
Completed Image ====> 358.dandelion-greens-harvest-2018-1-750x478.jpg
Completed Image ====> 359.Dandelion-Infused-Carrier-Oil.jpg
Completed Image ====> 360.common-dandelion-taraxacum-officinale-agg-asteraceae-XD18NA.jpg
Completed Image ====> 361.aid2229943-v4-1200px-Get-Rid-of-Dandelions-in-a-Lawn-Step-12.jpg
Completed Image ====> 362.Radicchio-Italiko-Rossa-dandelion-RC106-LSS-000_6639.jpg
Completed Image ====> 363.seedneeds-dandelion.jpeg
Completed Image ====> 364.Dandelion7-1024x768.jpg
Completed Image ====> 365.dandelions-rev.jpg
Completed Image ====> 366.photo_for_Grandms_Says_large.jpg
Completed Image ====> 367.04_Dandelion_Things-Doctors-Wish-You-Knew-About-Using-Dandelion-Root-for-Detox_617857592-Creative-Family-760x506.jpg
Completed Image ====> 368.1280-687213634-few-yellow-dandelions-flowers-green-leaves.jpg
Completed Image ====> 369.mid_1473552572_dandelion-health-benefits.png
Completed Image ====> 370.how-to-get-rid-of-dandelions.jpg
Completed Image ====> 371.dandelion-4.jpeg
Completed Image ====> 372.Dandelion_Cover_S1illustration-1.jpg
Completed Image ====> 373.dandelions.jpg
Completed Image ====> 374.Dandelion-Mead-2238.jpg
Completed Image ====> 375.5454.jpg
Completed Image ====> 376.d41586-018-07084-8_16206024.jpg
Completed Image ====> 377.Dandelion-fritters.jpg
Completed Image ====> 378.Dandelion.jpg
Completed Image ====> 379.Dandelion-Buds-for-Capers-1.jpg
Completed Image ====> 380.2017-04-05-07.jpg
Completed Image ====> 381.hotw-notadandelion4-lesser-celandine-Ficaria-verna-300x300.jpg
Completed Image ====> 382.Dandelion.png
Completed Image ====> 383.Dandelion_155.jpg
Completed Image ====> 384.dandelion%20seeds%20resize.jpg
Completed Image ====> 385.how-control-dandelions-2.jpg
Completed Image ====> 386.1.-Dandelion-Taraoffi-open-flower.jpg
Completed Image ====> 387.IMG_5207-e1496971515552-1024x1365.jpg
Completed Image ====> 388.Dandelions.jpg
Completed Image ====> 389.4608685970.jpg
Completed Image ====> 390.dandelion-2817950_960_720.jpg
Completed Image ====> 391.dandelion-2.jpg
Completed Image ====> 392.9770-featured_image-dandelion-root-can-help-cancer-patients.jpg
Completed Image ====> 393.Dandelion_[fasciated]_2015_05_02_Adlington_Rivington_Drinking_001p3.jpg
Completed Image ====> 394.dandelion_falseclose.jpg
Completed Image ====> 395.DandelionMeanings5.jpg
Completed Image ====> 396.dandelion-salve-600.jpg
Completed Image ====> 397.dandelion2.jpg
Completed Image ====> 398.a820e7d5a9ccfa10378178542c78b826.jpg
Completed Image ====> 399.220px-Dandelion_greens_for_sale_at_Whole_Foods.jpg
Completed Image ====> 400.dandelion_greens_7.jpg
Completed Image ====> 401.austin-1000.jpg
Completed Image ====> 402.flowers_750.jpg
Completed Image ====> 403.Screen_Shot_2018-08-14_at_10.59.57_AM_1024x1024.png
Completed Image ====> 404.Dandelion-1-1.jpg
Completed Image ====> 405.dandelion2.jpg
Completed Image ====> 406.tenor.gif
Completed Image ====> 407.dandelion1.jpg
Completed Image ====> 408.FWJSJB5JHKUBNMH.LARGE.jpg
Completed Image ====> 409.yellow-dandelion-flowers-with-leaves-green-grass_88211-498.jpg
Completed Image ====> 410.141339732_be1addc651_b.jpg
Completed Image ====> 411.dandelion-flower.jpg
Completed Image ====> 412.Dandelion-0X7A0972.jpg
Completed Image ====> 413.natural-dandelion-killer-p1.jpg
Completed Image ====> 414.Beauty-Dandelion-Flower-Nature-Spring-Summer-4126160.jpg
Completed Image ====> 415.dandelion-products-2.jpg
Completed Image ====> 416.Dandelion11.jpg
Completed Image ====> 417.1-Taraxacum_officinale__Dandelion_.JPG
Completed Image ====> 418.129100129-56a6d33b5f9b58b7d0e4ff0b.jpg
Completed Image ====> 419.CF004390.jpg
Completed Image ====> 420.411aZphlo1L._SL500_AC_SS350_.jpg
Completed Image ====> 421.600x600bf.png
Completed Image ====> 422.diente_leon_taraxacum2.jpeg
Completed Image ====> 423.dandelion-oil-recipe.jpg
Completed Image ====> 424.130862457-56a47d633df78cf77282b064.jpg
Completed Image ====> 425.violet-in-dandelions-2.jpg
Completed Image ====> 426.dandelion.jpg
Completed Image ====> 427.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-3.jpg
Completed Image ====> 428.big_dandelion_leaves.jpg
Completed Image ====> 429.howto-Get-Rid-of-Dandelions.jpg
Completed Image ====> 430.dandelionwhole-225x300.jpg
Completed Image ====> 431.MJR051210Dandelion.jpg
Completed Image ====> 432.Organic-Dandelion-Root-Tea_735x1102-no-text.jpg
Completed Image ====> 433.dandelion-cover-1400x407.jpg
Completed Image ====> 434.dandelions%20large_0.jpg
Completed Image ====> 435.dandelion-bunch.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 436.dandelion-3.jpg
Completed Image ====> 437.How-to-make-tassel-flowers-dandelion-36.jpg
Completed Image ====> 438.D68o0TZU0AE-R1a.jpg
Completed Image ====> 439.dandelionjuice.jpg
Completed Image ====> 440.dandelions-uncurling-with-bee.jpg
Completed Image ====> 441.IMG_5910.JPG
Completed Image ====> 442.image_07.jpg
Completed Image ====> 443.How-to-Make-Dandelion-Wine-with-These-2-Easy-Recipes.jpg
Completed Image ====> 444.dandelion-background-8948.jpg
Completed Image ====> 445.Dandelion-Tea-During-Pregnancy.jpg
Completed Image ====> 446.4559568.jpg
Completed Image ====> 447.maxresdefault.jpg
Completed Image ====> 448.dandelion-400x265.jpg
Completed Image ====> 449.img-crabgrass-control.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 450.dandelionflower.jpg
Completed Image ====> 451.spring-foraging-dandelions.jpg
Completed Image ====> 452.IMG_4782-300x255.jpg
Completed Image ====> 453.dandelion.jpg
Completed Image ====> 454.03358_01_italiko_red.jpg
Completed Image ====> 455.weeds-dandelion-taraxacum-officinale-dock-leaf-rumex-obtusifolius-BAJ7JD.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 456.taraxacum-erythrospermum-25.jpg
Completed Image ====> 457.dandelion-baby.jpg
Completed Image ====> 458.dandelion-madness-wide18.jpg
Completed Image ====> 459.dandelion-800x600.jpg
Completed Image ====> 460.Dandelion-1.jpg
Completed Image ====> 461.dandelion-root-uses-side-effects-benefits-of-dandelion-root-tea-picture-of-dandelion.jpg
Completed Image ====> 462.Dandelion-Green-Smoothie.jpg
Completed Image ====> 463.Radicchio-Italiko-Rossa-dandelion-RC106-LSS-000_66421.jpg
Completed Image ====> 464.71100863.jpg
Completed Image ====> 465.Featured-images-dandelion-salve.png
Completed Image ====> 466.dandelion-field2.jpg
Completed Image ====> 467.3+Pick+dandelions+to+make+a+crown.JPG
Completed Image ====> 468.dandelions.jpg
Completed Image ====> 469.common-dandelion.gif
Completed Image ====> 470.pexels-photo-54300.jpeg
Completed Image ====> 471.dandelion-coffee-710x473.jpg
Completed Image ====> 472.fotolia_7485888_XS.jpg
Completed Image ====> 473.dandelion.jpg
Completed Image ====> 474.3.-Dandelion-all-seeds-ripe-past-mid-bloom.jpg
Completed Image ====> 475.Cats-ear1-996x1024.jpg
Completed Image ====> 476.tumblr_pj49mhW3na1rf9609_540.jpg
Completed Image ====> 477.Dandelion.jpg
Completed Image ====> 478.b05141.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 479.KMA_Cumber_030511_0104.jpg
Completed Image ====> 480.taraxacum-officinale.jpg
Completed Image ====> 481.dandelion_catsearclose.jpg
Completed Image ====> 482.dandelion_root_1.png
Completed Image ====> 483.5b9ee04e2200005600da32c9.jpeg
Completed Image ====> 484.kuva4564.jpg
Completed Image ====> 485.Dandelion-5.jpg
Completed Image ====> 486.dandelion-seeds-1.jpg
Completed Image ====> 487.make-dandelion-pesto.jpg
Completed Image ====> 488.Dandy.jpg
Completed Image ====> 489.1280-685976962-landscape-with-white-dandelions.jpg
Completed Image ====> 490.dandelion-root-vs-leaf.jpg
Completed Image ====> 491.product_Dandelion-Root.jpg
Completed Image ====> 492.productlifestyle_herbal_DandelionLeafRoot.03.jpg
Completed Image ====> 493.dandelion.jpg
Completed Image ====> 494.Dandelion-Salad_exps8314CW143041D01_09_2b_RMS-696x696.jpg
Completed Image ====> 495.Making-and-Using-Dandelion-Oil-harvest.jpg
Completed Image ====> 496.5566871810_9d6a6c31f9.jpg
Completed Image ====> 497.dandelion.jpg
Completed Image ====> 498.common-dandelion-11475-p1050689.jpg
Completed Image ====> 499.1264555489_08aeda6936_b.jpg
Completed Image ====> 500.dandelion.jpg
Completed Image ====> 501.pr_dandelion3.jpg
Completed Image ====> 502.b588d853274f473be15b774715e5d368.jpg
Completed Image ====> 503.323710_256.jpg
Completed Image ====> 504.picking-dandelions.jpg
Completed Image ====> 505.common-dandelion.jpg
Completed Image ====> 506.dandelion_plant.jpg
Completed Image ====> 507.dandelion-seeds-before-wind.jpg
Completed Image ====> 508.7184130_orig.jpeg
Completed Image ====> 509.DandelionMeaning.jpg
Completed Image ====> 510.Pet-Safe-Dandelion-Killer.jpg
Completed Image ====> 511.dandelion-greens-nutrition-facts.jpg
Completed Image ====> 512.d72ce06565df4294117f1a7e580361e1.png
Completed Image ====> 513.dandelion.jpg
Completed Image ====> 514.front-5-1-of-1.jpg
Completed Image ====> 515.flower_3_750.jpg
Completed Image ====> 516.close-blooming-yellow-dandelion-flowers-260nw-586117580.jpg
Completed Image ====> 517.95ce9f089c3f15129c4c1549997bca3a.jpg
Completed Image ====> 518.dendy-5a7a44538e1b6e00374b0bd2.jpg
Completed Image ====> 519.the-fascination-of-the-dandelion-4214388__340.jpg
Completed Image ====> 520.dandelion-pollinators.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 521.tg-03052017-dandelions_large.jpg
Completed Image ====> 522.dandelion-tea-min-ef607fdada.jpg
Completed Image ====> 523.Dandelion-Tea-for-health.jpg
Completed Image ====> 524.hotw-dandelion4-300x300.jpg
Completed Image ====> 525.dandelion-40436_186x186.jpg
Completed Image ====> 526.DandelionCloseup2_1024x1024.jpg
Completed Image ====> 527.Dandelion-bud.jpg
Completed Image ====> 528.yellow-dandelions.jpg
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Completed Image ====> 529.Dandelions.jpg
Completed Image ====> 530.maxresdefault.jpg
Completed Image ====> 531.photo4.jpg
Completed Image ====> 532.dandelion-vinegar-top.jpg
Completed Image ====> 533.set-realistic-images-yellow-white-dandelion-flowers-with-leaves-different-stages-flowering-isolated_1284-20369.jpg
Completed Image ====> 534.Dandelion_seeds.jpg
Completed Image ====> 535.dandelion-root-cures-cancer-14.jpg
Completed Image ====> 536.image_18.jpg
Completed Image ====> 537.tumblr_pj49mfNZpS1rf9609_540.jpg
Completed Image ====> 538.tenor.gif
Completed Image ====> 539.D5ul7YwWwAAmDQ3.jpg
Completed Image ====> 540.dandelion%20black%20011814.jpg
Completed Image ====> 541.35407.jpg
Completed Image ====> 542.dandelion-greens-0201.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 543.220px-Danedlion_Maria_Sibylla_Merian.png
Completed Image ====> 544.Pic+Dandelion+seeds.jpg
Completed Image ====> 545.b9c34c540c2eb313518e98c69ebe541a.jpg
Completed Image ====> 546.How-to-make-tassel-flowers-dandelion-28.jpg
Completed Image ====> 547.taraxacum-officinale-erythrospermum-leaves.jpg
Completed Image ====> 548.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-5.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 549.Dandelion%20and%20Rabbits.jpg
Completed Image ====> 550.4B23ACC2-6259-4728-ABCB-9F5BA2BFF115_w408_r1_s.jpg
Completed Image ====> 551.DandelionNoFlower_JENKS266.png
Completed Image ====> 552.Dandelion-8-1.jpg
Completed Image ====> 553.1200-39502840-closeup-view-of-dandelion.jpg
Completed Image ====> 554.dandelion+taproot.jpg
Completed Image ====> 555.flower-flight-seeds-air-705187.jpeg
Completed Image ====> 556.Dandelion-Leaves-in-Spinner.jpg
Completed Image ====> 557.large.jpg
Completed Image ====> 558.23327027036_aafb55e8d5.jpg
Completed Image ====> 559.Dandelion-Magnesium-Lotion-Updated-Pin-2.jpg
Completed Image ====> 560.dandelion-sketch-drawing-2.jpg
Completed Image ====> 561.Dandelion-2.jpg
Completed Image ====> 562.Zadiraka_Evgenii_shutterstock_428696311.jpg
Completed Image ====> 563.Radicchio-Italiko-Rossa-dandelion-RC106-LSS-000_6640.jpg
Completed Image ====> 564.carolina-false-dandelion-11511-carolinafalsedandelion-dsc-2749.jpg
Completed Image ====> 565.DSCN8514.jpg
Completed Image ====> 566.dandelion-47.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 567.dandelion_ed_sm.jpg
Completed Image ====> 568.775759.jpg
Completed Image ====> 569.Dandelion-Roots-and-Greens.jpg
Completed Image ====> 570.common-dandelion-dandelion-flower-bud-56896.jpeg
Completed Image ====> 571.dandelion3.jpg
Completed Image ====> 572.field-spring-grass-green-yellow-dandelion-flower-nature-plant-switzerland-flora-XE9W9X.jpg
Completed Image ====> 573.italian_dandelion_bn.jpg
Completed Image ====> 574.dandelion-seed.jpg
Completed Image ====> 575.Dandelion8-813x1024.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 576.KMA_Cumber_030511_0101.jpg
Completed Image ====> 577.dandelion-flowers.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 578.dandelion-bloom-big-56a586013df78cf77288b0e4.jpg
Completed Image ====> 579.HalfSeeded-Dandelion.jpg
Completed Image ====> 580.dandelion-flower-4000x2667-florets-blue-sky-4k-4837.jpg
Completed Image ====> 581.dandelion_and_me.jpg
Completed Image ====> 582.35466.jpg
Completed Image ====> 583.105663996_XS.jpg
Completed Image ====> 584.8af259449855a9de879e32130dfc6cea--dandelion-recipes-tea-recipes.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 585.giphy.gif
Completed Image ====> 586.434711.jpg
Completed Image ====> 587.image_17.jpg
Completed Image ====> 588.dandelion-3416140__340.jpg
Completed Image ====> 589.xdandelions_03.jpg
Completed Image ====> 590.dandelion-lookalike-300x225.jpg
Completed Image ====> 591.D5ul8kLWAAERGVa.jpg
Completed Image ====> 592.taraxacum-erythrospermum-36-2.jpg
Completed Image ====> 593.hqdefault.jpg
Completed Image ====> 594.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-Dandelion-Common-Taraxacum-Officinale-1-Names-left-to-right-1.jpg
Completed Image ====> 595.dandelion-260nw-705892267.jpg
Completed Image ====> 596.hotw-notadandelion2-hawkweed-Hieracium-sp-e1533580997451-300x300.jpg
Completed Image ====> 597.1280-683362620-dandelions-in-the-meadow.jpg
Completed Image ====> 598.dandelion-jelly-recipe.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 599.Dandelion_258756.jpg
Completed Image ====> 600.dandy-fritters-4.jpg
Completed Image ====> 601.29644459615_67c226b51c.jpg
Completed Image ====> 602.Dandelion5-768x1024.jpg
Completed Image ====> 603.Dandelions-600x469.jpg
Completed Image ====> 604.a-wild-dandelion-flower-growing-in-a-field-of-herbal-lavender-plants-M1NF68.jpg
Completed Image ====> 605.dandelion-cultivated.jpg
Completed Image ====> 606.02634_01_clio.jpg
Completed Image ====> 607.common-dandelion-11475-p1050600.jpg
Completed Image ====> 608.pexels-photo-289323.jpeg
Completed Image ====> 609.dandelionleaf-300x268.jpg
Completed Image ====> 610.image_20.jpg
Completed Image ====> 611.dandelion-3381676__340.jpg
Completed Image ====> 612.taraxacum-officinale-3.jpg
Completed Image ====> 613.Dandelions-in-a-basket.jpg
Completed Image ====> 614.f2466aa07c857ea6ff2a4c1a737bc803--dandelion-clock-dandelion-seeds.jpg
Completed Image ====> 615.woman-blowing-on-dandelion-muted-260nw-159554021.jpg
Completed Image ====> 616.dandelion-leaf.jpg
Completed Image ====> 617.35408.jpg
Completed Image ====> 618.dandelions.jpg
Completed Image ====> 619.78493247_XS.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 620.hqdefault.jpg
Completed Image ====> 621.dandy-fritters-6.jpg
Completed Image ====> 622.hotw-notadandelion1-cats-ear-Hypochaeris-radicata-300x300.jpg
Completed Image ====> 623.Dandelion2-768x1024.jpg
Completed Image ====> 624.D5ul9FPWAAExe88.jpg
Completed Image ====> 625.a-crop-of-yellow-dandelion-wildflowers-seen-in-bloom-along-a-country-lane-during-spring-in-the-midwest-MP2FHF.jpg
Completed Image ====> 626.cats-ear-dandelion-11666-catseardandelion-dsc-0943.jpg
Completed Image ====> 627.1280-655540010-dandelions-in-meadow.jpg
Completed Image ====> 628.image_09.jpg
Completed Image ====> 629.d0a8a5846634d3916ea064ec1ac299e7.jpg
Completed Image ====> 630.dandelion-soap-with-flowers.jpg
Completed Image ====> 631.vector-dandelion-flying-seeds-on-260nw-600709604.jpg
Completed Image ====> 632.dandelion-sky-flower-nature-39669.jpeg
Completed Image ====> 633.Cats-ear-and-dandelion.jpg
Completed Image ====> 634.bumblebee-dandelion-01.jpg
Completed Image ====> 635.taraxacum-erythrospermum-26.jpg
Completed Image ====> 636.dandelion-808255__340.jpg
Completed Image ====> 637.hqdefault.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 638.dandelion-root-2-710x556.jpg
Completed Image ====> 639.dandelion-roots.jpg
Completed Image ====> 640.common-dandelion-11475-p1050186.jpg
Completed Image ====> 641.image_19.jpg
Completed Image ====> 642.cd54390321e2aaf9c38a8f31ebecfc80--dandelion-painting-creative-art.jpg
Completed Image ====> 643.meadow-dandelions-on-sunny-day-260nw-1080645086.jpg
Completed Image ====> 644.dandelion-recipes-short-pin.jpg
Completed Image ====> 645.Cats-ear4-1024x968.jpg
Completed Image ====> 646.AdobeStock_206345546.jpg
Completed Image ====> 647.dandelion-142969__340.jpg
Completed Image ====> 648.common-dandelion-11475-crown.jpg
Completed Image ====> 649.dandelion-infestation.jpg
Completed Image ====> 650.17fba7eedcc069e1843e0b730f27c4d6--iphone-wallpaper-quotes-phone-backgrounds.jpg
Completed Image ====> 651.blowing-dandelion-seeds-white-background-260nw-1110414380.jpg
Completed Image ====> 652.Thumb_02.jpg
Completed Image ====> 653.Dandelion1-1024x768.jpg
Completed Image ====> 654.dandelion-mead-2.jpg
Completed Image ====> 655.hqdefault.jpg
Completed Image ====> 656.dandelion-445228__340.jpg
Completed Image ====> 657.carolina-false-dandelion-11511-carolinafalsedandelion-dsc-2759.jpg
Completed Image ====> 658.c28d5f9dd784f5a5fe3d4be50b42fea3.jpg
Completed Image ====> 659.closeup-dandelion-on-natural-background-260nw-282705149.jpg
Completed Image ====> 660.dandelion-control.jpg
Completed Image ====> 661.Cats-ear5-1024x768.jpg
Completed Image ====> 662.maxresdefault.jpg
Completed Image ====> 663.field_CarolinaFalseDandelion_plan_nc.jpg
Completed Image ====> 664.13309c9c828345aa1787e915522b0c98.jpg
Completed Image ====> 665.dandelion-flower-on-white-background-260nw-626460182.jpg
Completed Image ====> 666.image_01.jpg
Completed Image ====> 667.Dandelion6-882x1024.jpg
Completed Image ====> 668.common-dandelion-11475-crown2.jpg
Completed Image ====> 669.maxresdefault.jpg
Completed Image ====> 670.530255bf511721d0deb0432fb73b2834.jpg
Completed Image ====> 671.9f9ec10577b1098067c833188e86e64f--precious-children-beautiful-children.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 671 is all we got for this search filter!

Errors: 34

Cat's Ear

keywords["keywords"] = "cat's ear weed"
cats_ear_paths = google_images.download(keywords)

Item no.: 1 --> Item name = cat's ear weed
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.cats-ear-a.jpg
Completed Image ====> 2.hypochaerisleaves_bl.jpg
Completed Image ====> 3.commoncatsear4.jpg
Completed Image ====> 4.commoncatsear5.jpg
Completed Image ====> 5.catsear-root.jpg
Completed Image ====> 6.weeds2.jpg
Completed Image ====> 7.catsear%20N1.jpg
Completed Image ====> 8.cats-ear-dandelion-11666-weed5.jpg
Completed Image ====> 9.catsear-d.jpg
Completed Image ====> 10.cats-ear-400x267.jpg
Completed Image ====> 11.cats-ear-400x299.jpg
Completed Image ====> 12.0910catsearwhole3.jpg
Completed Image ====> 13.hqdefault.jpg
Completed Image ====> 14.cats-ear-dandelion-11666-weeds.jpg
Completed Image ====> 15.common_catsear_leaves.gif
Completed Image ====> 16.commoncatsear3.jpg
Completed Image ====> 17.hypochaerisradicata24.jpg
Completed Image ====> 18.Hairy_Catsear004_Forest_Kim_Starr_StarrEnvironmental_bugwood.org.jpg
Completed Image ====> 19.cats-ear-dandelion-11666-weed3.jpg
Completed Image ====> 20.catsear.jpg
Completed Image ====> 21.cats-ear-dandelion-11666-weeds2.jpg
Completed Image ====> 22.A-large-common-catsear-plant-665x509.jpg
Completed Image ====> 23.Catsear-Eat-Medicinally.jpg
Completed Image ====> 24.hypochaerisradicata12.jpg
Completed Image ====> 25.hairy-cats-ear.jpg
Completed Image ====> 26.cats-ear-weed.jpg
Completed Image ====> 27.radicata3a.jpg
Completed Image ====> 28.cats-ear-common-hypochoeris-radicata-miw251235-X3H67K.jpg
Completed Image ====> 29.1hairycatsear.jpg
Completed Image ====> 30.flatweed%20leaves%20N2.jpg
Completed Image ====> 31.Hypochaeris%2Bradicata%2BCats%2BEar%2BLawn%2BWeed.JPG
Completed Image ====> 32.hryra456w.jpg
Completed Image ====> 33.commoncatsear6.jpg
Completed Image ====> 34.hypochaeris-radicata-flat-weed-catsear-450w-401971948.jpg
Completed Image ====> 35.IMG_3733-800x600.jpg
Completed Image ====> 36.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-1.jpg
Completed Image ====> 37.1-cats-ear-bcfarmsandfood.jpg
Completed Image ====> 38.cats-ear-dandelion-11666-weed4.jpg
Completed Image ====> 39.21fbdef630731afef86dc698ccdc5359.jpg
Completed Image ====> 40.3f6214d352afd3ae4f0690701af56a51--small-white-flowers-root-system.jpg
Completed Image ====> 41.cats-ear-dandelion-11666-p1060807-catseardandelion.jpg
Completed Image ====> 42.Smoothcatsear.jpg
Completed Image ====> 43.cats_ear_young_rosette.jpg
Completed Image ====> 44.6971204959_edc5453fb0.jpg
Completed Image ====> 45.hairy-wild-lettuce-weed-hypochoeris-radicata-l-spotted-cat-s-ear-growing-field-originated-europe-widely-spread-36599587.jpg
Completed Image ====> 46.weed-cats-ear-1.jpg
Completed Image ====> 47.Cat%27s_Ear_03_0.jpg
Completed Image ====> 48.8d568cf5b869971da7b8cd25bc56bb2b--lawn-turf-seeded.jpg
Completed Image ====> 49.depositphotos_169837052-stock-photo-cats-ear-weed.jpg
Completed Image ====> 50.Hairy_Catsear001_OhioStateUniv_bugwood.org.jpg
Completed Image ====> 51.Catsear.jpg
Completed Image ====> 52.cats-ear.jpg
Completed Image ====> 53.dandelions-696x389.jpg
IOError on an image...trying next one... Error: [Errno 104] Connection reset by peer
Completed Image ====> 54.22494268149_babe30dbdf.jpg
Completed Image ====> 55.avopix-401971945.jpg
Completed Image ====> 56.cats-ear-dandelion-11666-catseardandelion2.jpg
Completed Image ====> 57.220px-Hypochaeris_radicata_3285.JPG
Completed Image ====> 58.6dfedb655a994e9ba06853e5bec5710d--purple-flowers-weed.jpg
Completed Image ====> 59.hypochaeris-radicata-cats-ear-weed-F0W6JC.jpg
Completed Image ====> 60.hypochaerisradicata30.jpg
Completed Image ====> 61.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-Dandelion-Common-Taraxacum-Officinale-1-Names-left-to-right-1.jpg
Completed Image ====> 62.7968ae66dca9b2dce70683ffc502b3b079208cb5_hypochaeris-radicata-855538_1920.jpg
Completed Image ====> 63.yellow-flower-surrounding-green-leafs-450w-772058455.jpg
Completed Image ====> 64.cats-ear-weed-Hypochaeris-radicata.png
Completed Image ====> 65.Hypochoeris%20radica%20FOM%201204%20plant.JPG
Completed Image ====> 66.6971201505_4597311f45.jpg
Completed Image ====> 67.stock-photo-hypochaeris-radicata-flat-weed-cat-s-ear-spotted-cat-s-ear-rosetted-annual-herb-leaves-rough-401971933.jpg
Completed Image ====> 68.Hypochaeris-radicata_5524931_Rob-Routledge-Custom.jpg
Completed Image ====> 69.e40db66802af5867cb31ec3ba3b1e3af--wild-geranium-garden-weeds.jpg
Completed Image ====> 70.Hypochoeris%20radicata%20FOM%201204%20base%20fl%20stem.JPG
Completed Image ====> 71.Cats-Ear-weed.jpg
Completed Image ====> 72.resizedflora2new.jpg
Completed Image ====> 73.hypochaerisradicata18.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 74.cats-ear-common-hypochoeris-radicata-miw251235-GGJE6F.jpg
Completed Image ====> 75.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-2.jpg
Completed Image ====> 76.cats_ear_hairy_leaves.jpg
Completed Image ====> 77.Spotted_catsear--Hypochaeris_radicata--m.s.jpg
Completed Image ====> 78.206b27b09c92e64a11fe9fb07f9f6f30--bad-bad-cat-ears.jpg
Completed Image ====> 79.Hairy_Catsear003_BMacDonald_SaultCollege_bugwood.org.jpg
Completed Image ====> 80.Catsear.jpg
Completed Image ====> 81.flat-broad-leaf-weeds-1-la.jpg
Completed Image ====> 82.salad2ee612.jpg
Completed Image ====> 83.il_794xN.1433296245_tbjj.jpg
Completed Image ====> 84.Catsear-Leaf-e1526729175371-1024x474.jpg
Completed Image ====> 85.Catsear-400x533.jpg
Completed Image ====> 86.bishops-weed-poisoning.jpg
Completed Image ====> 87.Hypochaeris-radicata_1555100_Ohio-State-Weed-Lab.jpg
Completed Image ====> 88.cats-ear-dandelion-11666-catseardandelion-dsc-0852.jpg
Completed Image ====> 89.stock-photo-flatweed-aka-catsear-or-hairy-cats-air-the-plant-is-an-invasive-weed-and-commonly-found-in-lawns-1405386989.jpg
Completed Image ====> 90.220px-Hypochaeris.radicata.Alan.JPG
Completed Image ====> 91.7594b2248e5c277a2432cb10a4367d26--erecta-perennial.jpg
Completed Image ====> 92.big_catsear20002.JPG
Completed Image ====> 93.cats-ear-2.jpg
Completed Image ====> 94.glaucous_goosefoot_plant.jpg
Completed Image ====> 95.cats-ear-flower-P582XH.jpg
Completed Image ====> 96.hqdefault.jpg
Completed Image ====> 97.il_794xN.1169788393_4i7s.jpg
Completed Image ====> 98.hypochaeris-radicata-flat-weed-catsear-450w-401971930.jpg
Completed Image ====> 99.foodanddrink_flavor1-1-7e214cd899f0f8fe.jpg
Completed Image ====> 100.hairy-cats-ear.jpg
Completed Image ====> 101.Cats-ear-Dandelion.jpg
Completed Image ====> 102.catsear-800x600.jpg
Completed Image ====> 103.cats-ear-flowers.jpg
Completed Image ====> 104.flatweed%20stems%20N2.jpg
Completed Image ====> 105.man-picking-out-hairy-cat-ear-yard-doing-work-wild-weed-name-weed-93068245.jpg
Completed Image ====> 106.cats-ear-picture.png
Completed Image ====> 107.Cats_Ear_400.jpg
Completed Image ====> 108.sjm-l-foraging-08xx-3.jpg
Completed Image ====> 109.catsear-f.jpg
Completed Image ====> 110.Marijuana-plant-1062908_1920-588a59853df78caebc1562c3.jpg
Completed Image ====> 111.Hairy_Catsear002_OhioStateUniv_bugwood.org.jpg
Completed Image ====> 112.220px-Hypochaeris_radicata_3294.JPG
Completed Image ====> 113.53270f55f3affe0d9b731603d710878e--plantago-garden-weeds.jpg
Completed Image ====> 114.dandelions-1.jpg
Completed Image ====> 115.catsear+1.JPG
Completed Image ====> 116.tall-yellow-flowers-weed-spring-print-special-prints-only-limited-time-only-tall-green-weed-yellow-flowers.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 117.Cat%27s_Ear_04_0.jpg
Completed Image ====> 118.image003.jpg
Completed Image ====> 119.spotted-cats-ear-hypochaeris-radicata-_0394-small.jpg
Completed Image ====> 120.Flat_weed_%283148973339%29.jpg
Completed Image ====> 121.hairy-cats-ear-2.jpg
Completed Image ====> 122.SUBU-UrbanForaging-HairyCatsEar.jpg
Completed Image ====> 123.cats-ear-seed-head-P5828X.jpg
Completed Image ====> 124.il_794xN.1123180936_2153.jpg
Completed Image ====> 125.1c5907_04c2da8055f14522bfd4ba2219f71cbf_mv2_1024x768.png
Completed Image ====> 126.wicker-img-115.jpg
Completed Image ====> 127.hyrad3.jpg
Completed Image ====> 128.stock-photo-common-hypochaeris-radicata-rough-catsear-hairy-dandelion-with-small-yellow-rosette-flowers-is-449030662.jpg
Completed Image ====> 129.180921-urban-foraging-edible-weeds-Common-Cats-Ear-350x467.jpg
Completed Image ====> 130.hyrad0.jpg
Completed Image ====> 131.hypochaerisradicata33.jpg
Completed Image ====> 132.cats-ears-rosette1.jpg
Completed Image ====> 133.more-early-spring-weeds-024.jpg
Completed Image ====> 134.hryar0866w.jpg
Completed Image ====> 135.cats-ear-leaf.jpg
Completed Image ====> 136.22872980622_f2143c35a5.jpg
Completed Image ====> 137.Cats-Ear.jpg
Completed Image ====> 138.catsear.jpg
Completed Image ====> 139.catsear.jpg
Completed Image ====> 140.fi-cats-ear-400x250.jpg
Completed Image ====> 141.catsear_sm.jpg
Completed Image ====> 142.9a5dc2821d4819d8450d5cdec70b40ec--white-flowers-weed.jpg
Completed Image ====> 143.common-cats-ear-flowers-hypochaeris-radicata-growing-on-a-road-near-B8KCYY.jpg
Completed Image ====> 144.Cat%27s_Ear_02_0.jpg
Completed Image ====> 145.Jolt-Bottle-10L.jpg
Completed Image ====> 146.stock-photo-hypochaeris-radicata-flat-weed-cat-s-ear-spotted-cat-s-ear-rosetted-annual-herb-leaves-rough-401971939.jpg
Completed Image ====> 147.cats-ear-dandelion-11666-catseardandelion-dsc-0943.jpg
Completed Image ====> 148.rgh_catear1.jpg
Completed Image ====> 149.57262993_1833695570063461_5251219451713260277_n.jpg
Completed Image ====> 150.cats-ears-flowers.jpg
Completed Image ====> 151.weed17.JPG
Completed Image ====> 152.hypochaeris_radicata.jpg
Completed Image ====> 153.180921-urban-foraging-edible-weeds-Bristly-Oxtongue-700x525.jpg
Completed Image ====> 154.leaveshairy.jpg
Completed Image ====> 155.Cats-Ear-Dandelion-300x225.jpeg
Completed Image ====> 156.1555112.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 157.very-tall-yellow-flowers-cats-ears-flowering-in-the-yard-tall-yellow-flowers-uk.jpg
Completed Image ====> 158.c06340.jpg
Completed Image ====> 159.stock-photo-cat-s-ears-weed-blooming-1365578216.jpg
Completed Image ====> 160.Cat%2527s+Ear+Hypochaeris+radicata.JPG
Completed Image ====> 161.Capeweed.jpg
Completed Image ====> 162.Sonchus_oleraceus.CA.1.jpg
Completed Image ====> 163.e552a1409669b3da20115d918169fdae---day-blue-flowers.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 164.61161833_319462918969475_1265022715123205547_n.jpg
Completed Image ====> 165.catsear4-25b-500x500.jpg
Completed Image ====> 166.Catsear-Weed-Source-Macleay-Grass-Man-600x600.jpg
Completed Image ====> 167.purslane1-150x150.jpg
Completed Image ====> 168.CatsearDandelion.jpg
Completed Image ====> 169.hygla3.jpg
Completed Image ====> 170.dune-grass-with-cats-ear-flower-weed-aberdovey-wales-A38949.jpg
Completed Image ====> 171.13613.jpg
Completed Image ====> 172.A-weed-tea-in-the-garden-as-a-cold-sets-in.jpg
Completed Image ====> 173.il_794xN.1123137668_ab0a.jpg
Completed Image ====> 174.cats_ear_flower_involucre.jpg
Completed Image ====> 175.city-dandelions_main.jpg
Completed Image ====> 176.tree-white-sweet-flower-animal-cute-looking-bush-pet-fur-portrait-young-green-fluffy-kitten-cat-sitting-feline-mammal-garden-fauna-eyes-whiskers-kitty-furry-ears-vertebrate-weeds-domestic-adorable-small-to-medium-sized-cats-cat-like-mammal-domestic-short-haired-cat-778591.jpg
Completed Image ====> 177.cats-ear-p1.jpg
Completed Image ====> 178.resizedcats-ear.jpg
Completed Image ====> 179.Hypochoeris%20radica%20FOM%200105%20flower%20n%20seed.JPG
Completed Image ====> 180.hypochaerisradicata28.jpg
Completed Image ====> 181.weed_sowthistle.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 182.cats_ear_20-2-2018.JPG
Completed Image ====> 183.catsear-c.jpg
Completed Image ====> 184.Hypochaeris-radicata_1553145_Theodore-Webster.jpg
Completed Image ====> 185.Erodium_cicutarium.jpg
Completed Image ====> 186.Cats-Ear-MagicZoom.jpg
Completed Image ====> 187.mixed-weeds450.jpg
Completed Image ====> 188.cats-ear-leaves.jpg
Completed Image ====> 189.Cats-Ear.jpg
Completed Image ====> 190.white-evil-cat-dirt-weeds-background-looking-walks-to-camera-fur-body-short-darker-hair-head-ears-blue-eyes-mouth-107341620.jpg
Completed Image ====> 191.tall-yellow-flowers-plant-yellow-flowers-stock-photos-tall-yellow-flowers-tall-yellow-flower-weed-mullein.jpg
Completed Image ====> 192.Chamberbitter.jpg
Completed Image ====> 193.18342238_10210932305478001_2194864223501874184_n-2.jpg
Completed Image ====> 194.cats_ear.jpg
Completed Image ====> 195.Hypochoeris%20radicata%20leaf1.JPG
Completed Image ====> 196.hryar3172w.jpg
Completed Image ====> 197.CATSEAR.jpeg
Completed Image ====> 198.cats_ear_30-7-2017.JPG
Completed Image ====> 199.51Dl1xkwsFL._SX466_.jpg
Completed Image ====> 200.1493844821307.jpg
Completed Image ====> 201.catsear-flowers.jpg
Completed Image ====> 202.yellow-flower-weed-bright-yellow-flowers-have-five-petals-prolific-seed-producer-pods-will-scatter-seed-for-several-feet-when-touched-yellow-flower-weed-georgia.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 203.2167069%20Bindii%20weed_1_0.jpg
Completed Image ====> 204.catsear02.jpg
Completed Image ====> 205.cats_ear_plants.jpg
Completed Image ====> 206.Cats-Ear-2000x500.jpg
Completed Image ====> 207.hygla0.jpg
Completed Image ====> 208.Hypochaeris_glabra.CA.1.jpg
Completed Image ====> 209.Wintergrass.jpg
Completed Image ====> 210.common-plantain-bcfarmsandfood-350.jpg
Completed Image ====> 211.catsear_weed.jpg
Completed Image ====> 212.sjm-l-foraging-08xx-2.jpg
Completed Image ====> 213.20111209_0399.jpg
Completed Image ====> 214.HypochoerisRadicata2.jpg
Completed Image ====> 215.cats-ear.jpg
Completed Image ====> 216.flatweed-aka-catsear-hairy-cats-260nw-1407002897.jpg
Completed Image ====> 217.dandelion-leaves1-150x150.jpg
Completed Image ====> 218.1555110.jpg
Completed Image ====> 219.lampu4-25b.jpg
Completed Image ====> 220.stock-photo-flowers-on-the-meadow-455171974.jpg
Completed Image ====> 221.dandelion-lookalike-300x225.jpg
Completed Image ====> 222.weedy-herb-garden-pre-vinegar-530x398.jpg
Completed Image ====> 223.Hawkbit-MagicZoom.jpg
Completed Image ====> 224.weedsdangeroustopets1.png
Completed Image ====> 225.mouse-ear-chickweed-identification-uk.png
Completed Image ====> 226.51kp43W4s7L._UX385_.jpg
Completed Image ====> 227.pc1.jpg
Completed Image ====> 228.Philip-Stark-collects-wild-greens-in-a-bowl-900x600.jpeg
Completed Image ====> 229.adorable-animal-cat-1049260.jpg
Completed Image ====> 230.dandelion-for-parrots.jpg
Completed Image ====> 231.87617533.jpg
Completed Image ====> 232.paleo1549d8.jpg
Completed Image ====> 233.22468103028_b936aee910.jpg
Completed Image ====> 234.cats-ears-rosette2.jpg
Completed Image ====> 235.1408532.large.jpg
Completed Image ====> 236.20141005_083252.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 237.1-Agrostemma_githago-001.JPG
Completed Image ====> 238.cats-ear-dandelion-11666-rosette.jpg
Completed Image ====> 239.hypochoerisglabra3.jpg
Completed Image ====> 240.broadsword_1200x1200.jpg
Completed Image ====> 241.American-Burnweed-300x225.jpeg
Completed Image ====> 242.Cat%27s_Ear_01_0.jpg
Completed Image ====> 243.sweet_vernal_grass_mix.jpg
Completed Image ====> 244.cats_ear_flower.jpg
Completed Image ====> 245.purple-deadnettle2-bcfarmsandfood-350.jpg
Completed Image ====> 246.avopix-401971936.jpg
Completed Image ====> 247.hyrad5.jpg
Completed Image ====> 248.Sonchus_oleraceus.CA.5.jpg
Completed Image ====> 249.IMG_5626.jpg
Completed Image ====> 250.cats-ear-flower.jpg
Completed Image ====> 251.hryar1076w.jpg
Completed Image ====> 252.White-Clover-MagicZoom.jpg
Completed Image ====> 253.tiny_weed_rosette_30-7-2018.JPG
Completed Image ====> 254.Weeds.png
Completed Image ====> 255.Catsear-1-Turf-Finder.jpg
Completed Image ====> 256.450px-Conyza_canadensis_5.jpg
Completed Image ====> 257.catsear11.jpg
Completed Image ====> 258.50780572_2184030598357710_2118009451204679055_n.jpg
Completed Image ====> 259.cats%2Bear%2B7583.jpg
Completed Image ====> 260.dandelion-150x150.jpg
Completed Image ====> 261.weed-dandelion-yellow.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 262.61gTJ2OEnLL._UX679_.jpg
Completed Image ====> 263.prickly-lettuce-bouquet.jpg
Completed Image ====> 264.catsear-b.jpg
Completed Image ====> 265.IKdvqQIAStyaS8GFLgUV_20180925_170436_medium.jpg
Completed Image ====> 266.180921-urban-foraging-edible-weeds-top1-1200x800.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 267.bindii-lawn-weeds-2-copy.jpg
Completed Image ====> 268.foxglove.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 269.cannabis-pets-cbd-plant-boulder-holistic.jpg
Completed Image ====> 270.mallowedibleweeds.jpg
Completed Image ====> 271.cudweed.jpg
Completed Image ====> 272.55855669_801504030226629_90144045439261161_n.jpg
Completed Image ====> 273.2-dandelion-bcfarmsandfood-600x450.jpg
Completed Image ====> 274.165wh.jpg
Completed Image ====> 275.Dandelion-False-Hairy-Cats-Ear-Hypochaeris-Radicata-4.jpg
Completed Image ====> 276.catsear_smooth3b.jpg
Completed Image ====> 277.hyrad6.jpg
Completed Image ====> 278.APratt2-107-1.jpg
Completed Image ====> 279.elephant-ear-poison-225x300.jpg
Completed Image ====> 280.get-rid-cats-dogs-marijuana.jpg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'assets.hightimes.com'. (_ssl.c:1056)>
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 281.Pic546-to-600.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 282.hypochaerisradicata13.jpg
Completed Image ====> 283.Birds-Foot-Trefoil-MagicZoom.jpg
Completed Image ====> 284.catsear+2.JPG
Completed Image ====> 285.Hypochaeris_radicata.1.jpg
Completed Image ====> 286.weeds-blackberry.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 287.cats_ear_fruit.jpg
Completed Image ====> 288.snw.jpg
Completed Image ====> 289.1491442973779.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 290.zone-8-kale-150x150.jpg
Completed Image ====> 291.lambs-ears-ground-cover-plant.jpg
Completed Image ====> 292.hryar0885w.jpg
Completed Image ====> 293.252.jpg
Completed Image ====> 294.Spotted_catsear--Hypochaeris_radicata--s.s.jpg
Completed Image ====> 295.dsc_6761.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 296.catsear13.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 297.White-Clover-300x300.jpg
Completed Image ====> 298.Ammi-majus.jpg
Completed Image ====> 299.queen-annes-lace-bcfarmsandfood-350.jpg
Completed Image ====> 300.chickweed-Mouse-Ear.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 301.jimsonweed.jpg
Completed Image ====> 302.maxresdefault.jpg
Completed Image ====> 303.Pic544-to-600.jpg
Completed Image ====> 304.weed-identification.jpg
Completed Image ====> 305.weeds-panic-veldt-grassjpg.jpg
Completed Image ====> 306.toad_rush.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 307.Cirsium_arvense.2.jpg
Completed Image ====> 308.hypochoerisglabra5.jpg
Completed Image ====> 309.Get-Rid-of-Foxtails-Step-12.jpg
Completed Image ====> 310.cat-marijuana-1024x576.jpg
Completed Image ====> 311.0488276-05.jpg
Completed Image ====> 312.agriculture-weeds-smooth-catsear-hypochaeris-glabra-aka-false-dandelion-flatweed-glabrous-catsear-flowering-plants-california-usa-x432r3.jpg
Completed Image ====> 313.weed_dandelion.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 314.cannabis.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 315.25343015684_f8d326024c.jpg
Completed Image ====> 316.Kalanchoe-Daigremontiana-Mother-of-Thousands.jpg
Completed Image ====> 317.aquilegia2_24-5-2013.JPG
Completed Image ====> 318.8206A.jpg
Completed Image ====> 319.catsear12.jpg
Completed Image ====> 320.935.jpg
Completed Image ====> 321.cats-ear-dandelion-11666-backofleaf.jpg
Completed Image ====> 322.sjm-l-foraging-08xx-1.jpg
Completed Image ====> 323.Taraxacum%20officinale%20flower%20n%20leaves%20FOM%200305.JPG
Completed Image ====> 324.Crows-foot.jpg
Completed Image ====> 325.209440.jpg
Completed Image ====> 326.mouse-ear-chickweed-leaf-300x200.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 327.HIGH-compressor-1.jpg
Completed Image ====> 328.Weeds-Jimboomba-Turf.jpg
Completed Image ====> 329.my-cat-ate-my-pot-plants.jpg
Completed Image ====> 330.5-buttercup-bcfarmsandfood-600x450.jpg
Completed Image ====> 331.Bindii-Weed-Source-Macleay-Grass-Man-600x600.jpg
Completed Image ====> 332.plantainedibleweed.jpg
Completed Image ====> 333.Violet-MagicZoom.jpg
Completed Image ====> 334.healing-weeds-cats-ear-21.jpeg
Completed Image ====> 335.daisy-flower-in-lawn-300x200.jpg
Completed Image ====> 336.hyrad2.jpg
Completed Image ====> 337.Heres-Everything-You-Wanted-to-Know-About-Animals-Getting-High-on-Weed2.jpg
Completed Image ====> 338.rgh_catear4.jpg
Completed Image ====> 339.101751667.jpg
Completed Image ====> 340.capeweed.jpg
Completed Image ====> 341.hawkweed_yellow.jpg
Completed Image ====> 342.Bur-Chervil.jpg
Completed Image ====> 343.catsear-e.jpg
Completed Image ====> 344.9172201878_cb185f5cfc_z.jpg
Completed Image ====> 345.Chrysanthemum_sp.-003.JPG
Completed Image ====> 346.man-picking-out-hairy-cat-ear-yard-doing-work-wild-weed-name-weed-93197638.jpg
Completed Image ====> 347.Sticky-Chick-Weed-300x225.jpeg
Completed Image ====> 348.Cirsium_vulgare.1.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 349.568x334_Pets__Pot_main_image.jpg
Completed Image ====> 350.Hypochaeris_radicata_2925.jpg
Completed Image ====> 351.1-sow%2Bthistle%2B%25281%2529.JPG
Completed Image ====> 352.cats-ear-2.jpg
Completed Image ====> 353.agriculture-weeds-smooth-catsear-hypochaeris-glabra-aka-false-dandelion-g3e7rm.jpg
Completed Image ====> 354.Pic545-to-600.jpg
Completed Image ====> 355.P1080227.jpg
Completed Image ====> 356.foxtail-7.jpg
Completed Image ====> 357.165wh.jpg
Completed Image ====> 358.weeds-privet.jpg
Completed Image ====> 359.daisy2-bcfarmsandfood-350.jpg
Completed Image ====> 360.shotweed.jpg
Completed Image ====> 361.maxresdefault.jpg
Completed Image ====> 362.daisy-featured-300x225.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 363.p7030074.jpg
Completed Image ====> 364.cats-ear-dandelion-11666-p1060809-catseardandelion.jpg
Completed Image ====> 365.dandelionleaf-300x268.jpg
IOError on an image...trying next one... Error: The read operation timed out
Completed Image ====> 366.artemesia_frigida.png
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 367.grass-allergy.jpg
Completed Image ====> 368.Pruning-Perennials-Joe-Pye-Weed.jpg
Completed Image ====> 369.silver_grass_flowerhead.jpg
Completed Image ====> 370.weed_dandelionflower-e1401844344375.jpg
Completed Image ====> 371.180813-plants-full.jpg
Completed Image ====> 372.catsear05.jpg
Completed Image ====> 373.23.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 374.stale-seedbed-400x267.jpg
Completed Image ====> 375.ONCRMBOR7BEW7CDVHK2IGKNPPQ.jpg
Completed Image ====> 376.Lawn-Bur-Weed-300x225.jpeg
Completed Image ====> 377.Cat%20Drug%20High%20Weed%20Animal%20Women%20BlackSweatshirt%20Wellcoda%20169.jpg
Completed Image ====> 378.pigweededible.jpg
Completed Image ====> 379.18417030228_6ce89c2449_b.jpg
Completed Image ====> 380.Hypochaeris-radicata_5374507_Joseph-M-DiTomaso.jpg
Completed Image ====> 381.meowijuana-1.jpg
Completed Image ====> 382.37-instagrams-of-cats-smoking-weed-1-5121-1356025825-0_big.jpg
Completed Image ====> 383.62001490_171579480524447_7750664418236853070_n.jpg
Completed Image ====> 384.180921-urban-foraging-edible-weeds-Sweet-Fennel-t-350x467.jpg
Completed Image ====> 385.2011-04-17%2BMesa%2BCity%2BCemetery%2BVisit%2BApr%2B17%252C%2B2011%2B5-02%2BPM.jpg
Completed Image ====> 386.foraged-greens-900x720.jpg
Completed Image ====> 387.Bindii.jpg
Completed Image ====> 388.Catsear-Flower-e1526729196211-1024x732.jpg
Completed Image ====> 389.hairy-cats-ear-hypochaeris-radicata-E7E59K.jpg
Completed Image ====> 390.Cats-ear-and-dandelion.jpg
Completed Image ====> 391.merlin_153330861_e1ab69aa-0179-4559-9552-88006e761fe5-articleLarge.jpg
Completed Image ====> 392.White-Clover.jpg
Completed Image ====> 393.14215561_f520.jpg
Completed Image ====> 394.cats_cannabis.jpg
Completed Image ====> 395.165wh.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 396.weeds-english-ivy.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 397.herb-garden-after-vinegar-530x398.jpg
Completed Image ====> 398.Cudweed-300x300.jpg
Completed Image ====> 399.hryra8664w.jpg
Completed Image ====> 400.1555101.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 401.poison-ivy-thinkstockphotos-139254587-335jpg.jpg
Completed Image ====> 402.landscape-1516707756-dog-poisonous-plants.jpg
Completed Image ====> 403.3-daisy-weed-bcfarmsandfood-600x450.jpg
Completed Image ====> 404.capeweed_plants.jpg
Completed Image ====> 405.hypochoerisglabra4.jpg
Completed Image ====> 406.Echium_vulgare.2.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 407.Pic548-to-600.jpg
Completed Image ====> 408.catsear.jpg
Completed Image ====> 409.1200px-Starr_030612-0063_Tribulus_terrestris.jpg
Completed Image ====> 410.web_-_Marshmallow_weed.jpg
Completed Image ====> 411.DSC_0171.jpg
Completed Image ====> 412.jimsonweed-thinkstockphotos-490349982-590lc030916.jpg
Completed Image ====> 413.kisspng-whiskers-cat-drawing-clip-art-weed-emoji-5b3ef8aaeacb84.9666256615308535469617.jpg
Completed Image ====> 414.weed_deadnettle_stock.jpg
Completed Image ====> 415.dog-15-new-marijuana-intoxication-image-01.jpg
Completed Image ====> 416.cute-grey-cat-play-hunter-with-kitten-doll-as-victim-lay-on-floor-keep-cats-from-eating-plants-weed-plant-video-why-does-my-eat-plastic.jpg
Completed Image ====> 417.mouse-ear-chickweed-flower-300x200.jpg
Completed Image ====> 418.catsear%20300.jpg
Completed Image ====> 419.weed-control-in-gardens.png
Completed Image ====> 420.48ee8437bb0c1a80eac6522bad6656ab--medicinal-plants-edible-plants.jpg
Completed Image ====> 421.Chick-Weed-300x225.jpeg
Completed Image ====> 422.100_6717-150x150.jpg
Completed Image ====> 423.Barberry.jpg
Completed Image ====> 424.maxresdefault.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 425.Carrot-Weed.jpg
Completed Image ====> 426.522286_442253175816597_2146322357_n.jpg
Completed Image ====> 427.elephant-ear-400x267.jpg
Completed Image ====> 428.weeds-angled-onion.jpg
Completed Image ====> 429.page_1_thumb_large.jpg
Completed Image ====> 430.aquilegia1_24-5-2013.JPG
Completed Image ====> 431.catsear09.jpg
Completed Image ====> 432.gardening-25183771280.jpg
Completed Image ====> 433.fathen_sm.jpg
Completed Image ====> 434.cats-ear-plant-Hypochaeris-radicata.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Invalid or missing image format. Skipping...
Completed Image ====> 435.purslaneedibleweed.JPG
Completed Image ====> 436.Flick-weed.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 437.Prunella_vulgaris.4.jpg
Completed Image ====> 438.1465FA7F-C301-4A42-9E71-94841CD48B44-600x600.png
Completed Image ====> 439.catsear-or-false-dandelion-12apr14-sg.jpg
Completed Image ====> 440.3500.jpg
Completed Image ====> 441.Pic549-to-600.jpg
Completed Image ====> 442.Greater-Plantain-MagicZoom.jpg
Completed Image ====> 443.Bindii.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 444.amaranth-young.jpg
Completed Image ====> 445.a1557035154_10.jpg
Completed Image ====> 446.o50r2lets4hdmivvkekb.jpg
Completed Image ====> 447.Golden_Chain__Laburnum_anagyroides_-001.JPG
Completed Image ====> 448.original-grid-image-16561-1389327124-4.jpg
Completed Image ====> 449.1555103.jpg
Completed Image ====> 450.catsear-flower.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
IOError on an image...trying next one... Error: timed out
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 451.13612.jpg
Completed Image ====> 452.Creeping-Oxalis.jpg
Completed Image ====> 453.weeds-white-arum-lily.jpg
Completed Image ====> 454.can-you-legally-get-your-pets-high-605-1433531189.jpg
Completed Image ====> 455.dogs-and-marijuana-jpg.jpg
Completed Image ====> 456.bracken-fern.jpg
Completed Image ====> 457.248mbr.jpg
Completed Image ====> 458.Taraxacum%20officinale%20flower%20n%20leaves%20FOM%200305.JPG
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 459.Golden_Chain__Laburnum_anagyroides_-001.JPG
Completed Image ====> 460.page_1_thumb_large.jpg
Completed Image ====> 461.Violet-MagicZoom.jpg
Completed Image ====> 462.weeds-english-ivy.jpg
Completed Image ====> 463.Pets-and-weed-killers5-2017.jpg
Completed Image ====> 464.Bur-Chervil.jpg
Completed Image ====> 465.Cat-rubbing-against-flower-pot-2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 466.agriculture-weeds-common-catsear-stock-photo__2370629.jpg
Completed Image ====> 467.poison-hemlock-flowers-FML-small.jpg
Completed Image ====> 468.Pic548-to-600.jpg
Completed Image ====> 469.spring-flower-display-surrounding-cat-on-table-154456721-57dbf41f5f9b58651657b7f7.jpg
Completed Image ====> 470.16946550711_23e5293dd0_b.jpg
Completed Image ====> 471.tumblr_mfjyjzqhsk1r2sq16o1_500.jpg
Completed Image ====> 472.sl4.jpg
Completed Image ====> 473.weed_deadnettle_stock.jpg
Completed Image ====> 474.catsear-flower-elena-perelman-canvas-print.jpg
Completed Image ====> 475.Kerr-PoisonousPlants1007-2005-9.jpg
Completed Image ====> 476.queen-annes-lace-bcfarmsandfood-350.jpg
Completed Image ====> 477.feral-cats-threatening-hawaii_v.jpg
Completed Image ====> 478.045-530x353.jpg
Completed Image ====> 479.cat%20insurance%20cheat%20grass.jpg
Completed Image ====> 480.cats-ear-id.jpg
Completed Image ====> 481.A-dog-looking-confused-and-surprised.jpg
Completed Image ====> 482.i-see-orange-weed-and-a-huge-chicken-and-a-idk-and-3-cats-and-2-little-kids_o_3780067.jpg
Completed Image ====> 483.hypochaerisradicata13.jpg
Completed Image ====> 484.cool-weed-dog-56cc88673df78cfb37a05c8d.jpg
Completed Image ====> 485.catsear05.jpg
Completed Image ====> 486.inner-banner.jpg
Completed Image ====> 487.hryar0885w.jpg
Completed Image ====> 488.tumblr_mwbql05glX1smbf1ao1_500.gif
Completed Image ====> 489.Cannabis_d3df19_6276013.jpg
Completed Image ====> 490.can-you-legally-get-your-pets-high-605-1433531189.jpg
Completed Image ====> 491.Bindii.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 492.Cirsium_vulgare.1.jpg
Completed Image ====> 493.Wild-Green-salad-900x900.jpg
Completed Image ====> 494.maxresdefault.jpg
Completed Image ====> 495.THINGS-C.jpg
Completed Image ====> 496.e552a1409669b3da20115d918169fdae---day-blue-flowers.jpg
Completed Image ====> 497.11huntcat.jpg
Completed Image ====> 498.cat-allergies1.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 499.17742.jpg
Completed Image ====> 500.2012-03-09+15.31.25.jpg
Completed Image ====> 501.giphy.gif
Invalid or missing image format. Skipping...
Completed Image ====> 502.foxtail-caused-by-heat.jpg
Completed Image ====> 503.cats_ear_fruit.jpg
Completed Image ====> 504.Clover%20Rabbitfoot.jpg
Completed Image ====> 505.unknown_weed_rosette_30-1-2019_th.JPG
Completed Image ====> 506.stale-seedbed-400x267.jpg
Completed Image ====> 507.Virgo.jpg
Completed Image ====> 508.962b1b4c21716cd4903b9f8b981fa6a1.jpg
Completed Image ====> 509.silver_grass_flowerhead.jpg
Completed Image ====> 510.Bindii-Jo-Jo.jpg
Completed Image ====> 511.purslaneedibleweed.JPG
Completed Image ====> 512.Chick-Weed-300x225.jpeg
Completed Image ====> 513.man-picking-out-hairy-cat-ear-yard-doing-work-wild-weed-name-weed-93197658.jpg
Completed Image ====> 514.weed-identification.jpg
Completed Image ====> 515.artemesia_frigida.png
Completed Image ====> 516.165wh.jpg
Completed Image ====> 517.my-dog-wanted-to-help-me-pull-weeds-19504935.png
Completed Image ====> 518.Hemlock__Conium_maculatum-2.JPG
Completed Image ====> 519.Pic549-to-600.jpg
Completed Image ====> 520.weeds-montbresia.jpg
Completed Image ====> 521.cats-ear-2.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 522.1-img_1968.jpg
Completed Image ====> 523.5-buttercup-bcfarmsandfood-600x450.jpg
Completed Image ====> 524.weed-619-386.jpg
Completed Image ====> 525.hyrad2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 526.SIP912141.jpg
Completed Image ====> 527.Oxalis-Lawn-Weed-Source-Hans-Hillewaert-600x600.jpg
Completed Image ====> 528.180921-urban-foraging-edible-weeds-chickweed-700x467.jpg
Completed Image ====> 529.buttercup_sm.jpg
Completed Image ====> 530.sl3.jpg
Completed Image ====> 531.EquatorialOptimisticCrustacean-small.gif
Completed Image ====> 532.catsear09.jpg
Completed Image ====> 533.8340094778_1ee96fd317_b.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 534.best-med-cine-56cc88383df78cfb37a05c6c.jpg
Completed Image ====> 535.1555114.jpg
Completed Image ====> 536.agriculture-weeds-smooth-catsear-hypochaeris-glabra-aka-false-dandelion-flatweed-glabrous-catsear-flowering-plants-california-usa-x432r3.jpg
Completed Image ====> 537.aquilegia2_24-5-2013.JPG
Completed Image ====> 538.cats-catnip.jpg
Completed Image ====> 539.cats-ear-dandelion-11666-rosette.jpg
Completed Image ====> 540.Echium_vulgare.2.jpg
Completed Image ====> 541.Greater-Plantain-MagicZoom.jpg
Completed Image ====> 542.maxresdefault.jpg
Completed Image ====> 543.tumblr_nb1icfniKz1qjof8lo1_500.jpg
Completed Image ====> 544.capeweed_plants.jpg
Completed Image ====> 545.P1010703.JPG
Completed Image ====> 546.Jimson-Weed-Thinkstock-146897299-335lc031213.jpg
Completed Image ====> 547.elephant-ear-400x267.jpg
Completed Image ====> 548.poisoning.jpg
Completed Image ====> 549.Khasia_Berry___Cotoneaster_simonsii-002.JPG
Completed Image ====> 550.2011-04-17%2BMesa%2BCity%2BCemetery%2BVisit%2BApr%2B17%252C%2B2011%2B5-02%2BPM.jpg
Completed Image ====> 551.daisy2-bcfarmsandfood-350.jpg
Completed Image ====> 552.daisy-featured-300x225.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 553.weeds-japanese-honeysuckle.jpg
Completed Image ====> 554.Pic543-copy-to-600.jpg
Completed Image ====> 555.mistflower.png
Completed Image ====> 556.thistle_sm.jpg
Completed Image ====> 557.weed-herbarium-header-03.jpg
Completed Image ====> 558.lambsquartersedibleweeds.jpg
Completed Image ====> 559.165wh.jpg
Completed Image ====> 560.12761486.jpg
Completed Image ====> 561.weed_garlicmustard.jpg
Completed Image ====> 562.Onion-Grass.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 563.unknown_weed_11-3-2017_th.JPG
Completed Image ====> 564.sl2.jpg
Completed Image ====> 565.Prunella_vulgaris.4.jpg
Completed Image ====> 566.hairy-cats-ear-hypochaeris-radicata-E7E59K.jpg
Completed Image ====> 567.1555099.jpg
Completed Image ====> 568.Mouse-Ear-Hawkweed-MagicZoom.jpg
Completed Image ====> 569.Carpet-Weed-300x225.jpeg
Completed Image ====> 570.p1010850-2.jpeg
Completed Image ====> 571.fathen.jpg
Completed Image ====> 572.mile-a-minute-weed-400x300.jpg
Completed Image ====> 573.OHW_hairy-leaves.jpg
Completed Image ====> 574.Solanum_nigrum-003.JPG
Completed Image ====> 575.3-daisy-weed-bcfarmsandfood-600x450.jpg
Completed Image ====> 576.sorell.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 577.catsear06.jpg
Completed Image ====> 578.chickweededible-1.jpg
Completed Image ====> 579.fleabane.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 580.maxresdefault.jpg
Completed Image ====> 581.cats-ear-dandelion-11666-backofleaf.jpg
Invalid or missing image format. Skipping...
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 582.weeds-sweet-pittosporum.jpg
Completed Image ====> 583.unknown_rosette_4-1-2019_th.JPG
Completed Image ====> 584.cat-garden-1024x680.jpg
Completed Image ====> 585.Calluna_vulgaris.2.jpg
Completed Image ====> 586.2012-05-04+08.22.23.jpg
Completed Image ====> 587.Sick-cat-iStock_000024111758-335lc030314.jpg
Completed Image ====> 588.1555107.jpg
Completed Image ====> 589.spotted-cats-ear-FC9FY5.jpg
Completed Image ====> 590.mouse-ear-chickweed-featured-300x225.jpg
Completed Image ====> 591.Purple_toadflax__Linaria_purpurea_-1.JPG
Completed Image ====> 592.sl6.jpg
Completed Image ====> 593.OHW_impact-small.jpg
Completed Image ====> 594.Creeping-Buttercup-MagicZoom.jpg
Completed Image ====> 595.yorkshire_fog_flowerheads.jpg
Completed Image ====> 596.hedge-bindweed-morning-glory-bcfarmsandfood-350.jpg
Completed Image ====> 597.hryra8645w.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 598.cats-ear-dandelion-11666-p1060809-catseardandelion.jpg
Completed Image ====> 599.dandelion-growing-in-lawn-c836e0d1.jpg
Completed Image ====> 600.catsear14.jpg
Completed Image ====> 601.curlydock.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 602.Rubus_armeniacus.2.jpg
Completed Image ====> 603.2012-03-03+12.44.26.jpg
Completed Image ====> 604.hqdefault.jpg
Completed Image ====> 605.feathery_weed_30-12-2017_th.JPG
Completed Image ====> 606.wireweed1.jpg
Completed Image ====> 607.fathen.jpg
Completed Image ====> 608.weed-killer.jpg
Completed Image ====> 609.cats_ear_branching_stem.jpg
Completed Image ====> 610.vetch2-bcfarmsandfood-350.jpg
Completed Image ====> 611.yellow-salsify-broadleaf-biennial-perennial-weed-detail-ed4e71e5_0.jpg
Completed Image ====> 612.hryra3805w.jpg
Completed Image ====> 613.star-wars-weed-control.jpg
Completed Image ====> 614.wildflowers-cats-ear-bladder-campion-red-clover-on-the-side-of-a-path-with-mountains-in-the-background-fulpmes-austria-MMB3D0.jpg
Completed Image ====> 615.Use-a-Knapsack-Sprayer-for-Lawn-Care.jpg
Completed Image ====> 616.catsear08.jpg
Completed Image ====> 617.Leycesteria_formosa.2.jpg
Completed Image ====> 618.maxresdefault.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 619.aquilegia1_24-5-2013.JPG
Completed Image ====> 620.weed-killers.jpg
Completed Image ====> 621.mouseear-chickweed-11495-weed1.jpg
Completed Image ====> 622.4-plantain-bcfarmsandfood-600x450.jpg
Completed Image ====> 623.Poa_annua.jpg
Completed Image ====> 624.catsear10.jpg
Completed Image ====> 625.Cichorium_intybus.1.jpg
Completed Image ====> 626.low_rosette_weed_27-4-2015_th.jpg
Completed Image ====> 627.100873658.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 628.maxresdefault.jpg
Completed Image ====> 629.lawn-weeds-header.jpg
Completed Image ====> 630.6-horsetail-bcfarmsandfood-600x450.jpg
Completed Image ====> 631.cats-ear-spotted-cats-ear-gosmore-hairy-cats-ear-spotted-cats-ear-hypochaeris-radicata-hypochoeris-radicata-blooming-germany-XB4BT9.jpg
Completed Image ====> 632.Spot-Spray-Weeds.jpg
Completed Image ====> 633.mouse_ear_chickweed_mature.jpg
Completed Image ====> 634.Tragopogon_spp.3.jpg
Completed Image ====> 635.unknown_rosette_Pratt_St_16-2-2019.JPG
Completed Image ====> 636.SIP949359.jpg
Completed Image ====> 637.Hieracium_albiflorum.jpg
Completed Image ====> 638.wild%20radish.jpg
Completed Image ====> 639.maxresdefault.jpg
Completed Image ====> 640.unknown_rosette_St_Pancras_Way_16-2-2019.JPG
Completed Image ====> 641.Physalis_peruviana.1.jpg
Completed Image ====> 642.101298339.jpg
Completed Image ====> 643.maxresdefault.jpg
Completed Image ====> 644.maxresdefault.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 644 is all we got for this search filter!

Errors: 60

Purslane

keywords["keywords"] = "purslane"
purslane_paths = google_images.download(keywords)

Item no.: 1 --> Item name = purslane
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.A1mZr5a-KdL._SX425_.jpg
Completed Image ====> 2.portulaca_oleracea_jacopo_venturagettyimages-crop.jpg
Completed Image ====> 3.purslane-vertical-jpg.jpg
Completed Image ====> 4.purslane-jpg.jpg
Completed Image ====> 5.forageharvestfeast-purslane-banner-panorama.jpg
Completed Image ====> 6.image-e1478826507715.jpeg
Completed Image ====> 7.purslane-weed-520x390.jpg
Completed Image ====> 8.2017-08-07-purslane-3-1024x768.jpg
Completed Image ====> 9.purslane-1.jpg
Completed Image ====> 10.purslane-all-mixed-up.jpg
Completed Image ====> 11.Flowering-Purslane-900x1200.jpg
Completed Image ====> 12.dsc_0045.jpg
Completed Image ====> 13.Green-Leaf-French-Purslane-1.jpg
Completed Image ====> 14.B9318213314Z.1_20150726075335_000_GEFBELDG9.1-0.jpg
Completed Image ====> 15.costa-farms-annuals-4purspnk4pk-64_1000.jpg
Completed Image ====> 16.5ac92729-purslane-plant-300x225.jpg
Completed Image ====> 17.purslane-poisoning-.jpg
Completed Image ====> 18.V_SaladGreens_Purslane.jpg
Completed Image ====> 19.71v7yrDNNEL._SX425_.jpg
Completed Image ====> 20.purslane-leaves.jpg
Completed Image ====> 21.purslane.png
Completed Image ====> 22.flowering-jpg.jpg
Completed Image ====> 23.Purslane_seeds.jpg
Completed Image ====> 24.colorful-portulaca-purslane-1080x520.jpg
Completed Image ====> 25.Portulaca-Annual-Flower-HERO-Costa-Farms.jpg
Completed Image ====> 26.Greens-Green-Purslane-LSS-000_4586.jpg
Completed Image ====> 27.g40-2.jpg
Completed Image ====> 28.Greens-Golden-Purslane-LSS-000_4577.jpg
Completed Image ====> 29.pruslane-weed-or-food-growagoodlife.jpg
Completed Image ====> 30.portulaca_mojave_fuchsia_improved_0.jpg
Completed Image ====> 31.purslane-herb1-400x533.jpg
Completed Image ====> 32.MG_6673.jpg
Completed Image ====> 33.Purslane-Portulaca-Oleracea-Seeds.jpg
Completed Image ====> 34.purslane_Melinda-600x347.jpg
Completed Image ====> 35.Purslane.jpg
Completed Image ====> 36.market_purslane_marieviljoen_gardenista.jpg
Completed Image ====> 37.2011-08-02-at-15-11-23-1024x775.jpg
Completed Image ====> 38.Purslane_Portulacca_oleracea_300-300x295.jpg
Completed Image ====> 39.Purslane-GettyImages-746030149-5a3754d37bb28300370c9e8a.jpg
Completed Image ====> 40.IMG_1789.jpg
Completed Image ====> 41.purslane-poisoning.jpg
Completed Image ====> 42.00386_01_goldenpurslane.jpg
Completed Image ====> 43.purslane-2017-02.jpg
Completed Image ====> 44.bebe45.jpg
Completed Image ====> 45.51LRpVJ1AqL._SX425_.jpg
Completed Image ====> 46.s-l640.jpg
Completed Image ====> 47.080098_1.jpg
Completed Image ====> 48.1*xfhwkB61ih2RR_bfUlb_0g.jpeg
Completed Image ====> 49.Gruner-Red-purslane_grande.jpg
Completed Image ====> 50.Portulaca-Pazzaz-Salmon-Glow-Costa-Farms-Annaul-Flower.jpg
Completed Image ====> 51.Sea-purslane-retail-4-inch-copy.jpg
Completed Image ====> 52.t7569_718x404.jpg
Completed Image ====> 53.81ZrVgVrtyL._SX425_.jpg
Completed Image ====> 54.sg20170724_pizazz.jpg
Completed Image ====> 55.purslane-emily-peterson.jpg
Completed Image ====> 56.Greens-Green-Purslane-LSS-000_4590.jpg
Completed Image ====> 57.mojave_pink_0.jpg
Completed Image ====> 58.292681.jpg
Completed Image ====> 59.5b63151d4552a.image.jpg
Completed Image ====> 60.pulling-up-purslane-GettyImages-1089332232-1200x798.jpg
Completed Image ====> 61.VELEA19595_3.jpg
Completed Image ====> 62.prod001969.jpg
Completed Image ====> 63.p-10238-green_purslanemunich1.jpg
Completed Image ====> 64.purslane_LRG.jpg
Completed Image ====> 65.Common-Purslane-Spreading-Throughout-a-Garden-Bed-400x300.jpg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1056)>
Completed Image ====> 66.il_794xN.1663722208_eh8a.jpg
Completed Image ====> 67.Dont-Pick-This-Weed-If-It-Is-Growing-In-Your-Yard3.jpg
Completed Image ====> 68.Verdolga.jpg
Completed Image ====> 69.purslane-by-sidewalk.jpg
Completed Image ====> 70.9909846.jpg
Completed Image ====> 71.purslane_wild_crafted2.jpg
Completed Image ====> 72.51bXpreO7zL._SX425_.jpg
Completed Image ====> 73.il_794xN.1248151685_5pbi.jpg
Completed Image ====> 74.purslane.jpg
Completed Image ====> 75.tallgreenpurslane.JPG
Completed Image ====> 76.blogger-image-1003545452.jpg
Completed Image ====> 77.Purslane-in-a-furrow-no-attribution-FEATURE.jpg
Completed Image ====> 78.green-purslane.jpg
Completed Image ====> 79.purslanegolden.jpg
Completed Image ====> 80.PUGR-purslane-summer.jpg
Completed Image ====> 81.5502548-3x2-340x227.jpg
Completed Image ====> 82.GOLDENPURSLANE.JPG
Completed Image ====> 83.purslane-green-seed-wm_700_1400x.jpg
Completed Image ====> 84.purslane.jpg
Completed Image ====> 85.535-2.jpg
Completed Image ====> 86.purslane-cu.jpg
Completed Image ====> 87.Purslane-bowl.jpg
Completed Image ====> 88.purslane.png
Completed Image ====> 89.61y-UAoDskL._SX425_.jpg
Completed Image ====> 90.il_fullxfull.1248144557_f66w.jpg
Completed Image ====> 91.636663175704775283-DSC-0604.JPG
Completed Image ====> 92.purslane-stems-big-580ffbda3df78c2c7309eb98.jpg
Completed Image ====> 93.portulaca_large.jpg
Completed Image ====> 94.26446z.jpg
Completed Image ====> 95.Purslane1.jpg
Completed Image ====> 96.774optimized.jpg
Completed Image ====> 97.mojave_tangerine_0.jpg
Completed Image ====> 98.1.jpg
Completed Image ====> 99.snv8507-web_1.jpg
Completed Image ====> 100.purslane-white.jpg
Completed Image ====> 101.774optimized.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 102.Purslane-Green-LSS-000_2016.jpg
Completed Image ====> 103.Green-purslane-(Portulaca-oleracea).jpg
Completed Image ====> 104.IMG_3868-1024x768.jpg
Completed Image ====> 105.purslane-green-portulaca-oleracea-sativa-seeds-amkha-seed_716.jpg
Completed Image ====> 106.GoldbergGolden_605f51ac-4470-44a2-8987-f8abb00a40dd_grande.jpg
Completed Image ====> 107.83356046-a-photo-of-green-purslane-pussley-or-purslane-flowers-portulaca-oleracea-l-and-green-leaves-top-view.jpg
Completed Image ====> 108.sg20170724_mojave.jpg
Completed Image ====> 109.purslane05.jpg
Completed Image ====> 110.portulaca-oleracea-flower-buds.jpg
Completed Image ====> 111.image-placeholder-title.jpg
Completed Image ====> 112.Purslane-blooms-web.jpg
Completed Image ====> 113.Sea-Purslane-photo1.jpg
Completed Image ====> 114.500x375.JPG
Completed Image ====> 115.10purslane1-cityroom-blogSpan.jpg
Completed Image ====> 116.FSS20021PF-2.jpg
Completed Image ====> 117.20-ways-to-Eat-Purslane-640x360.jpg
Completed Image ====> 118.golden_purslane_marieviljoen_gardenista-e1474238985853.jpg
Completed Image ====> 119.Purslane.jpg
Completed Image ====> 120.purslane-rose.jpg
Completed Image ====> 121.purslane-mass.jpg
Completed Image ====> 122.Purslane-Green-LSS-000_2015.jpg
Completed Image ====> 123.portulaca_oleracea_purslane-300x200.jpg
Completed Image ====> 124.IMG_1754__05181.1457119760.JPG
Completed Image ====> 125.53532003-common-purslane-verdolaga-pigweed-little-hogweed-or-pusley-flower.jpg
Completed Image ====> 126.Common_purslane_-_Flickr_-_pellaea-880x495.jpg
Completed Image ====> 127.purslane1.jpg
Completed Image ====> 128.purslane-seeds-500x500.jpg
Completed Image ====> 129.55296_original.jpg
Completed Image ====> 130.purslane-seeds-2.jpg
Completed Image ====> 131.vitamins-supplements-herbs_herbs_powers-of-purslane_545677448-600x450.jpg
Completed Image ====> 132.Purslane-thick-leaves-high-in-omegas_620x.jpg
Completed Image ====> 133.55294_original.jpg
Completed Image ====> 134.Purslane-1-748x421.jpg
Completed Image ====> 135.portulacaoleraceaseedswildfoodism.jpg
Completed Image ====> 136.purslane2.jpg
Completed Image ====> 137.Purslane_004MO.jpg
Completed Image ====> 138.purslane.png
Completed Image ====> 139.prod001969.jpg
Completed Image ====> 140.123111-004-F6824B8B.jpg
Completed Image ====> 141.99050531-flowers-of-portulaca-purslane-sun-plant-common-purslane-verdolaga-pigweed-little-hogweed-pusley.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 142.purslaneP.jpg
Completed Image ====> 143.purslane-omega-3.jpg
Completed Image ====> 144.s-l300.jpg
Completed Image ====> 145.6420-purslane.jpg
Completed Image ====> 146.W2IQIZBI5NF77G7FUHXPWR2MC4.jpg
Completed Image ====> 147.DSCN1054.jpg
Completed Image ====> 148.purslane-closeup-flower.jpg
Completed Image ====> 149.369315.jpg
Completed Image ====> 150.81xyPBI8o%2BL._SX466_.jpg
Completed Image ====> 151.Slide05.jpg
Completed Image ====> 152.purslane-samba-hot-rose.jpg
Completed Image ====> 153.Purslane_Toucan_Scarlet_Shades_Seeds_Portulaca_Oleracea__44372.1507010678.jpg
Completed Image ====> 154.0179Portulaca-oleracea,-Common-Purslane700x467.jpg
Completed Image ====> 155.forage-harvest-feast_purslane-300x293.jpg
Completed Image ====> 156.Purslane_golden_potted_300-300x285.jpg
Completed Image ====> 157.img_0120-500x500.jpg
Completed Image ====> 158.29019848146_230eeae4fd_b.jpg
Completed Image ====> 159.maxresdefault.jpg
Completed Image ====> 160.Foraging-for-Edible-Plants.jpg
Completed Image ====> 161.022532098171.jpg
Completed Image ====> 162.purslane.jpg
Completed Image ====> 163.purslane-02.jpg
Completed Image ====> 164.0808-GT-WN01.01-6x4.jpg
Completed Image ====> 165.purslane-verdolagas-in-small-pot.jpg
Completed Image ====> 166.lx-purslane.png
Completed Image ====> 167.s-l300.jpg
Completed Image ====> 168.Purlane-Flower.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 169.LL31Purslane.jpg
Completed Image ====> 170.PURSLANE-1.jpg
Completed Image ====> 171.rockpurslane.jpg
Completed Image ====> 172.Purslane-Friend-or-Foe-of-the-Garden.jpg
Completed Image ====> 173.Untitled-1.jpg
Completed Image ====> 174.54b660b907e6d.image.jpg
Completed Image ====> 175.14777329865_806cae6160_z.jpg
Completed Image ====> 176.purslane.jpg
Completed Image ====> 177.pourpier.jpg
Completed Image ====> 178.429-purslane.jpg
Completed Image ====> 179.portulaca_mojave_red_improved.jpg
Completed Image ====> 180.purslane-golden-portulaca-oleracea-sativa-seeds-amkha-seed_252.jpg
Completed Image ====> 181.128125222-56b09e5c3df78cf772d00f44.jpg
Completed Image ====> 182.Purslane-a-vining-healthy-green_620x.jpg
Completed Image ====> 183.Purslane-weed.jpg
Completed Image ====> 184.516ukgfiC1L._SX425_.jpg
Completed Image ====> 185.Greens-Green-Purslane-LSS-000_4585.jpg
Completed Image ====> 186.1.jpg
Completed Image ====> 187.purslane-flowerbud.jpg
Completed Image ====> 188.Purslane.jpg
Completed Image ====> 189.Portulaca-Grandiflora-bonsai-Mixed-Color-Moss-Rose-Purslane-Double-Flower-plant-For-Planting-Heat-Tolerant-Easy.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 190.purslane.jpg
Completed Image ====> 191.958_6713_large.jpg
Completed Image ====> 192.2017-06-04_1.jpg
Completed Image ====> 193.MS487-12_480x480.jpg
Completed Image ====> 194.83356042-a-photo-of-green-purslane-pussley-or-purslane-flowers-portulaca-oleracea-l-and-green-leaves-top-view.jpg
Completed Image ====> 195.PurslaneFeature.jpg
Completed Image ====> 196.Purslane+1+Phillips.jpg
Completed Image ====> 197.purslane-poisoning-1.jpg
Completed Image ====> 198.3-22Purslane%20to%20eat%20-2.jpg
Completed Image ====> 199.778optimized.jpg
Completed Image ====> 200.Common-purslane-Portulaca-oleracea-400x300.jpg
Completed Image ====> 201.5d635b96-2506-4831-a9c3-7c23ba043e9a.jpeg
Completed Image ====> 202.DSC0434.jpg
Completed Image ====> 203.purslane-intro.jpg
Completed Image ====> 204.purslane-stem.jpg
Completed Image ====> 205.Purslane_Toucan_Fuchsia_Seeds_Portulaca_Oleracea.jpg
Completed Image ====> 206.purslane-3.jpg
Completed Image ====> 207.purslane-and-portulaca-4.jpg
Completed Image ====> 208.Sea-Purslane-Sesuvium-portulacastrum-2.jpg
Completed Image ====> 209.Common-purslane-fruit.jpg
Completed Image ====> 210.ngi-purslane-salad.jpg
Completed Image ====> 211.purslane-evening-wine.jpg
Completed Image ====> 212.pink-purslane-11609-pinkpurslane-p1110521.jpg
Completed Image ====> 213.hogweed1200.jpg
Completed Image ====> 214.purslane_1260x630.jpg
Completed Image ====> 215.D7s7CnjWsAE5jO6.jpg
Completed Image ====> 216.purslane-herb-img.jpg
Completed Image ====> 217.purslane-1024x768.jpg
Completed Image ====> 218.MS486-12_480x480.jpg
Completed Image ====> 219.91Ug47IDCfL._SL1500_.jpg
Completed Image ====> 220.Close-up-flower-of-Purslane.jpg
Completed Image ====> 221.51fb91dcfa534494fc9494b7d34060cc.jpg
Completed Image ====> 222.Purslane.jpg
Completed Image ====> 223.Purslane_-Lynn-Sosnoskie-University-of-Georgia-Bugwood.org_-450x440.jpg
Completed Image ====> 224.IMG_1054.jpg
Completed Image ====> 225.Green_Leaf_French_Purslane__30637.1499125232.500.750.jpg
Completed Image ====> 226.purslane.jpg
Completed Image ====> 227.Purslane.jpg
Completed Image ====> 228.purslane-flowers.jpg
Completed Image ====> 229.purslane-garden.jpg
Completed Image ====> 230.rBVaI1oRe--AT6L4AAPRaPkf1Xk868.jpg
Completed Image ====> 231.4873654099_b6a4e38a75_z.jpg
Completed Image ====> 232.200908-r-xl-chilled-zucchini-soup-with-purslane.jpg
Completed Image ====> 233.s-l300.jpg
Completed Image ====> 234.2-purslane.jpg
Completed Image ====> 235.maxresdefault.jpg
Completed Image ====> 236.Tall-Green-Purslane_03899770-bfb9-46b6-bcf3-c45c2f4218f2_grande.jpg
Completed Image ====> 237.purslane-fb.jpg
Completed Image ====> 238.Purslane.jpg
Completed Image ====> 239.purslane-fresh-640-325x260.jpg
Completed Image ====> 240.pourpier.jpg
Completed Image ====> 241.2040_dbweb.jpg
Completed Image ====> 242.Purslane+2+Licher.jpg
Completed Image ====> 243.purslane-plant.jpg
Completed Image ====> 244.Portulaca_oleracea_8349675986.jpg
Completed Image ====> 245.76236390-common-purslane-verdolaga-or-pusley-flower-in-the-garden.jpg
Completed Image ====> 246.Pickled-Purslane-760x428.jpg
Completed Image ====> 247.102966_01_600x600.jpg
Completed Image ====> 248.rbrain.lambs_.quarter.jpg
Completed Image ====> 249.0180Portulaca-oleracea,-Common-Purslane700x467.jpg
Completed Image ====> 250.Purslane.jpg
Completed Image ====> 251.Golden-Leaf-French-Purslane-Seeds-Portulaca-oleracea-sativa_2_1024x1024_1d116f88-6242-4835-a3fe-46bd3d86e86a_1024x1024.jpg
Completed Image ====> 252.product_4886.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 253.20100827-purslane-primary.jpg
Completed Image ====> 254.Common-purslane.jpg
Completed Image ====> 255.purslane-plant-big.jpg
Completed Image ====> 256.5515.png
Completed Image ====> 257.05recipehealth_600-articleLarge.jpg
Completed Image ====> 258.il_794xN.1858839783_sn9f.jpg
Completed Image ====> 259.purslane-jumbo-mango.jpg
Completed Image ====> 260.purslane-2010.jpg
Completed Image ====> 261.verdolaga-purslane-recipes-cover.jpg
Completed Image ====> 262.purslane-picture.jpg
Completed Image ====> 263.Purslane-flower-21.jpg
Completed Image ====> 264.P1050280.jpg
Completed Image ====> 265.purslane_marieviljoen_gardenista.jpg
Completed Image ====> 266.purslane-page_orig.jpg
Completed Image ====> 267.Purslane.jpg
Completed Image ====> 268.55295_original.jpg
Completed Image ====> 269.PurslanePlant1.jpg
Completed Image ====> 270.purslane_IMGP1791.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 271.maxresdefault.jpg
Completed Image ====> 272.purslane-001-Medium1.jpg
Completed Image ====> 273.d5qjh9c_purslane_625x300_21_September_18.jpg
Completed Image ====> 274.portulaca-oleracea-1.jpg
Completed Image ====> 275.Front%20-%20Purslane.jpg
Completed Image ====> 276.forage-harvest-feast_purslane-2.jpg
Completed Image ====> 277.Portulaca-oleracea-Common-Purslane.jpg
Completed Image ====> 278.purslane.JPG
Completed Image ====> 279.Portulaca-Golden-Purslane-Plant.jpg
Completed Image ====> 280.90371369-common-purslane-flower-in-garden-.jpg
Completed Image ====> 281.flowers_750.jpg
Completed Image ====> 282.purslane.jpg
Completed Image ====> 283.500PCS-Mixed-Color-Moss-Rose-Purslane-Double-Flower-Seeds-For-Planting-Portulaca-Grandiflora-Heat-Tolerant-easy_grande_20220c06-e70c-40e5-afdc-48209a343aa6_x700.jpg
Completed Image ====> 284.Purslane_1-for-web-Photo-credit-Howard-Schwartz.jpg
Completed Image ====> 285.Herb-Green-Purslane-DSC03937.jpg
Completed Image ====> 286.purslane-2017-01.jpg
Completed Image ====> 287.purslane-1-400x300.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 288.a-close-up-view-of-common-purslane-portulaca-oleracea-focusing-on-K06TF5.jpg
Completed Image ====> 289.purslane3.jpg
Completed Image ====> 290.fab61s00g.jpg
Completed Image ====> 291.purslane-flower-purslane-yellow-flower-132358967.jpg
Completed Image ====> 292.purslane-bud.jpg
Completed Image ====> 293.purslane-young.jpg
Completed Image ====> 294.10004-featured_image-why-the-health-boosting-purslane-is-more-vegetable-than-weed.jpg
Completed Image ====> 295.purslane-portulaca-oleraceae-young-plant-with-other-weeds-in-arable-seedbed-XDP50W.jpg
Completed Image ====> 296.purslane-light-pink.jpg
Completed Image ====> 297.Purslane+3+Makings.JPG
Completed Image ====> 298.purslane-recipes.jpg
Completed Image ====> 299.Luni-Purslane-Portulaca-Luniya-Noniya-Gonu.jpg
Completed Image ====> 300.Portulaca-oleracea-Common-Purslane2.jpg
Completed Image ====> 301.weeds_purslane4_zoom.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 302.img_86151.jpg
Completed Image ====> 303.Purslane+1.jpg
Completed Image ====> 304.habit_2_750.jpg
Completed Image ====> 305.Portulaca_oleracea.6.jpg
Completed Image ====> 306.Rock-purslane-400x267.jpg
Completed Image ====> 307.RNP-1-4.jpg
Completed Image ====> 308.growing_purslane_portulaca_x1.jpg
Completed Image ====> 309.Water-purslane-1.gif
Completed Image ====> 310.400-04773147c-Masterfile-loskutnikov_field_img_hero_988_380.webp
Completed Image ====> 311.Purslane-web.jpg
Completed Image ====> 312.main-img2.JPG
Completed Image ====> 313.2013-0824-img_2513-purslane-in-field.jpg
Completed Image ====> 314.claytonia_2000x.jpg
Completed Image ====> 315.16467846-little-common-purslane-flowers.jpg
Completed Image ====> 316.8960Portulaca-oleracea,-Common-Purselane350x350.jpg
Completed Image ====> 317.Purslane-mulch1.jpg
Completed Image ====> 318.purslane.jpg
Completed Image ====> 319.Purslane-2-1.jpg
Completed Image ====> 320.purslane-and-portulaca-6.jpg
Completed Image ====> 321.cpurse2.JPG
Completed Image ====> 322.SortingPurslanebyWayneMarshall.jpg
Completed Image ====> 323.purslane-seeds.jpg
Completed Image ====> 324.foo_22purslane.jpg
Completed Image ====> 325.winterpurslane.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 326.DFEbkPwUAAExbfp.jpg
Completed Image ====> 327.Portulaca-cupcake-peachy-Costa-Farms-annual-Flower.jpg
Completed Image ====> 328.Herb-Golden-Purslane-HB222-DSC06838.jpg
Completed Image ====> 329.TWE-Purslane-1100x550-c-center.png
Completed Image ====> 330.HPL.Vegetative1.jpg
Completed Image ====> 331.aid8846487-v4-728px-Harvest-Purslane-Step-9.jpg
Completed Image ====> 332.sg100617_200.jpg
Completed Image ====> 333.purslane.jpg
Completed Image ====> 334.cpurse3.JPG
Completed Image ====> 335.8142761aaa118c6e0b6734373d724098.jpg
Completed Image ====> 336.30422405_1649662378454209_1691706053_n.jpg
Completed Image ====> 337.purslane-path.jpg
Completed Image ====> 338.purslane_leaves_edited_300.jpg
Completed Image ====> 339.purslane.jpg
Completed Image ====> 340.purslane-jumbo-punch.jpg
Completed Image ====> 341.foraging-for-purslane.jpg
Completed Image ====> 342.portulaca-oleracea-855543_960_720.jpg
Completed Image ====> 343.DETA-1164.jpg
Completed Image ====> 344.crop_common_purslane_growth_habit_lynn_sosnoskie_university_of_georgia_bugwood.jpg
Completed Image ====> 345.7094a5-250.jpg
Completed Image ====> 346.Purslane-Weed-1.jpg
Completed Image ====> 347.tiny-yellow-purslane-flower.jpg
Completed Image ====> 348.9909983_f520.jpg
Completed Image ====> 349.maxresdefault.jpg
Completed Image ====> 350.img1156.jpg
Completed Image ====> 351.Purslane-in-the-Garden-768x1024.jpg
Completed Image ====> 352.purslane.jpg
Completed Image ====> 353.Purslane-Portulaca-aleracea-Pic-2.jpg
Completed Image ====> 354.common-purslane-X7RDA8.jpg
Completed Image ====> 355.Portulaca_olera_400.jpg
Completed Image ====> 356.775optimized.jpg
Completed Image ====> 357.s-l300.jpg
Completed Image ====> 358.Purslane-Groundcover.jpg
Completed Image ====> 359.file-20-01-2018-08-24-25.jpeg
Completed Image ====> 360.Purslane-facts-and-health-benefits.jpg
Completed Image ====> 361.purslane-weed.jpg
Completed Image ====> 362.stems_750.jpg
Completed Image ====> 363.1488566365Purslane-Portulaca-oleracea-form.jpg
Completed Image ====> 364.Purslane_ip_0038.jpg
Completed Image ====> 365.purslane-blog-header-1.jpg
Completed Image ====> 366.14448499-common-purslane.jpg
Completed Image ====> 367.Purslane.jpg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>
Completed Image ====> 368.rbrain.purslane.jpg
Completed Image ====> 369.Purslane-Rio-Orange.jpg
Completed Image ====> 370.purslane_-Tico-.jpg
Completed Image ====> 371.101_1078.JPG
Completed Image ====> 372.6292408931_c96b4440b8_b.jpg
Completed Image ====> 373.5959808111_49952ffa46_z2.jpg
Completed Image ====> 374.purslaneprod.jpg
Completed Image ====> 375.purslane-health-benefits-2-03312016.jpg
Completed Image ====> 376.Common-purslane-web.jpg
Completed Image ====> 377.1402870328.jpg
Completed Image ====> 378.edible-weeds-purslane-living-awarness.png
Completed Image ====> 379.purslanedalcopyrightedimage1.jpg
Completed Image ====> 380.verdolaga1.jpg
Completed Image ====> 381.tasting-georgia-carla-capalbo-food-eating-weed-1.jpg
Completed Image ====> 382.purslane-egg-salad-640.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 383.purslane.jpg
Completed Image ====> 384.Purslane.jpg
Completed Image ====> 385.Purslane-in-Sweet-Potato-Vines-300x173.jpg
Completed Image ====> 386.purslane+2.png
Completed Image ====> 387.1*-opEI2xzRT3r0yR6QnZo3A.jpeg
Completed Image ====> 388.portulaca-oleracea-14.jpg
Completed Image ====> 389.Upright-Portulaca.jpg
Completed Image ====> 390.l_11641_porcellana-comune-erbe-commestibili.jpg
Completed Image ====> 391.IMG_4922.jpg
Completed Image ====> 392.verdolaga-purslane-recipes-purslane-closeup.jpg
Completed Image ====> 393.20160701Portulaca_oleracea2.jpg
Completed Image ====> 394.Portulaca_Scott_zona+via+flickr.jpg
Completed Image ====> 395.DETA-233.jpg
Completed Image ====> 396.purslane-3894134_960_720.jpg
Completed Image ====> 397.photo-credit-ahmet7-1-900x900.jpg
Completed Image ====> 398.Portulaca_oleracea_Ja_ao_1.jpg
Completed Image ====> 399.Purslane.JPG
Completed Image ====> 400.rdc-ad_102675.jpg
Completed Image ====> 401.20130820-foraged-inbag.jpg
Completed Image ====> 402.GREEN-FUSE-PURSLANE-HOT-SHOT-ROSE-FLAMBEAU-088.jpg
Completed Image ====> 403.DSCN0516new-56a993a43df78cf772a87ae9.jpg
Completed Image ====> 404.18796144252_7978fcbf02_b.jpg
Completed Image ====> 405.purslane-benefits-696x463.jpg
Completed Image ====> 406.purslane-samba-pink-bicolor.jpg
Completed Image ====> 407.hqdefault.jpg
Completed Image ====> 408.garden-portulaca-common-purslane-verdolaga-pigweed-little-hogweed-pusley-plants-blossom-red-flowers-sunny-dayn-126167445.jpg
Completed Image ====> 409.ddd6aeb4fe.jpg
Completed Image ====> 410.The-succulent-leaves-of-Portulaca-oleracea-purslane-is-also-used-in-the-Middle-East-and.png
Completed Image ====> 411.purslane-3.jpg
Completed Image ====> 412.Purslane.jpg
Completed Image ====> 413.purslane_3456_3456_90.jpg
Completed Image ====> 414.purslaneflowersjpg-9ca211b2e420edae.jpg
Completed Image ====> 415.cpurse1.JPG
Completed Image ====> 416.purslane-gravel.jpg
Completed Image ====> 417.original.jpg
Completed Image ====> 418.purslane_facebook.jpg
Completed Image ====> 419.Sea-Purslane-young-leaves-carpeted-1024x576.jpg
Completed Image ====> 420.Purslane_%28Portulaca_oleracea%29_3.jpg
Completed Image ====> 421.pink-purslane-11609-pinkpurslane-p1120554.jpg
Completed Image ====> 422.fab61s00h.jpg
Completed Image ====> 423.20151222_180424.jpg
Completed Image ====> 424.Blossom-Flower-Bloom-Portulaca-Plant-Purslane-2698485.jpg
Completed Image ====> 425.MS487-32_480x480.jpg
Completed Image ====> 426.577699219460c.image.jpg
Completed Image ====> 427.bushy-purslane.jpg
Completed Image ====> 428.Purslane-weed-or-eat-pinsm-2017.jpg
Completed Image ====> 429.common-purslane-portulaca-oleracea-DJ7GEC.jpg
Completed Image ====> 430.portulaca-468x1024.png
Completed Image ====> 431.Purslane-w-text-720x432.jpg
Completed Image ====> 432.image753.png
Completed Image ====> 433.Purslane.jpg
Completed Image ====> 434.whattoeat_lunch_purslane.jpg
Completed Image ====> 435.87828666_XS.jpg
Completed Image ====> 436.purslane.jpg
Completed Image ====> 437.TWE_purslanelaves-1100x550-c-center.jpg
Completed Image ====> 438.purslane-440x409.jpg
Completed Image ====> 439.Pickled-Purslane-Patch.jpg
Completed Image ====> 440.Purslane-9-1.jpg
Completed Image ====> 441.92095713-colorful-common-purslane-flowers-wallpaper-concept-on-a-natural-background.jpg
Completed Image ====> 442.purslane2-sm.jpg
Completed Image ====> 443.purslane-young-2010.jpg
Completed Image ====> 444.Purslane-Portulaca-oleracea.jpg
Completed Image ====> 445.Sea-Purslane-Sesuvium-portulacastrum-1.jpg
Completed Image ====> 446.770optimized.jpg
Completed Image ====> 447.purslane-plants-care-colors-plant-indoors.jpg
Completed Image ====> 448.hy6avany6y3unemasugabe8a4.jpg
Completed Image ====> 449.1528413000_5b19bb48ea3e3.jpg
Completed Image ====> 450.purslane.bmp
Completed Image ====> 451.IMG_6404_2.jpg
Completed Image ====> 452.Sea-purslane-2.jpg
Completed Image ====> 453.purslane-red.jpg
Completed Image ====> 454.Purslane-herb.jpg
Completed Image ====> 455.c6dddd900ba4423fa627ac8349eabef7.jpg
Completed Image ====> 456.3eab8114d55697a98be8d0c42aa0aa0a.jpg
Completed Image ====> 457.Portulaca_oleracea_blossom.jpg
Completed Image ====> 458.purslane-golden-2014.jpg
Completed Image ====> 459.20-flower-seeds-gul-e-shama-purslane-flower-seeds-rainy-season-original-imaey5rqfutyzcsc.jpeg
Completed Image ====> 460.purslane.jpg
Completed Image ====> 461.purslane-for-bone1.jpg
Completed Image ====> 462.dream-meaning-Purslane.jpeg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'ediblenetwork.com'. (_ssl.c:1056)>
Invalid or missing image format. Skipping...
Completed Image ====> 463.portulaca-and-purslane-3-of-4.jpg
Completed Image ====> 464.6659_15833_z.jpg
Completed Image ====> 465.Purslane.jpg
Completed Image ====> 466.purslane-plant-6.jpg
Completed Image ====> 467.Purslane-Salad-2-1024x768.jpg
Completed Image ====> 468.seapurslane1.jpg
Completed Image ====> 469.purslane-5-spurge.jpg
Completed Image ====> 470.flower_750.jpg
Completed Image ====> 471.sp38202.jpg
Completed Image ====> 472.21recipehealth-jumbo.jpg
Completed Image ====> 473.4a1f48.jpg
Completed Image ====> 474.IMG_2302.jpg
Completed Image ====> 475.101422188%20%28640x427%29.jpg
Completed Image ====> 476.GREEN-FUSE-PURSLANE-HOT-SHOT-ROSE-061.jpg
Completed Image ====> 477.936259_6d496e932cea4619b1a3ae064b45a1eamv2-e1535693322513.jpg
Completed Image ====> 478.purslane-tomato-salad-horiz-a-1800.jpg
Completed Image ====> 479.IMG_1000.jpg
Completed Image ====> 480.Purslane-plant.jpg
Completed Image ====> 481.nature-plant-flower-groundcover-flowering-plant-common-purslane-herb-annual-plant-hypericum-1424617.jpg
Completed Image ====> 482.purslane-roots.jpg
Completed Image ====> 483.portulaca-oleracea-4.jpg
Completed Image ====> 484.2011-garden-7-1-kalynskitchen.jpg
Completed Image ====> 485.3787Portulaca-suffrutescens,-Shrubby-Purslane700x465.jpg
Completed Image ====> 486.stock-photo-portulaca-oleracea--purslane-111303-20573.jpg
Completed Image ====> 487.portulaca_oleracea.jpg
Completed Image ====> 488.Purslane.jpg
Completed Image ====> 489.sassafras.png
Completed Image ====> 490.636069396794225188-DSC-0993.jpeg
Completed Image ====> 491.MS487-22_480x480.jpg
Completed Image ====> 492.hqdefault.jpg
Completed Image ====> 493.1-purslane.jpg
Completed Image ====> 494.B4-11.jpg
Completed Image ====> 495.Purslane-Patch-300x189.jpg
Completed Image ====> 496.basil-purslane-005-comp.jpg
Completed Image ====> 497.DVG_004.JPG
Completed Image ====> 498.sea-purslane.jpg
Completed Image ====> 499.purslane-stem-pickles.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 500.purslane-flowering.jpg
Completed Image ====> 501.1-image%20purslanejpg.jpg
Completed Image ====> 502.purslane-1200x520.jpg
Completed Image ====> 503.common-purslane-verdolaga-pigweed-common-purslane-verdolaga-pigweed-little-hogweed-sun-plant-sun-rose-bloom-early-119744052.jpg
Completed Image ====> 504.Sea-purslane-1.jpg
Completed Image ====> 505.Purslane%204.jpg
Completed Image ====> 506.40-Purslane.jpg
Completed Image ====> 507.4089c83976eccc4f05067d482acc88d3.jpg
Completed Image ====> 508.purslane-ground-cover-300x225.jpg
Completed Image ====> 509.fotolia_3834450_XS.jpg
Completed Image ====> 510.14883248-common-purslane-verdolaga-pigweed-little-hogweed-or-pusley.jpg
Completed Image ====> 511.purslane+growing.png
Completed Image ====> 512.depositphotos_213023104-stock-photo-pink-common-purslane-portulaca-oleracea.jpg
Completed Image ====> 513.purslane-portulaca-oleracea-grows-garden-450w-733460797.jpg
Completed Image ====> 514.13842.jpg
Completed Image ====> 515.Common-purslane-seedling.jpg
Completed Image ====> 516.IMG_1074.jpg
Completed Image ====> 517.PicMonkey-Collage.jpg
Completed Image ====> 518.IMG_0053-1024x1024.jpg
Completed Image ====> 519.HR72-Common-Purslane-plant-400x264.jpg
Completed Image ====> 520.purslane-plant-flowers-portulaca-oleracea-aka-verdolaga-pigweed-little-GPXXJW.jpg
Completed Image ====> 521.purslane-salad.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 522.Portulaca_olera_300.jpg
Completed Image ====> 523.Purslane-rose-and-yellow.jpg
Completed Image ====> 524.WhatsApp_Image_2018-06-28_at_05.24.40_grande.jpeg
Completed Image ====> 525.purslane-hot-pink.jpg
Completed Image ====> 526.walnut-purslane-coleslaw.jpg
Completed Image ====> 527.220px-Portulaca_oleracea2.jpg
Completed Image ====> 528.10-12-12+my+garden+harvest2.jpg
Completed Image ====> 529.weeds_purslane3_zoom.jpg
Completed Image ====> 530.GREEN-FUSE-PURSLANE-HOT-SHOT-YELLOW-035.jpg
Completed Image ====> 531.gutter_purslane.jpg
Completed Image ====> 532.1945.jpg
Completed Image ====> 533.Portulaca_oleracea.5.jpg
Completed Image ====> 534.purslane-mixed-900x675.jpg
Completed Image ====> 535.80dcaa67-353c-4e92-b82a-994f83a23647_1.eeea81187009117ff20540f87e8e3159.jpeg
Completed Image ====> 536.FEATURES_180609818_AR_0_SZKJLPRALUPR.jpg
Completed Image ====> 537.health-benefits-of-purslane-or-gulasiman.jpg
Completed Image ====> 538.purslane_golden.jpg
Completed Image ====> 539.liH2o.jpg
Completed Image ====> 540.wpid-0702131826_20130703162457717.jpg
Completed Image ====> 541.wah-11.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 542.purslane_260x260-e1371130616681.jpg
Completed Image ====> 543.purslane_by_chris_root.jpg
Completed Image ====> 544.purslane.jpg
Completed Image ====> 545.summer_purslane.jpg
Completed Image ====> 546.656optimized.jpg
Completed Image ====> 547.100981257.jpg
Completed Image ====> 548.purslane.jpg
Completed Image ====> 549.Herb-Purslane-Green-DSC_2738.jpg
Completed Image ====> 550.DETA-237.jpg
Completed Image ====> 551.PortulacaPortoGrande-2.jpg
Completed Image ====> 552.plants_green_circles-common_purslane_wild_portulaca_portulaca.jpg
Completed Image ====> 553.108417.jpg
Completed Image ====> 554.closeupofsemizotu-1024x768.jpg
Completed Image ====> 555.purslane-flower-big.jpg
Completed Image ====> 556.4600243417_1b560f0b82_b.jpg
Completed Image ====> 557.Portulaca-umbraticola-Wingpod-Purslane4.jpg
Completed Image ====> 558.3788Portulaca-suffrutescens,-Shrubby-Purslane700x465.jpg
Completed Image ====> 559.Purslane,-Pink-1.gif
Completed Image ====> 560.Purslane,%20Common%20(Portulaca%20oleracea)%20Drive%20to%20Springfield%20Farm%20Sapcote%20SP%204828%209273%20(taken%2011.7.2006).JPG
Completed Image ====> 561.PUR.jpg
Completed Image ====> 562.purslane-and-portulaca-1.jpg
Completed Image ====> 563.purslane-leaves.jpg
Completed Image ====> 564.portulak-gemse-portulak-portulaca-oleracea-ssp-sativa-common-purslane-HBM7T1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 565.a-Experimental-field-of-Portulaca-oleracea-purslane-at-the-Ramat-Negev-R-D-station.png
Completed Image ====> 566.pulsane.jpg
Completed Image ====> 567.MS486-22_480x480.jpg
Completed Image ====> 568.depositphotos_213023548-stock-photo-pink-common-purslane-portulaca-oleracea.jpg
Completed Image ====> 569.the_persevering_purslane_1_l7.jpg
Completed Image ====> 570.15094698-little-common-purslane-flowers.jpg
Completed Image ====> 571.purslpix.jpg
Completed Image ====> 572.colorful-purslane-flowers-260nw-1108525937.jpg
Completed Image ====> 573.purslane.jpg
Completed Image ====> 574.3182.jpg
Completed Image ====> 575.Purslane_original.jpeg
Completed Image ====> 576.purslane-peach-apricot.jpg
Completed Image ====> 577.purslane-01.jpg
Completed Image ====> 578.pink-purslane-11609-pinkpurslane-p1070236.jpg
Completed Image ====> 579.picXMXrmQ.jpg
Completed Image ====> 580.purslane-sm.jpg
Completed Image ====> 581.purslane4.jpg
Completed Image ====> 582.produce_purslane.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 583.purslane-patch-2010.jpg
Completed Image ====> 584.GREEN-FUSE-PURSLANE-HOT-SHOT-ORANGE-066.jpg
Completed Image ====> 585.HPL.GH1_.jpg
Completed Image ====> 586.20100823purslane2.jpg
Completed Image ====> 587.purslane1.JPG
Completed Image ====> 588.groene_postelein_webshop_.jpg
Completed Image ====> 589.garden-portulaca-common-purslane-verdolaga-pigweed-little-hogweed-pusley-plants-blossom-red-flowers-sunny-day-123827651.jpg
Completed Image ====> 590.wpid-0703132036.jpg
Completed Image ====> 591.purslane-in-hanging-basket.jpg
Completed Image ====> 592.877.JPG
Completed Image ====> 593.weeds_purslane1_zoom.jpg
Completed Image ====> 594.seapurslane.jpg
Completed Image ====> 595.purslane-puerto-rican-hot-pink-1.jpg
Completed Image ====> 596.Water-purslane-2.gif
Completed Image ====> 597.Portulaca%20oleracea_0.JPG
Completed Image ====> 598.3789Portulaca-suffrutescens,-Shrubby-Purslane700x465.jpg
Completed Image ====> 599.Herb-Golden-Purslane-HB227-LSS-000_7408.jpg
Completed Image ====> 600.47a9a4ba6c861b185f585b82aa2ac8cd--purslane-recipes-purslane-benefits.jpg
Completed Image ====> 601.purslane-flower-full.jpg
Completed Image ====> 602.watermelon%20purslane%20salad_0.jpg
Completed Image ====> 603.9909828.jpg
Completed Image ====> 604.24139a.jpg
Completed Image ====> 605.depositphotos_213023504-stock-photo-pink-common-purslane-portulaca-oleracea.jpg
Completed Image ====> 606.purslane-in-windowbox.jpg
Completed Image ====> 607.Different-types-of-purslane-with-brief-descriptions_Q320.jpg
Completed Image ====> 608.87590070-flowered-purslane-plant.jpg
Completed Image ====> 609.p16t344g891ir5edc111o120v9e84.jpg
Completed Image ====> 610.PurslaneYellow1.jpg
Completed Image ====> 611.Purslane-Hot-Shot-Flambeau-Rose-Green-Fuse-Botanicals.jpg
Completed Image ====> 612.purslane-plant-300x300.jpg
Completed Image ====> 613.779optimized.jpg
Completed Image ====> 614.0e14e8.jpg
Completed Image ====> 615.portulaca-oleracea-common-purslane-also-verdolaga-red-root-or-pursley-used-as-vegetable-salad-and-herb-MFNX50.jpg
Completed Image ====> 616.6H-diGangi-Purslane-Seed-Pods.jpg
Completed Image ====> 617.RHS_WSYD0012494_11644.JPG
Completed Image ====> 618.Purslane-Flowers-Portulaca-Oleracea-L-2464659.jpg
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Completed Image ====> 619.purslane-and-portulaca-3.jpg
Completed Image ====> 620.hqdefault.jpg
Completed Image ====> 621.doha_qatar_may-common_purslane_wild_portulaca_portulaca.jpg
Completed Image ====> 622.purslane-smoothie-recipe.jpg
Completed Image ====> 623.5034972517_e6bf799ab3_o.jpg
Completed Image ====> 624.45930.jpg
Completed Image ====> 625.beautiful-yellow-pink-portulaca-oleracea-flowers-also-known-as-common-purslane-verdolaga-little-hogweed-red-root-pursl-120756034.jpg
Completed Image ====> 626.500_F_249152684_Oy3mMu8Rjr1GEYfA67pR1Mm2FdP53uRI.jpg
Completed Image ====> 627.purslane-gold.jpg
Completed Image ====> 628.DETA-232.jpg
Completed Image ====> 629.1549Portulaca-oleracea,-Common-Purslane700x464.jpg
Completed Image ====> 630.purslane-foraged-wild.jpg
Completed Image ====> 631.500_F_249152152_cLKmdhxlFw1jBpT3v1jJ0JJVph6lIzVk.jpg
Completed Image ====> 632.purslane-vitamins-and-antioxidant1.jpg
Completed Image ====> 633.Purslane-pink-2.gif
Completed Image ====> 634.starterpurslane-822x1024.jpg
Completed Image ====> 635.HPL.Vegetative2.jpg
Completed Image ====> 636.6729656371_5396d56f4f_b.jpg
Completed Image ====> 637.recipe_main_IMG_8796.jpg
Completed Image ====> 638.99ef383c1e61271c949b07b87ec54ed5.jpg
Completed Image ====> 639.Screen-Shot-2016-03-07-at-3.01.52-PM.png
Completed Image ====> 640.773optimized.jpg
Completed Image ====> 641.White_Purslane_01_0.jpg
Completed Image ====> 642.Herbal_Green_Purslane_Portulaca_oleracea_L._Heirloom_Seeds__22134.1540401696.jpg
Completed Image ====> 643.bright-yellow-flowers-of-common-purslane-portulaca-oleracea-succulent-plant-in-natural-gardens-of-rolle-town-in-switzerland-on-sunny-summer-day-PCYJB0.jpg
Completed Image ====> 644.81120283-beautiful-of-common-purslane-flower-concept-nature-beautiful-.jpg
Completed Image ====> 645.wild-purslane-superfood-ingredient.jpg
Completed Image ====> 646.20151222_180358.jpg
Completed Image ====> 647.web%202.jpg
Completed Image ====> 648.ludwigia-palustris-13.jpg
Completed Image ====> 649.purslane-2-copy1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 650.Herb-Golden-Purslane-HB222-DSC03679.jpg
Completed Image ====> 651.Wingpod_purslane_%28Portulaca_umbraticola%29_flowers.jpg
Completed Image ====> 652.PurslaneFruit.jpg
Completed Image ====> 653.DETA-71.jpg
Completed Image ====> 654.Post-15-Purslane-1024x681.jpg
Completed Image ====> 655.portulaca-flower-blooming-garden-common-purslane-portulaca-flower-blooming-garden-common-purslane-136140398.jpg
Completed Image ====> 656.winterpostelein_webshop_.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 657.3cc7b7.jpg
Completed Image ====> 658.Field-Notes-Purslane.jpg
Completed Image ====> 659.purslane-bright-pink.jpg
Completed Image ====> 660.Sea%20Purslane.jpg
Completed Image ====> 661.Portulaca_um_300.jpg
Completed Image ====> 662.P1110877.png
Completed Image ====> 663.MS487-42_480x480.jpg
Completed Image ====> 664.777optimized.jpg
Completed Image ====> 665.71f36ce5382f4b6cfea8518c52bf8f2e.jpg
Completed Image ====> 666.9509976199_223b640144_z.jpg
Completed Image ====> 667.portulaca-oleracea-plant.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 668.portulaca-oleracea-common-purslane-also-verdolaga-red-root-or-pursley-used-as-vegetable-salad-and-herb-MFNX5A.jpg
Completed Image ====> 669.hqdefault.jpg
Completed Image ====> 670.beautiful-pink-portulaca-oleracea-flowers-also-known-as-common-purslane-verdolaga-little-hogweed-red-root-pursley-beautiful-120756849.jpg
Completed Image ====> 671.Purslane-1.jpg
Completed Image ====> 672.e1e8b3.jpg
Completed Image ====> 673.purslane_seedling_zoom.jpg
Completed Image ====> 674.ludwigia-palustris-water-primrose_0812_121858.jpg
Completed Image ====> 675.purslane-FM.jpg
Completed Image ====> 676.portulaca-and-purslane-2-of-4.jpg
Completed Image ====> 677.220px-Stewartonflower2.JPG
Completed Image ====> 678.f2c195eb6aad458a96f90cb9c725f187.jpg
Completed Image ====> 679.3786Portulaca-suffrutescens,-Shrubby-Purslane700x465.jpg
Completed Image ====> 680.DETA-234.jpg
Completed Image ====> 681.portulaca-oleracea-purslane-plant-andvalo-sierra-de-aracena-huelva-andalucia-spain-europe-XATBGW.jpg
Completed Image ====> 682.o_19lul6uit11hd1a5q172v16vs18ij8.jpg
Completed Image ====> 683.purslane-raven-7-7-18.jpg
Completed Image ====> 684.Greens_Golden_Purslane_LSS_000_4571.jpg
Completed Image ====> 685.sea-purslane.jpg
Completed Image ====> 686.web%203.jpg
Completed Image ====> 687.PinkPurslane_P1110522.jpg
Completed Image ====> 688.pink-common-purslane-portulaca-oleracea-verdolaga-red-root-pink-common-purslane-portulaca-oleracea-verdolaga-red-root-125832393.jpg
Completed Image ====> 689.1eedfc26f4b5e26d258d144a5fe795bf.jpg
Completed Image ====> 690.8962Portulaca-oleracea,-Common-Purselane350x.jpg
Completed Image ====> 691.maxresdefault.jpg
Completed Image ====> 692.7982044498_19d420dc86_b.jpg
Completed Image ====> 693.portulaca-oleracea-common-purslane-also-verdolaga-red-root-or-pursley-used-as-vegetable-salad-and-herb-MFNX5B.jpg
Completed Image ====> 694.6a7f61.jpg
Completed Image ====> 695.beautiful-yellow-pink-portulaca-oleracea-flowers-also-known-as-common-purslane-verdolaga-little-hogweed-red-root-pursley-120755532.jpg
Completed Image ====> 696.Calandrinia-spectabilis-Rock-Purslane3.jpg
Completed Image ====> 697.portulaca-oleracea-apex.jpg
Completed Image ====> 698.chaffweed-n-water-purslane.jpg
Completed Image ====> 699.2a1905efefabc9facd9645010553287a.jpg
Completed Image ====> 700.maxresdefault.jpg
Completed Image ====> 701.ddc574-250.jpg
Completed Image ====> 702.common-purslane-verdolaga-pigweed-little-hogweed-pursley-portulak-FAK42Y.jpg
Completed Image ====> 703.red-common-purslane-verdolaga-pigweed-little-hogweed-pusley-flowers-red-common-purslane-verdolaga-pigweed-112808321.jpg
Completed Image ====> 704.hqdefault.jpg
Completed Image ====> 705.6748157923_0f69cf3cb7_b.jpg
Completed Image ====> 706.beautiful-white-portulaca-oleracea-flower-also-known-as-common-purslane-verdolaga-little-hogweed-red-root-or-pursley-PN7EF4.jpg
Completed Image ====> 707.beautiful-yellow-portulaca-oleracea-flowers-also-known-as-common-purslane-verdolaga-little-hogweed-red-root-pursley-beautiful-120757310.jpg
Completed Image ====> 708.120723035217-purslane-eatocracy-story-top.jpg
Completed Image ====> 709.purslane-growing-in-a-crack-between-the-asphalt-and-concrete-of-a-parking-lot-in-englewood-cliffs-new-jersey-usa-S28JBD.jpg
Completed Image ====> 710.2-harvesting-purslane.jpg
Completed Image ====> 711.purslane-close-up-scientific-name-portulaca-oleracea-44912921.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 711 is all we got for this search filter!

Errors: 24

Lamb's Quarters

keywords["keywords"] = "lamb's quarters"
lambs_ear_paths = google_images.download(keywords)

Item no.: 1 --> Item name = lamb's quarters
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.IMG_4309.jpg
Completed Image ====> 2.IMG_4307.jpg
Completed Image ====> 3.40081273240_cafa250f47_b.jpg
Completed Image ====> 4.lambs-quarters_IMG_0449_grande.jpg
Completed Image ====> 5.47-Lambsquarters.jpg
Completed Image ====> 6.lambs-quarters.jpg
Completed Image ====> 7.Chenopodium_album.jpg
Completed Image ====> 8.IMG_1655.jpg
Completed Image ====> 9.Lambs-Quarters.jpg
Completed Image ====> 10.il_794xN.1817708283_5fxu.jpg
Completed Image ====> 11.lambs-quarters-picture.jpg
Completed Image ====> 12.hqdefault.jpg
Completed Image ====> 13.800px-ChenopodiumAlbum001.jpg
Completed Image ====> 14.lq1.jpg
Completed Image ====> 15.0606LambsQ3.JPG
Completed Image ====> 16.lambsquarter-jpg.jpg
Completed Image ====> 17.897fdb7d41b2a40bd388739950cde303.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 18.IMG_1949.JPG
Completed Image ====> 19.maxresdefault.jpg
Completed Image ====> 20.Pinching-off-the-tender-tops-of-lambs-quarters.jpg
Completed Image ====> 21.Lambsquarter-a.jpg
Completed Image ====> 22.lambs-quarters-leaves.jpg
Completed Image ====> 23.lambs-quarters-sq-jpg.jpg
Completed Image ====> 24.chenopodium-album.jpg
Completed Image ====> 25.Lambs-quarters-Chenopodium-album-2.jpg
Completed Image ====> 26.lambsquarters1.jpg
Completed Image ====> 27.lambsquarterpin.jpg
Completed Image ====> 28.lambs-quarters-mature.jpeg
Completed Image ====> 29.athens-plants-062.jpg
Completed Image ====> 30.Lambsquarters%2003%20sm.jpg
Completed Image ====> 31.Chenopodium%20album%20L,%20Lamb%27s%20quarters-4-2008.jpg
Completed Image ====> 32.Lambs-Quarter.jpg
Completed Image ====> 33.lambsquarters-02.jpg
Completed Image ====> 34.40081272830_f0f1056999_b.jpg
Completed Image ====> 35.lambsquarters.jpeg
Completed Image ====> 36.29188940515_011c8fa723.jpg
Completed Image ====> 37.41171244464_b24073acc0_b.jpg
Completed Image ====> 38.fab09s00g.jpg
Completed Image ====> 39.lambs-quarter-Breckenridge.jpg
Completed Image ====> 40.61WGWZagnhL.jpg
Completed Image ====> 41.lambsquarter-400x300.jpg
Completed Image ====> 42.220px-Melganzenvoet_bloeiwijze_Chenopodium_album.jpg
Completed Image ====> 43.IMG_1879.JPG
Completed Image ====> 44.Close-up-of-the-waxy-coating-on-the-underside-of-a-lambs-quarter-leaf.jpg
Completed Image ====> 45.Lambs-Quarter-Young.jpg
Completed Image ====> 46.lambs-quarters-chenopodium-album-seeds-amkha-seed_706.jpg
Completed Image ====> 47.foraging.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 48.5b2a52850161a1000dd71aed-original.jpg
Completed Image ====> 49.3523545063_9992f08b83.jpg
Completed Image ====> 50.lambs-quarters-pesto.jpg
Completed Image ====> 51.lambs%2Bquarters.JPG
Completed Image ====> 52.dsc_0144.jpg
Completed Image ====> 53.fab09s00d.jpg
Completed Image ====> 54.chenopodium-album-062016.jpg
Completed Image ====> 55.img_8180.jpg
Completed Image ====> 56.LambsQuarter.jpg
Completed Image ====> 57.86741699919aac9fa183c76694193c41--wild-edibles-food-nutrition.jpg
Completed Image ====> 58.lambsquarters-1100x825.jpg
Completed Image ====> 59.Lambsquarter_wholeplant_edited_300.jpg
Completed Image ====> 60.LambsQuarters.jpg
Completed Image ====> 61.LambsQuarters.jpg
Completed Image ====> 62.Lambsquarter-e.jpg
Completed Image ====> 63.lambsquarters_orach.jpg
Completed Image ====> 64.rbrain.lambs_.quarter.jpg
Completed Image ====> 65.Lambs_Quarters-300x432.jpg
Completed Image ====> 66.lamquart4.jpeg
Completed Image ====> 67.IMG_1654.jpg
Completed Image ====> 68.Lamb%2527s%2BQuarters.jpg
Completed Image ====> 69.51OS2UgE4VL._SX425_.jpg
Completed Image ====> 70.3-lambsquarter-dsc05877-3.jpg
Completed Image ====> 71.fat-hen-or-lambs-quarters-chenopodium-album-young-plants-of-annual-arable-and-garden-weed-may-MTF1HD.jpg
Completed Image ====> 72.Lambsquarter-b.jpg
Completed Image ====> 73.182716-004-C85BE7CA.jpg
Completed Image ====> 74.Chenopodium_shutterstock_207628225.jpg
Completed Image ====> 75.91610fc0652c10b7aaa2cd451264ff87.jpg
Completed Image ====> 76.9051444567_083a1fb386_b.jpg
Completed Image ====> 77.Lambs-Quarters-9.jpg
Completed Image ====> 78.Screen-Shot-2013-07-07-at-5.10.49-PM.png
Completed Image ====> 79.s-l300.jpg
Completed Image ====> 80.Chenopodium-album-L-Lambs-quarters-3-2008.jpg
Completed Image ====> 81.maxresdefault.jpg
Completed Image ====> 82.8262ab93f6f146ce5560f5d9bfcf842a.jpg
Completed Image ====> 83.image38.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 84.Common_Lambsquarters6.JPG
Completed Image ====> 85.Chenopodium%20botrys.jpg
Completed Image ====> 86.lambs-quarter-or-pigweed-21657003.gif
Completed Image ====> 87.s648401865701383597_p96_i1_w1600.jpeg
Completed Image ====> 88.6-dust-and-spots-lambsquarter-dsc05871-2.jpg
Completed Image ====> 89.Lambsquarters%20from%20above%20sm.jpg
Completed Image ====> 90.PICT0807.JPG
Completed Image ====> 91.IMG_1429.jpg
Completed Image ====> 92.5.jpg
Completed Image ====> 93.HR-5-1-1-Lambs-Quarters-seedlings.jpg
Completed Image ====> 94.Oct-7-WFF-2.jpg
Completed Image ====> 95.Lamb_s_Quarters.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 96.pix_lambsquarter_smythe.jpg
Completed Image ====> 97.lambsquarters-seedling.jpg
Completed Image ====> 98.lambs-quarters-s.jpg
Completed Image ====> 99.182716-004-C85BE7CA.jpg
Completed Image ====> 100.lambs-quarters1.jpg
Completed Image ====> 101.Lambs-Quarters-6.jpg
Completed Image ====> 102.lambsquarters4.jpg
Completed Image ====> 103.IMG_20130704_080545_403_original.jpg
Completed Image ====> 104.lambsquarters.jpg
Completed Image ====> 105.lambs-flower-big.jpg
Completed Image ====> 106.Lambs-Quarters.jpg
Completed Image ====> 107.20160602_150859_1024x1024.jpg
Completed Image ====> 108.7.jpg
Completed Image ====> 109.lambs-quarters-soup.jpg
Completed Image ====> 110.lambs%20quarters%20seed%20head%20sm.jpg
Completed Image ====> 111.crop_common_lambsquarters_robert_videki_doronicum_kft_bugwood.jpg
Completed Image ====> 112.Lambs-Quarters-5.jpg
Completed Image ====> 113.file.jpeg
Invalid or missing image format. Skipping...
Completed Image ====> 114.chenopodium-album-87-2.jpg
Completed Image ====> 115.s-l300.jpg
Completed Image ====> 116.719NOVaKu7L._SY550_.jpg
Completed Image ====> 117.lambs-quarter-leaf.jpg
Completed Image ====> 118.IMG_2730.jpg
Completed Image ====> 119.goosefoot.jpg
Completed Image ====> 120.Lambs-Quarters.jpg
Completed Image ====> 121.lambsquarterleaf-med.jpg
IOError on an image...trying next one... Error: The read operation timed out
Completed Image ====> 122.lambsquarters-01.jpg
Completed Image ====> 123.maxresdefault.jpg
Completed Image ====> 124.lambsquarters4b.jpg
Completed Image ====> 125.LambsQuartersFrittata6.jpg
Completed Image ====> 126.lambs-quarters.jpg
Completed Image ====> 127.Chenopodium-Album-Lambs-Quarters-Edible~~element27.jpg
Completed Image ====> 128.chenopodium-album-lambs-quarters-0908_105734.jpg
Completed Image ====> 129.Lambs_Quarters_Leaves_2.jpg
Completed Image ====> 130.il_794xN.1275007463_l1ky.jpg
Completed Image ====> 131.HR-5-1-2-Lambs-Quarters-leaves.jpg
Completed Image ====> 132.Lambsquarter_leaves_edited_300.jpg
Completed Image ====> 133.f96c29b825fbf543dd7f2a673f944fb5.jpg
Completed Image ====> 134.lambsquarters4c.jpg
Completed Image ====> 135.maxresdefault.jpg
Completed Image ====> 136.LambsQtrs.jpg
Completed Image ====> 137.Lambsquarters%2001%20sm.jpg
Completed Image ====> 138.lambs-quarters.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 139.6fce5b9e90c97be49bf3f2720ab5b631.jpg
Completed Image ====> 140.lambs_quarters_wild_crafted.jpg
Completed Image ====> 141.28569084463_d658acc87f.jpg
Completed Image ====> 142.Lambs-Quarters-Netseed-Pitseed-Goosefoot-Chenopodium-Berlandieri-3-Annual-FORB-Amaranth-Family-Amaranthaceae-NORTH-CENTRAL-A.-Blooms-Jul-Sep-Wet-Prairies-Meadows-Dry-Full-sun-1-4ft.jpg
Completed Image ====> 143.lambs-quarters.jpg
Completed Image ====> 144.20130523_141558.jpg
Completed Image ====> 145.fat-hen-or-lambs-quarters-chenopodium-album-young-plants-of-annual-arable-and-garden-weed-may-MTF1GH.jpg
Completed Image ====> 146.HR-5-1-3-Lambs-Quarters-plant.jpg
Completed Image ====> 147.lambsquarters4.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 148.lambs-quarter-pesto.jpg
Completed Image ====> 149.chenop-thumb-400x586-48787.jpg
Completed Image ====> 150.Lambs_Quarters_Leaves_1.jpg
Completed Image ====> 151.nature-shutterstock-editorial-4594294a.jpg
Completed Image ====> 152.1200px-Chenopodium_berlandieri_NPS-1.jpg
Completed Image ====> 153.Lambs-Quarters-Netseed-Pitseed-Goosefoot-Chenopodium-Berlandieri-2-Annual-FORB-Amaranth-Family-Amaranthaceae-NORTH-CENTRAL-A.-Blooms-Jul-Sep-Wet-Prairies-Meadows-Dry-Full-sun-1-4ft.jpg
Completed Image ====> 154.1212974ed1.jpg
Completed Image ====> 155.lambs-quarters-adult.jpg
Completed Image ====> 156.Herb-of-the-Day-lambs-quarters-mcrl234e37pfyw0mb16oftuez75gn62tz1649sj444.jpg
Completed Image ====> 157.immages.jpg
Completed Image ====> 158.lambs-quarters-lambsquarters-pigweed-fat-hen-chenopodium-album-blooming-A9FT79.jpg
Completed Image ====> 159.chenopodium-album-798739.jpg
Completed Image ====> 160.fab09s00a.jpg
Completed Image ====> 161.kirsten_johnson_28054192382_93de2f8413_b.jpg
Completed Image ====> 162.hqdefault.jpg
Completed Image ====> 163.30483712507_9e2e38ae05_b.jpg
Completed Image ====> 164.5229b51ea69925208718db9d1b5b6bb0.jpg
Completed Image ====> 165.v4-460px-Eat-Lamb%27s-Quarters-Step-9.jpg
Completed Image ====> 166.lambsquarters2.JPG
Completed Image ====> 167.Chenopodium%20album%20L,%20Lamb%27s%20quarters-2-2008.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 168.salt-and-vinegar-lambs-quarters.jpg
Completed Image ====> 169.005.jpg
Completed Image ====> 170.orache-plant2.jpg
Completed Image ====> 171.LambsQuarters_01.JPG
Completed Image ====> 172.lambs-quarters.png
Completed Image ====> 173.51238110_lambs-quarters_1x1.jpg
Completed Image ====> 174.SkxLOCRxxb.jpg
Completed Image ====> 175.90e5ca26a56faf42ff0f0783aabc93cb.jpg
Completed Image ====> 176.112491716-leaves-and-stem-of-lamb-s-quarters-chenopodium-album-.jpg
Completed Image ====> 177.full_Magenta_20lambs_20quarter.019.jpg
Completed Image ====> 178.IMG_0401-520x346.jpg
Completed Image ====> 179.lambs-quarters-melde-goosefoot-chenopodium-album-X2RMK2.jpg
Completed Image ====> 180.lambsquarters-full.jpg
Completed Image ====> 181.lambs-quarters-herb-img-300x193.jpg
Completed Image ====> 182._DSC0137.JPG
Completed Image ====> 183.Lambs4.jpg
Completed Image ====> 184.maxresdefault.jpg
Completed Image ====> 185.1-Lambs-Quarters-Inhabited-Kitchen.jpg
Completed Image ====> 186.Lambs-Quarters-3.jpg
Completed Image ====> 187.28018891288_31c2cd1a4b_b.jpg
Completed Image ====> 188.crop_common_lambsquarters_2_robert_videki_doronicum_kft_bugwood.jpg
Completed Image ====> 189.chickweed_021.jpg
Completed Image ====> 190.HR-5-1-4-Lambs-Quarters-top.jpg
Completed Image ====> 191.img-1363_1.jpg
Completed Image ====> 192.500_F_193778423_7i6ckxnSO5f8RsqhWE8gH8yxyQkBmOJj.jpg
Completed Image ====> 193.dscn1013.jpg
Completed Image ====> 194.Peronospora_variabilis_on_Lamb%27s_Quarters_-_Chenopodium_album_%2831548635238%29.jpg
Completed Image ====> 195.tumblr_oqazp7GE5X1wni7kuo4_250.jpg
Completed Image ====> 196.Lambs_quarters002_RMueller.jpg
Completed Image ====> 197.57dc6835e6cbd.image.jpg
Completed Image ====> 198.SS2227502.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 199.lambs+quarters.jpg
Completed Image ====> 200.IMG_1361-e1437760717931.jpg
Completed Image ====> 201.chenopodium-album-lambs-quarters-melde-260nw-1033466230.jpg
Completed Image ====> 202.lambs-quarters-chenopodium-album-X85Y0W.jpg
Completed Image ====> 203.chal_wp.jpg
Completed Image ====> 204.Lambs_quarters_29_Aug_2018.jpg
Completed Image ====> 205.Lambs-quarters-Chenopodium-murale-and-ilima-with-wedge-tailed-shearwater-burrows-in.png
Completed Image ====> 206.35156896_1729018500487422_5909210383171715072_n.jpg
Completed Image ====> 207.Lambsquarter_wholeplant2_edited_300.jpg
Completed Image ====> 208.lambs-quarters-adult2.jpg
IOError on an image...trying next one... Error: The read operation timed out
Completed Image ====> 209.b8a30e1dfe29bd0c791547ef64f3c453.jpg
Completed Image ====> 210.cream-lambsquarter-soup-3.jpg
Completed Image ====> 211.lambs_quarters_1.jpg
Completed Image ====> 212.613095d678c8801d1745622f5f639cd7.jpg
Completed Image ====> 213.51q94dCQzAL._SX425_.jpg
Completed Image ====> 214.IMG_1877.JPG
Completed Image ====> 215.Chenopodium_album_ENBLA02.jpg
Completed Image ====> 216.img-5209.jpg
Completed Image ====> 217.lambs+quarters+close+up.jpg
Completed Image ====> 218.7f2ffa7e-bc4f-414a-a8de-f2c21e355194_1.39b1cae850ed21b5773290f5fdebff94.jpeg
Completed Image ====> 219.F_lambs_quarters.jpeg
Completed Image ====> 220.lambs-quarters-weed-199x300.jpg
Completed Image ====> 221.IMG_2043wb15.jpg
Completed Image ====> 222.lambsquarters_blanch.jpg
Completed Image ====> 223.fat-hen-or-lambs-quarters-chenopodium-album-flowering-weed-in-a-growing-maize-crop-berkshire-july-PC38CF.jpg
Completed Image ====> 224.10426207745_8853221b72_k-758x505.jpg
Completed Image ====> 225.Young-lambs-quarters.jpg
Completed Image ====> 226.08-05.gif
Completed Image ====> 227.lams-quarters-2.jpg
Completed Image ====> 228.chenopodium-album-lambs-quarters-melde-260nw-1036713301.jpg
Completed Image ====> 229.chenopodium-album-63897-2.jpg
Completed Image ====> 230.500_F_193778323_NN4beemWLlqJwumEPHnGFaH0UwTEfwrs.jpg
Completed Image ====> 231.lqbrick-thumb-360x482-79892.jpg
Completed Image ====> 232.Lambs-Quarters-3.jpg
Completed Image ====> 233.lambs_quarters5_zoom.jpg
Completed Image ====> 234.wild-spinach-dip-951x1024.jpg
Completed Image ====> 235.lambs_quarters_3.jpg
Completed Image ====> 236.6d228785fa830afbc7a8b8425490c795.jpg
Completed Image ====> 237.Lambs-quarters-Chenopodium-34172.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 238.Lambs-Quarters-1.jpg
Completed Image ====> 239.lambsquarters14.jpg
Completed Image ====> 240.140720_0063.jpg
Completed Image ====> 241.Lambs-Quarters-Netseed-Pitseed-Goosefoot-Chenopodium-Berlandieri-4-Annual-FORB-Amaranth-Family-Amaranthaceae-NORTH-CENTRAL-A.-Blooms-Jul-Sep-Wet-Prairies-Meadows-Dry-Full-sun-1-4ft.jpg
Completed Image ====> 242.doha_qatar_march-lamb_quarters_chenopodium_album_white.jpg
Completed Image ====> 243.fat-hen-or-lambs-quarters-chenopodium-album-young-plants-of-annual-arable-and-garden-weed-may-MTF1GM.jpg
Completed Image ====> 244.35c86c.jpg
Completed Image ====> 245.lambsquarters.jpg
Completed Image ====> 246.lambsquarters-growing.jpg
Completed Image ====> 247.washed-lambs-quarters.jpg
Completed Image ====> 248.Chenopodium-album.png
Completed Image ====> 249.2012-06-28_16-20-55_744.jpg
Completed Image ====> 250.IMG_1767wb15.jpg
Completed Image ====> 251.weeds-lambs-quarters-706x369.jpg
Completed Image ====> 252.maxresdefault.jpg
Completed Image ====> 253.7beb6d8135cd8433087c62b401211320.jpg
Completed Image ====> 254.lambsquarters.jpg
Completed Image ====> 255.cam01503.jpg
Completed Image ====> 256.aid8858767-v4-728px-Harvest-Lamb%27s-Quarters-Step-2.jpg
Completed Image ====> 257.lambs_quarters8_zoom.jpg
Completed Image ====> 258.1403.jpeg
Completed Image ====> 259.myeongaju.jpg
Completed Image ====> 260.file.jpg
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Completed Image ====> 261.img-1364-orig.jpg
Completed Image ====> 262.lambs-quarters.jpg
Completed Image ====> 263.2942184_orig.jpg
Completed Image ====> 264.large.jpg
Completed Image ====> 265.IMG_0473.jpg
Completed Image ====> 266.80182000.jpg
Completed Image ====> 267.lambsquarter.jpg
Completed Image ====> 268.lambs-quarters-chenopodium-album-ssp-album-X5CXAR.jpg
Completed Image ====> 269.lamb-s-quarters.JPG
Completed Image ====> 270.chenopodium-album-goosefoot.jpg
Completed Image ====> 271.45372555122_802325f736_b.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 272.maxresdefault.jpg
Completed Image ====> 273.IMG_1838.JPG
Completed Image ====> 274.one-of-four-carrots.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 275.lambs-quarters-flower-plant-bud-260nw-1234938670.jpg
Completed Image ====> 276.16.jpg
Completed Image ====> 277.lambsquarter-leaf.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 278.lambs-quarters-grown-under-dry-conditions-300-.jpg
Completed Image ====> 279.0071.jpg
Completed Image ====> 280.Lambsquarter-d.jpg
Completed Image ====> 281.Lambs-Quarter.jpg
Completed Image ====> 282.lambs-quarter12.jpg
Completed Image ====> 283.28018892828_779a102ecd_b.jpg
Completed Image ====> 284.372E92F9-C82A-42EF-846F-0EFBD528C64F.jpeg
Completed Image ====> 285.fab09s00c.jpg
Completed Image ====> 286.dsc_0042.jpg
Completed Image ====> 287.maxresdefault.jpg
Completed Image ====> 288.magenta-lambs-quarters-tree-spinach-chenopodium-giganteum-with-love-lies-bleeding-amaranthus-caudatus-X96XEY.jpg
Completed Image ====> 289.4632089665_45b904941c_z.jpg
URLError on an image...trying next one... Error: <urlopen error _ssl.c:1039: The handshake operation timed out>
Completed Image ====> 290.Lambs-Quarters-7464-1024x819.jpg
Completed Image ====> 291.Chenopodium-Album-Lambs-Quarters-Edible~~element9.jpg
Completed Image ====> 292.0014.jpg
Completed Image ====> 293.Chenopodium-album.commons.wikipedia.org_.jpg
Completed Image ====> 294.lambs-quarters-roots-clipped.jpg
Completed Image ====> 295.80181999.jpg
Completed Image ====> 296.chenopodium-album-lambs-quarters-melde-260nw-1037340853.jpg
Completed Image ====> 297.lambs-quarters-purslane-compressed.jpg
Completed Image ====> 298.Lambs-Quarters.jpg
Completed Image ====> 299.D869_29_197_1200.jpg
Completed Image ====> 300.Chenopodium-album-L-Lambs-Quarters-a-highly-edible-plant-and-ubiquitous-weed-in-fields.png
Completed Image ====> 301.f01817b340a1aa945b0438d27c5661bc.jpg
Completed Image ====> 302.lambs_quarters6_zoom.jpg
Completed Image ====> 303.forager_marie%2Bviljoen.jpg
Completed Image ====> 304.lambsquarters.jpg
Completed Image ====> 305.my-lambs-quarters-garden.jpg
Completed Image ====> 306.lambs-quarters-cooked.jpg
Completed Image ====> 307.b7a83d-250.jpg
Completed Image ====> 308.DSC_9761-1024x685-426x426.jpg
Completed Image ====> 309.12.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 310.20150705_170945.jpg
Completed Image ====> 311.IMG_0826-1-1024x683.jpg
Completed Image ====> 312.dry-lambs-quarters.jpg
Completed Image ====> 313.500_F_193778251_KYlKL8m4BRfftCQ5d1ES9kfHUfVZhkMr.jpg
Completed Image ====> 314.DSCF09231.jpg
Completed Image ====> 315.Lambs-Quarters-620x413.jpg
Completed Image ====> 316.rbrain.purslane.jpg
Completed Image ====> 317.Saut%C3%A9ed_Lambsquarters.png
Invalid or missing image format. Skipping...
Completed Image ====> 318.0012.jpg
Completed Image ====> 319.LambsQuarters_02.JPG
Completed Image ====> 320.lambs-quarters-herbal-salt.jpg
Completed Image ====> 321.lambs-quarters.jpg
Completed Image ====> 322.lambsquarters-1024x765.jpg
Completed Image ====> 323.aid8858767-v4-728px-Harvest-Lamb%27s-Quarters-Step-4.jpg
Completed Image ====> 324.Lambs-Quarters-21.jpg
Completed Image ====> 325.lambs-quarters-2.png
Completed Image ====> 326.lambs-quarters-young.jpg
Completed Image ====> 327.purple_spots_300x300%2523.jpg
Completed Image ====> 328.maxresdefault.jpg
Completed Image ====> 329.Giant+Lambs+Quarters.jpg
Completed Image ====> 330.pre-rm01936240170.jpg
Completed Image ====> 331.5751933357_99b301cd8b_b.jpg
Completed Image ====> 332.l1.jpg
Completed Image ====> 333.Wild-Greens-with-Venison-Bacon-2-1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 334.13.jpg
Completed Image ====> 335.lambs-quarters-seed.jpg
Completed Image ====> 336.Lambs-Quarters-Netseed-Pitseed-Goosefoot-Chenopodium-Berlandieri-5-Annual-FORB-Amaranth-Family-Amaranthaceae-NORTH-CENTRAL-A.-Blooms-Jul-Sep-Wet-Prairies-Meadows-Dry-Full-sun-1-4ft.jpg
Completed Image ====> 337.1210b5cec8.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 338.lamquart2.jpg
Completed Image ====> 339.Lambsquarters-G017710.jpg
Completed Image ====> 340.28566737544_e0f829e2ec.jpg
Completed Image ====> 341.lambs-quarters-young-400x300.jpg
Completed Image ====> 342.6a00d83451fd1569e2016302ceb912970d-500wi.jpg
Completed Image ====> 343.lambsquarters.jpg
Completed Image ====> 344.IMG_0608.jpg
Completed Image ====> 345.lambs_quarters_4.jpg
Completed Image ====> 346.chenopodium_album_1.jpg
URLError on an image...trying next one... Error: <urlopen error [Errno -5] No address associated with hostname>
Completed Image ====> 347.bwi-blws143108.jpg
Completed Image ====> 348.fab09s00h.jpg
Completed Image ====> 349.Pin-template-2.jpg
Completed Image ====> 350.Lambs-Quarters.jpg
Completed Image ====> 351.lambs-quarters-flowering-300x400.jpg
Completed Image ====> 352.chenopodium-album-lambs-quarters-melde-450w-1034298304.jpg
Completed Image ====> 353.Peronospora_variabilis_on_Lamb%27s_Quarters_-_Chenopodium_album_%2845372554682%29.jpg
Completed Image ====> 354.Svinm%C3%A5lla.jpg
Completed Image ====> 355.img_0893-e1400525960569.jpg
Completed Image ====> 356.chenopodium-album-plant.jpg
Completed Image ====> 357.lambs-quarters-picked-plate-600x399.jpg
Completed Image ====> 358.I0000aOk4TlQru7w.jpg
Completed Image ====> 359.Lambs_quarters001_RMueller.jpg
Completed Image ====> 360.magenta-lambs-quarters-tree-spinach-chenopodium-giganteum-red-coloured-CNRCTJ.jpg
Completed Image ====> 361.il_570xN_1090248669_2gts.jpg
Completed Image ====> 362.RMRS-2012-15.jpg
Completed Image ====> 363.35942340585_1bd7ed663e_b.jpg
Completed Image ====> 364.Lambs-Quarters-Netseed-Pitseed-Goosefoot-Chenopodium-Berlandieri-1-Annual-FORB-Amaranth-Family-Amaranthaceae-NORTH-CENTRAL-A.-Blooms-Jul-Sep-Wet-Prairies-Meadows-Dry-Full-sun-1-4ft.jpg
Completed Image ====> 365.imgbin-quinoa-chenopodium-pallidicaule-lambs-quarters-chenopodium-giganteum-organic-food-quinoa-wheat-field-material-8A4P6AycGd8WeFetuzm359CYB.jpg
Completed Image ====> 366.lambs-quarters.png
Completed Image ====> 367.lambs-quarters-bloom.jpg
Completed Image ====> 368.lambs-quarters-seed-album.jpg
Completed Image ====> 369.lambsquarter.jpg
Completed Image ====> 370.Lambs-Quarter-and-the-compost-heap-1-e1514828833127.jpg
Completed Image ====> 371.img_0893.jpg
Completed Image ====> 372.lambsquarters.jpg
Completed Image ====> 373.lamquart3.jpg
Completed Image ====> 374.chenopodium_album_young.jpg
Completed Image ====> 375.45460.jpg
Completed Image ====> 376.070828_CCU_AW_Amaranth_8443_dlh.jpg
Completed Image ====> 377.lambsquarter4.jpg
Completed Image ====> 378.Chenalbu_1.jpg
Completed Image ====> 379.image53.jpg
Completed Image ====> 380.fhr-88888-13286-686.jpg
Completed Image ====> 381.I0000dDk0eIx4C98.jpg
Completed Image ====> 382.0013.jpg
Completed Image ====> 383.maxresdefault.jpg
Completed Image ====> 384.doha_qatar_march-lamb_quarters_chenopodium_album_taken.jpg
Completed Image ====> 385.LambsQuartersEdibleWeed.jpg
Completed Image ====> 386.26160995259_3a485daaed_b.jpg
Completed Image ====> 387.35142503_1729018573820748_7117205961357393920_n.jpg
Completed Image ====> 388.tumblr_nr5cdnnEpq1qfpdsqo1_400.jpg
Completed Image ====> 389.54446662_126516235117284_2366701395630533053_n.jpg
Completed Image ====> 390.fab09s00f.jpg
Completed Image ====> 391.IMG_0834-1024x683.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 392.lambsquarters1.jpg
Completed Image ====> 393.arugula.png
Invalid or missing image format. Skipping...
Completed Image ====> 394.lambs-quarters-chenopodium-album-02.jpg
Completed Image ====> 395.dscf2809.jpg
Completed Image ====> 396.DSC_8497.jpg
Completed Image ====> 397.20160318_182905-e1512781546433.jpg
Completed Image ====> 398.lambs-quarters-young2-300x400.jpg
Completed Image ====> 399.Lambs-Quarters-7463-v3.jpg
Completed Image ====> 400.0c223495de044641f69e4dd7e87898dfl-m0xd-w1020_h770_q80.jpg
Completed Image ====> 401.lambs-quarters-1.png
Completed Image ====> 402.LambsQtrs70401.jpg
Completed Image ====> 403.lambs-quarters-growing-field-450w-709031728.jpg
Completed Image ====> 404.62248047_321635882113949_8191980519779484094_n.jpg
Completed Image ====> 405.file.jpg
Completed Image ====> 406.lambs-quarters-pan-600x399.jpg
Completed Image ====> 407.chenopodium_album.jpg
Completed Image ====> 408.lambs-quarters-1024x735.jpg
Completed Image ====> 409.14020548738_25a46aefdf_b.jpg
Completed Image ====> 410.index.jpg
Completed Image ====> 411.main_image.jpg
Completed Image ====> 412.lambs-quarters-hummus.jpg
Completed Image ====> 413.large.jpeg
Completed Image ====> 414.Lambsquarter_flower_edited_300.jpg
Completed Image ====> 415.23_LambsQuarters140929.jpg
Completed Image ====> 416.lq-1.jpg
Completed Image ====> 417.june08-lambs-quarter.jpg
Completed Image ====> 418.album9a.jpg
Completed Image ====> 419.lambs-quarters.jpg
Completed Image ====> 420.IMG_1472-e1437761905931.jpg
Completed Image ====> 421.Quinoa-681x1024.jpg
Completed Image ====> 422.lamquart.jpg
Completed Image ====> 423.Indian-Spinach-well-watered-300.jpg
Completed Image ====> 424.I0000kRXgiO0J8Vg.jpg
Completed Image ====> 425.DSCN4478.JPG
Completed Image ====> 426.v4-460px-Eat-Lamb%27s-Quarters-Step-2.jpg.webp
Completed Image ====> 427.42292471122_9a111fa888_b.jpg
Completed Image ====> 428.Santiago%20Oaks%20Regional%20Park,%20Orange,%20CA%207-3-11%20223.jpg
Completed Image ====> 429.img-1365-orig.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 430.lambs-quarters-gnocchi-600x300.jpg
Completed Image ====> 431.500_F_239866358_ZohBH2rCvDnmOlHC3PIYr5qXDzVAPJep.jpg
Completed Image ====> 432.Lambs-quarters-Herbicide-Agriculture-Canada.jpg
Completed Image ====> 433.lambs-quarters2.jpg
Completed Image ====> 434.0013.jpg
Completed Image ====> 435.bwi-bs267731.jpg
Completed Image ====> 436.58440207_2230362707025473_5812130904905772992_n.jpg
Completed Image ====> 437.Lambs_Quarters_iStockphoto_com_MIMOHE_44052526_banner_2.jpg
Completed Image ====> 438.epazote_eggs.jpg
Completed Image ====> 439.maxresdefault.jpg
Completed Image ====> 440.500_F_193778444_FM5D0TJyIlhuHzKnQ2n8TEB0rU1a1gC6.jpg
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Completed Image ====> 441.lambs-quarters-chenopodium-album-05.jpg
Completed Image ====> 442.Chenopodium%20album%20seeds.jpg
Completed Image ====> 443.img_0301.jpg
Completed Image ====> 444.5160112544_8af1fd7c36_b.jpg
Completed Image ====> 445.Chenopodium-LB0805-6354.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 446.LambsQuarters.jpg
Completed Image ====> 447.lambq-2leaf-zoom.jpg
Completed Image ====> 448.trim+tender+lambs+quarters+010+%282%29.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 449.My-handful-of-miscella_opt.jpeg
Completed Image ====> 450.Lambs-Quarters.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 451.jsc%209908%20lambs%20quarters.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 452.imnages.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 453.Santiago%20Oaks%20Regional%20Park,%20Orange,%20CA%207-3-11%20225.jpg
Completed Image ====> 454.14.jpg
Completed Image ====> 455.Lambs-Quarter-Chip-Dip.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 456.fab09s00e.jpg
IOError on an image...trying next one... Error: timed out
Completed Image ====> 457.IMG_6609-1-750x562.jpg
Completed Image ====> 458.millet-marigolds-buckwheat-and-lambs-quarters.jpg
Completed Image ====> 459.Chenopodium-LB0805-6685.jpg
Completed Image ====> 460.ssj-176139.jpg
Completed Image ====> 461.shutterstock_1084658240Optimized.jpg
Completed Image ====> 462.lambs_quarters_10sh25_083110_640x480.jpg
Completed Image ====> 463.lambs-quarters-small-3.jpg
Completed Image ====> 464.lambs-quarters-1024x735.jpg
Completed Image ====> 465.images-2.jpeg
Completed Image ====> 466.lambs-quarters-maturing-300x400.jpg
IOError on an image...trying next one... Error: timed out
Completed Image ====> 467.poison-ivy.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 468.lambs-quarters-for-sale.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 469.lambs-quarters-leaves.jpg
Completed Image ====> 470.11.jpg
Completed Image ====> 471.aid8858767-v4-728px-Harvest-Lamb%27s-Quarters-Step-8.jpg
Completed Image ====> 472.Lambs-Quarters.jpg
Completed Image ====> 473.0004.jpg
Completed Image ====> 474.Lambs-Quarters-4.jpg
Completed Image ====> 475.lambs-quarters-jpg.jpg
Completed Image ====> 476.DSC_0139.jpg
Completed Image ====> 477.lambsquarters3.JPG
Completed Image ====> 478.lambs-quarters.jpg
Completed Image ====> 479.Dollarphotoclub_86952436-e1437756397736.jpg
Completed Image ====> 480.ssj-176141.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 481.P9090004.jpg
Completed Image ====> 482.lambs-quarters_w_pigweed_seedlings.jpg
Completed Image ====> 483.27208305643_cef0fb4f48_b.jpg
Completed Image ====> 484.lambsquarter1.jpg
Completed Image ====> 485.Chenopodium%20album%20L,%20Lamb%27s%20quarters-1-2008.jpg
Completed Image ====> 486.foraged-lambs-quarter.jpg
Completed Image ====> 487.Chenopodium-album-25101.jpg
Completed Image ====> 488.d832eb92-b87a-4188-9383-6de54c337236.jpg
Completed Image ====> 489.lambs-quarter.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 490.chenopodium_album_x2.jpg
Completed Image ====> 491.imoages.jpg
Completed Image ====> 492.IMG_0184.jpg
Completed Image ====> 493.2404.jpeg
Completed Image ====> 494.5471422_5565dba2.jpg
Completed Image ====> 495.lambs-quarters-leaves.jpg
Completed Image ====> 496.tn0037.jpg
Completed Image ====> 497.meadow-300x208.jpg
Completed Image ====> 498.lambs-quarters.jpg
URLError on an image...trying next one... Error: HTTP Error 500: Internal Server Error
Completed Image ====> 499.lamb-quarters-foliage.jpg
Completed Image ====> 500.IMG_0829-575x1024.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 501.bwi-blw034033.jpg
Completed Image ====> 502.lambs-quarters.jpg
Completed Image ====> 503.lamb2527s_quarters1.jpg
Completed Image ====> 504.9053669388_3aaefc08fc_b.jpg
Completed Image ====> 505.july22-lambs%20quarters.jpg
Completed Image ====> 506.4675256167_f1193381b4_b.jpg
Completed Image ====> 507.920x920.jpg
Completed Image ====> 508.pizza4-710x440.jpg
Completed Image ====> 509.20.jpg
Completed Image ====> 510.lambs-quarters.jpg
Completed Image ====> 511.8010662798_87ccfd823e_b.jpg
Completed Image ====> 512.lambsquarters2150.jpg
Completed Image ====> 513.trim+tender+lambs+quarters+014+%282%29.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 514.lambs-quarters-final.jpg
Completed Image ====> 515.140720_0174.jpg
Completed Image ====> 516.jsc%20980718%20lamb's%20quarters.jpg
Completed Image ====> 517.lambs-quarters-seed-2-comments-eating-lambsquarters-seeds.jpg
Completed Image ====> 518.lambs-quarters-chenopodium-album-michael-earney.jpg
Completed Image ====> 519.LQ1.png
Completed Image ====> 520.chenopodium_album_2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 521.Chenopodium_album__Fathen-003.JPG
Completed Image ====> 522.fc01d50c0c5a5d7de95e9898f78a21c8l-m0xd-w1020_h770_q80.jpg
Completed Image ====> 523.blanched-myeongaju.jpg
Completed Image ====> 524.0014.jpg
Completed Image ====> 525.IMG_1468-e1437792278349.jpg
Completed Image ====> 526.lambsquarters.jpg
Completed Image ====> 527.lambq-leaf-zoom.jpg
Completed Image ====> 528.lambs-quarters-plate-600x400.jpg
Completed Image ====> 529.Lambsquarters%20seedling.jpg
Completed Image ====> 530.stock-photo-plant-lamb-s-quarters-fan-hen-chenopodium-album-1147154342.jpg
Completed Image ====> 531.lambs-quarters.jpg
Completed Image ====> 532.Chenopodium-LB0806-7371.jpg
Completed Image ====> 533.CHEalbum1JAH.jpg
Completed Image ====> 534.14787102649_b23f306305_z.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 535.Chenopodium_giganteum-5529.jpg
Completed Image ====> 536.daylilies.jpg
Completed Image ====> 537.bwi-blws143109.jpg
Completed Image ====> 538.purslane-180x180.jpg
Completed Image ====> 539.lambsquarters1.jpg
Completed Image ====> 540.Pest-Patrol-March-I_opt4-660x420.jpg
Completed Image ====> 541.800px-Chenopodium_berlandieri_(3767482897)_(2).jpg
Completed Image ====> 542.lambsquarters_098.jpg
Completed Image ====> 543.cooking-lambs-quarters.jpg
Completed Image ====> 544.what_is_this_plant_1_m7.jpg
Completed Image ====> 545.lambs-quarters-weed.jpg
Completed Image ====> 546.jsc%209810%20lamb's%20quarters%202.jpg
Completed Image ====> 547.lambs-quarters.jpg
Completed Image ====> 548.4.jpg
Completed Image ====> 549.lambqunn.jpg
Completed Image ====> 550.3-Common-Edible-Weeds-Traditional-Cooking-School-GNOWFGLINS-lambs-quarter.jpg
Completed Image ====> 551.chenopodium_album_2.jpg
Completed Image ====> 552.23ee.jpg
Completed Image ====> 553.lamb_s_quarters_in_los_angeles_vacant_lot.jpg
Completed Image ====> 554.Lambs-quarters-Chenopodium-album.jpg
Completed Image ====> 555.Chenopodium_album.4.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 556.lambs-quarters-chenopodium-album-04.jpg
Completed Image ====> 557.i283163839594790006._szw1280h1280_.jpg
IOError on an image...trying next one... Error: timed out
Completed Image ====> 558.lambquartersbeans.jpg
Completed Image ====> 559.chal_fl.jpg
Completed Image ====> 560.t600-Lamb's%20quarters.jpg
Completed Image ====> 561.lambs-quarters-cookstown-greens-edible-weeds.jpg
Completed Image ====> 562.chenopodiumalbumandchenopodiummurale2.jpg
Completed Image ====> 563.img_2149.jpg
Completed Image ====> 564.Chenopodium_album__Fathen-001.JPG
Invalid or missing image format. Skipping...
Completed Image ====> 565.lambs_quarters_magenta_spreen.jpg
Completed Image ====> 566.P9090002.jpg
Completed Image ====> 567.500_F_239866380_yFIUIz8lIXN1mQVYci5w0oYq9GrOTsJH.jpg
Completed Image ====> 568.lambs-quarters-e1465160106881.jpg
Completed Image ====> 569.0004.jpg
Completed Image ====> 570.Wild_Vegetables-Pets-Lambs_Quarters.jpg
Completed Image ====> 571.stock-photo-bathua-lambs-quarters-kathmandu-nepal-may-1400533223.jpg
Completed Image ====> 572.fremontii1a.jpg
Completed Image ====> 573.DSC_0005-001.JPG
Completed Image ====> 574.img_2113.jpg
Completed Image ====> 575.bwi-blws180789.jpg
Completed Image ====> 576.weeds_lq_seedling_zoom.jpg
Completed Image ====> 577.trim+tender+lambs+quarters+017+%282%29.JPG
Completed Image ====> 578.lambs_quarters_9sh25_083110_640x480.jpg
Completed Image ====> 579.IMG_1697.JPG
Completed Image ====> 580.Fat-Hen-Garden-Weeds-G017706.jpg
Completed Image ====> 581.lambs-quarters-seed-the-weed-that-wasnt-lambsquarters-image-of-lambsquarters-plant-and-flower.jpg
Completed Image ====> 582.jsc%209810%20lamb's%20quarters%201.jpg
Completed Image ====> 583.Lambs-quarters.jpg
Completed Image ====> 584.lambs_quarters_5sh25_091310_640x480.jpg
Completed Image ====> 585.105824014_lambs-quarters---fat-hen-chenopodium-album-x-50-seeds-.jpg
Completed Image ====> 586.6888226697_9568cd21e0_o.jpg
IOError on an image...trying next one... Error: timed out
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
Invalid or missing image format. Skipping...
IOError on an image...trying next one... Error: timed out
Completed Image ====> 587.lambs-quarters-seed-lambs-quarter-seeds-are-totally-safe-to-eat-but-there-are-two-cautions-to-keep-image-of-lambsquarters-plant-and-flower.jpg
Completed Image ====> 588.aid8858777-v4-728px-Eat-Lamb%27s-Quarters-Step-10.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 588 is all we got for this search filter!

Errors: 53

London Rocket

keywords["keywords"] = "london rocket"
london_rocket_paths = google_images.download(keywords)

Item no.: 1 --> Item name = london rocket
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.220px-Sisymbrium_irio_flower.JPG
Completed Image ====> 2.DSC_0085_-_Sisymbrium_irio_London_rocket_large.jpg
Completed Image ====> 3.IMG_4245_-_London_rocket_in_urban_environment_large.jpg
Completed Image ====> 4.london-form2.jpg
Completed Image ====> 5.london_rocket.jpg
Completed Image ====> 6.london-rocket-flower.jpg
Completed Image ====> 7.o_19ogl35m815objf016ih6ra4238.jpg
Completed Image ====> 8.494.jpg
Completed Image ====> 9.Sisymbrium_ir_300.jpg
Completed Image ====> 10.londonrocket1.jpg
Completed Image ====> 11.sisymbrium-irio1.jpg
Completed Image ====> 12.london-rocket-leaf.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 13.51P9kTHuD%2BL._SR600%2C315_PIWhiteStrip%2CBottomLeft%2C0%2C35_SCLZZZZZZZ_.jpg
Completed Image ====> 14.3982Sisymbrium-irio600x375.jpg
Completed Image ====> 15.William%20Mason%20Regional%20Park,%20Irvine,%20CA%202-17-08%20008.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 16.london-rocket-2.jpg
Completed Image ====> 17.london-rocket.jpg
Completed Image ====> 18.londonrocketDSCN5624.jpg
Completed Image ====> 19.g-london-rocket-plant-2.jpg
Completed Image ====> 20.DSC_0010_2_-_London_rocket_greens_large.jpg
Completed Image ====> 21.51P9kTHuD%2BL._AC_SY400_.jpg
Completed Image ====> 22.Huntington%20Central%20Park,%20Huntington%20Beach,%20CA%202-15-09%20017.jpg
Completed Image ====> 23.day-8-london-rocket-in-my-yard-1-8-19-1.jpg
Completed Image ====> 24.1043.jpeg
Completed Image ====> 25.Sisymbrium_ir_400.jpg
Completed Image ====> 26.Sisymbrium_irio_[IMG_2592].jpg
Completed Image ====> 27.3860Sisymbrium-irio600x375.jpg
Completed Image ====> 28.London-Rocket.jpg
Completed Image ====> 29.140309sv.jpg
URLError on an image...trying next one... Error: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1056)>
Completed Image ====> 30.38639.jpg
Completed Image ====> 31.o_19ogl3ape1f4f1knlnc48ik1a98h.jpg
Completed Image ====> 32.maxresdefault.jpg
Completed Image ====> 33.londonrocket3.jpg
Completed Image ====> 34.london_rocket_bloom.jpg
Completed Image ====> 35.london-rocket1.jpg
Completed Image ====> 36.london_rocket_group.jpg
Completed Image ====> 37.f14605.jpg
Completed Image ====> 38.S120_29206a.jpg
Completed Image ====> 39.day-8-london-rocket-in-my-yard-1-8-19-2.jpg
Completed Image ====> 40.5c86b5627f629.image.jpg
Completed Image ====> 41.c86d9c.jpg
Completed Image ====> 42.1044.jpeg
Completed Image ====> 43.day-8-london-rocket-in-my-yard-1-8-19-3.jpg
Completed Image ====> 44.IMG_20180324_102901.jpg
Completed Image ====> 45.londonrocket4.jpg
Completed Image ====> 46.il_794xN.1506577530_kluz.jpg
Completed Image ====> 47.false-london-rocket-sisymbrium-loeselii-brassicaceae-CTMHBW.jpg
Completed Image ====> 48.cb_londrkt03f.jpg
Completed Image ====> 49.London%20Rocket.jpg
Completed Image ====> 50.London-Rocket-Kramer-Junction-Feb-2014_0.jpg
Completed Image ====> 51.3654Sisymbrium-irio600x377.jpg
Completed Image ====> 52.140309ss.jpg
Completed Image ====> 53.il_794xN.1227097048_e0cv.jpg
Completed Image ====> 54.5601383082_859b2daa06_b.jpg
Completed Image ====> 55.london-fruit.jpg
Completed Image ====> 56.DSC_0157_-_London_rocket_Pesto_on_pork_chop_breaded_with_toasted_ground_London_rocket_seed_large.jpg
Completed Image ====> 57.londonrocket.jpg
Completed Image ====> 58.original.jpeg
Completed Image ====> 59.3850Sisymbrium-irio600x375.jpg
Completed Image ====> 60.15FU4685o.jpg
Completed Image ====> 61.large.jpg
Completed Image ====> 62.4341089426_5707f36f5f_z.jpg
Completed Image ====> 63.da6811590f132add2ddcdb28404f5341.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 64.vd7-2989633.jpg
Completed Image ====> 65.SSYIR-Sisymbrium_irio_t.jpg
Completed Image ====> 66.London%20Rocket%2C%20Sisymbrium%20irio-L.jpg
Completed Image ====> 67.weed-LondonRocket1.jpg
Completed Image ====> 68.IMG_20180325_094411-1.jpg
Completed Image ====> 69.Sisymbrium-irio_London-rocket_JM-DiTomaso.jpg
Completed Image ====> 70.S120_29654a.jpg
Completed Image ====> 71.London-rocket-Sisymbrium-irio.jpg
Completed Image ====> 72.Sisymbrium-irio-20080320_600.JPG
Completed Image ====> 73.londonrocketplant.jpg
Completed Image ====> 74.London_Rocket001_RMueller.jpg
Completed Image ====> 75.24831956541_9dd9b2395a_b.jpg
Completed Image ====> 76.londonrock.jpg
Completed Image ====> 77.London%20Rocket%2C%20Sisymbrium%20irio-L.jpg
Completed Image ====> 78.London_Rocket002_RMueller.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 79.weed-london-rocket-2-edited-for-book.jpg
Completed Image ====> 80.Sisymbrium%20loeselii%20Sagaredzjo%2C%20Imeretien%2C%20Georgia%2020180428_3135.jpg
Completed Image ====> 81.london-rocket-sisymbrium-irio-growing-in-sand-in-umm-al-quwayn-uae-H29K4J.jpg
Completed Image ====> 82.London%20Rocket.jpg
Completed Image ====> 83.409a41.jpg
Completed Image ====> 84.Sisymbrium%20loeselii%20David%20Gareji%20Monastery%2C%20Kakheti%2C%20Georgia%2020180429_2973.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 85.Sisymbrium%20irio.jpg
Completed Image ====> 86.00574751.jpg
Completed Image ====> 87.London%20Rocket%2C%20Sisymbrium%20irio-L.jpg
Completed Image ====> 88.Sisymbrium_iriofebruary2.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 89.large.JPG
Completed Image ====> 90.5498127211_1d5cba6d3b_b.jpg
Completed Image ====> 91.o_19ogl3guf1hi8175r13441cdg13dpq.jpg
Completed Image ====> 92.Sisymbrium%20loeselii%20Sagaredzjo%2C%20Imeretien%2C%20Georgia%2020180428_3134.jpg
Completed Image ====> 93.0415.jpeg
Completed Image ====> 94.S120_29205a.jpg
Completed Image ====> 95.0e9b64.jpg
Completed Image ====> 96.2510.jpeg
Completed Image ====> 97.DSC_0008_-_London_rocket_seeds_large.jpg
Completed Image ====> 98.Sisiri01.jpg
Completed Image ====> 99.default.jpg
Completed Image ====> 100.index.jpg
Completed Image ====> 101.o_19ogl3l80166gv11h0r18os12bt13.jpg
Completed Image ====> 102.s-l300.jpg
Completed Image ====> 103.londonrocket..jpg
Completed Image ====> 104.S120_29656a.jpg
Completed Image ====> 105.flora168a.jpg
Completed Image ====> 106.Dimmit%20County,%20Texas-004.JPG
Completed Image ====> 107.sisymbriumirio12.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 108.ESRP-biologist-Justine-Kokx-in-a-dense-stand-of-London-rocket-Sisymbrium-irio-The-gray.png
Completed Image ====> 109.S120_29212a.jpg
Completed Image ====> 110.771abeac6cf01a13ad970c3b92be4aa5.jpg
Completed Image ====> 111.15FUC1433x.jpg
Completed Image ====> 112.79813.jpg
Completed Image ====> 113.IMG_20180325_094349-1-768x1024.jpg
Completed Image ====> 114.londonrocket2.jpg
Completed Image ====> 115.common-southeast-new-mexico-weed-london-rocket-mustard-e1547857102350.jpg
Completed Image ====> 116.sisymbriumirio2.jpg
Completed Image ====> 117.84610.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 118.Sisymbrium-irio01-tn.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 119.sisymbrium_irio4.jpg
Completed Image ====> 120.S120_29658a.jpg
Completed Image ====> 121.London-Rocket-blog.jpg
Completed Image ====> 122.4438178937_a11999137a_z.jpg
Completed Image ====> 123.Sisymbrium_irio_[IMG_4442].jpg
Completed Image ====> 124.Sisymbrium%20loeselii%20David%20Gareji%20Monastery%2C%20Kakheti%2C%20Georgia%2020180429_2971.jpg
Completed Image ====> 125.0188.jpeg
Completed Image ====> 126.londonrocket4b.jpg
Completed Image ====> 127.londonrocketleaves.jpg
Completed Image ====> 128.LondonRocket51501.jpg
Completed Image ====> 129.2347778923_8bc09e4a59_z.jpg
Completed Image ====> 130.Sisymbrium-irio02.jpg
Completed Image ====> 131.London%20Rocket,%20Sisymbrium%20irio%20(3)_small.jpg
Completed Image ====> 132.Clock-Tower-Rocket-Entrance.jpg
Completed Image ====> 133.sisymbrium_irio.jpg
Completed Image ====> 134.large.JPG
Completed Image ====> 135.JON-LONDON-Rocket-Factory.jpg
Completed Image ====> 136.S120_29657a.jpg
Completed Image ====> 137.16401121689_6910900ea9_b.jpg
Completed Image ====> 138.mustard-london-rocket-weed-e1554082015485.jpg
Completed Image ====> 139.figure-736-london-rocket-is-a-difficult-to-control-annual-winter-weed-Copy.jpg
Completed Image ====> 140.d013d5bfded05925b70bd40deed34cf1.jpg
Completed Image ====> 141.London%20Rocket,%20Sisymbrium%20irio%20(4)_small.jpg
Completed Image ====> 142.maxresdefault.jpg
Completed Image ====> 143.siiri2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 144.sisymbrium_irio2.jpg
Completed Image ====> 145.0WsbPw47_400x400.jpg
Completed Image ====> 146.IMG_20180325_094349-1-2000x1200.jpg
Completed Image ====> 147.1551.jpeg
Completed Image ====> 148.5374776.jpg
Completed Image ====> 149.56a067119f967.image.jpg
Completed Image ====> 150.image005.jpg
Completed Image ====> 151.e753e3.jpg
Completed Image ====> 152.16422275435_5da4a8000a_b.jpg
Completed Image ====> 153.LondonRocketDet51501.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 154.large.jpg
Completed Image ====> 155.jcs-sisymbrium-irio-25532.jpg
Completed Image ====> 156.london_rocket_leaf.jpg
Completed Image ====> 157.sisymbrium_irio3.jpg
Completed Image ====> 158.sisymbriumirio1.jpg
Completed Image ====> 159.36624881265_41779ab594_b.jpg
Completed Image ====> 160.sisymbrium-irio2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 161.LDN_Rocket_Rare_Beef_and_Chip_Salad_2_CROP.jpg
Completed Image ====> 162.sisymbrium_irio1.jpg
Completed Image ====> 163.38640.jpg
Completed Image ====> 164.londonrocket.jpg
Completed Image ====> 165.IMG_4536.JPG
Completed Image ====> 166.59e68d196fc1e8472fabf807b1e0268c.jpg
Completed Image ====> 167.25036081001_323725b280_m.jpg
Completed Image ====> 168.5374777.jpg
Completed Image ====> 169.IMG_20180324_102853-1-768x1024.jpg
Completed Image ====> 170.04.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 171.1554.jpeg
Completed Image ====> 172.Santiago%20Oaks%20Regional%20Park,%20Orange,%20CA%201-20-08%20021.jpg
Completed Image ====> 173.sisymbrium-irio-2-672x372.jpg
Completed Image ====> 174.09ec06.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 175.Sisymbrium-irio03-tn.jpg
Completed Image ====> 176.9R3KVRJKYRI0S0W0Q090H070CQ703Q70ARLQNRZQYRXQCR90K0XQK0503Q40JQJKOR0QURFKTQ503QZQYRMQFR60K0U0.jpg
Completed Image ====> 177.londonrocket4c.jpg
Completed Image ====> 178.140309su.jpg
Completed Image ====> 179.jcs-sisymbrium-irio-26138.jpg
Completed Image ====> 180.water-rocket-eruca-aquatica-and-london-rocket-sisymbrium-irio-handcoloured-woodblock-engraving-of-a-botanical-illustration-from-adam-lonicers-krauterbuch-or-herbal-frankfurt-1557-this-from-a-17th-century-pirate-edition-or-atlas-of-illustrations-only-with-captions-in-latin-greek-french-italian-german-and-in-english-manuscript-P9G7KB.jpg
Completed Image ====> 181.IMG_1273_Watermark.jpg
Completed Image ====> 182.Sisymbrium_irio_[IMG_2487].jpg
Completed Image ====> 183.thames-rockets-detail.jpg
Completed Image ====> 184.maxresdefault.jpg
Completed Image ====> 185.wall-street-and-london-rocket-after-us-bailout-415x275.jpg
Completed Image ====> 186.IMG_4534.JPG
Completed Image ====> 187.13500499343_7033192b2f_b.jpg
Completed Image ====> 188.Sisymbrium%20loeselii%20F%C3%A5r%C3%B6gatan%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160613_0053.jpg
Completed Image ====> 189.londonrocketplant2.jpg
Completed Image ====> 190.image003.jpg
Completed Image ====> 191.26b.jpg
Completed Image ====> 192.rocket-in-royal-air-force-museum-london-uk-united-kingdom-england-F3H35B.jpg
Completed Image ====> 193.Santiago%20Oaks%20Regional%20Park,%20Orange,%20CA%201-20-08%20019.jpg
Completed Image ====> 194.sisymbrium-irio3.jpg
Completed Image ====> 195.zh4-3049794.jpg
Completed Image ====> 196.0844.jpeg
Completed Image ====> 197.33269439368_a2b76c83f1_m.jpg
Completed Image ====> 198.London%20Rocket,%20Sisymbrium%20irio%20(1)_small.jpg
Completed Image ====> 199.412Y4nzcXXL._SX425_.jpg
Completed Image ====> 200.5374779.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 201.356630.jpg
Completed Image ====> 202.S120_29211a.jpg
Completed Image ====> 203.weeds-header.jpg
Completed Image ====> 204.londonrocket3x450.jpg
Completed Image ====> 205.a4668185-c05a-4753-a802-1c0f519834d8.jpg
Completed Image ====> 206.11_2_Biofuel.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 207.26779570281_e6b72f5b28_b.jpg
Completed Image ====> 208.cropped-resize-13.jpg
Completed Image ====> 209.140309st.jpg
Completed Image ====> 210.S120_29204a.jpg
Completed Image ====> 211.sisymbrium_irio_fr.jpg
Completed Image ====> 212.3907.jpeg
Completed Image ====> 213.Sisymbrium%20irio2.jpg
Completed Image ====> 214.sisymbrium-irio-london-rocket-p69b3p.jpg
Completed Image ====> 215.309e0d.jpg
Completed Image ====> 216.thames-rockets.jpg
Completed Image ====> 217.leptosphaeria_maculans.jpg
Completed Image ====> 218.AE-3475-45282.jpg
Completed Image ====> 219.0a91f29801264c07a04aac89ef4730fb.jpg
Completed Image ====> 220.Hedge-Mustard-Sisymbrium-Irio-London-Rocket-Khubhkala.jpg
Completed Image ====> 221.weed-LondonRocket2.jpg
Completed Image ====> 222.Sisymbrium_irio_[IMG_2482].jpg
Completed Image ====> 223.siiri4.jpg
Completed Image ====> 224.6997895151_fb8a602b66_b.jpg
Completed Image ====> 225.5374780.jpg
Completed Image ====> 226.default.jpg
Completed Image ====> 227.mustard%2Bin%2Balfalfa.jpg
Completed Image ====> 228.londonrocketstem.jpg
Completed Image ====> 229.022805-VE-Renz-Rocket-1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 230.5f1d4d.jpg
Completed Image ====> 231.1553.jpeg
Invalid or missing image format. Skipping...
Completed Image ====> 232.milk-thistle.jpg
Completed Image ====> 233.NuMex-Twilight-1-e1530377622654.jpg
Completed Image ====> 234.rocket-league-finals-london-copperbox.jpg
Completed Image ====> 235.Bratou20.jpg
Completed Image ====> 236.London-Rocket.jpg
Completed Image ====> 237.resize-IMG_0709.jpg
Completed Image ====> 238.Picture1.png
Completed Image ====> 239.7426f8c79812f86d44b6c77bfee6b48d.jpg
Completed Image ====> 240.London%20Rocket,%20Sisymbrium%20irio_small.jpg
Completed Image ====> 241.KHUBKALAN_4.jpg
Completed Image ====> 242.london-rocket-flix-weld-sisymbrium-irio-l.jpg
Completed Image ====> 243.S120_29203a.jpg
Completed Image ====> 244.ArugulaandAppleSalad.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 245.ce4b06.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 246.2656.jpeg
Completed Image ====> 247.sisymbrium-irio-a7d83edf-7454-4761-8354-eb771d3757e-resize-750.jpeg
Completed Image ====> 248.Spiny-Sowthistle.jpg
Completed Image ====> 249.78f89db8faa36a766811ff3d1db41075.jpg
Completed Image ====> 250.51wJnBTdO3L._SX425_.jpg
Completed Image ====> 251.london-rocket-aaron-burrows.jpg
Completed Image ====> 252.rocket-food-the-luxury-london-catering-company-with-a-conscience.jpg
Completed Image ====> 253.S120_29207a.jpg
Completed Image ====> 254.rocket.png
Completed Image ====> 255.s_irio.jpg
Completed Image ====> 256.Sisymbrium%2Birio%2BL%2B%252811%2529.JPG
Completed Image ====> 257.I-15.mustard1.JPG
Completed Image ====> 258.15FU4689o.jpg
Completed Image ====> 259.86866.jpg
Completed Image ====> 260.Sisymbrium%20loeselii%20Sagaredzjo%2C%20Imeretien%2C%20Georgia%2020180428_3133.jpg
Completed Image ====> 261.sisymbriumirio.jpg
Completed Image ====> 262.s_irio2.jpg
Completed Image ====> 263.4493a2.jpg
Completed Image ====> 264.siiri3.jpg
Completed Image ====> 265.S120_29655a.jpg
Completed Image ====> 266.IMG_3681_large.jpg
Completed Image ====> 267.56344614_397036497516085_1450132965202685348_n.jpg
Completed Image ====> 268.CKGKVK8KPKVQB02QD0PQV0WQY0WQV0PQT0GQC0HKAKMKVK1QTKQKTKKKOKVQZSNQ1K8K1K9QF0GKTKAQVKVQOKGKTK5K.jpg
Completed Image ====> 269.Sisymbrium%20irio%204065.JPG
Completed Image ====> 270.rocket-boat-header.jpg
Completed Image ====> 271.226100.jpg
Completed Image ====> 272.rocket-holborn.jpg
Completed Image ====> 273.Salad-rocket940x627.jpg
Completed Image ====> 274.london_rocket_3-1624447C9AB1D00A0D0-thumb400.jpg
Completed Image ====> 275.0320.jpeg
Completed Image ====> 276.S120_29215a.jpg
Completed Image ====> 277.Sisymbrium%20loeselii%20F%C3%A5r%C3%B6gatan%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160613_0041.jpg
Completed Image ====> 278.london-england-uk-thames-rockets-tourist-speedboat-on-the-river-thames-passing-under-blackfriars-bridge-st-pauls-cathedral-in-the-background-RP452H.jpg
Completed Image ====> 279.rocket-backgrund.jpg
Completed Image ====> 280.24367603.jpg
Completed Image ====> 281.DSCN0425.JPG
Completed Image ====> 282.s_irio1.jpg
Completed Image ====> 283.londonrocketplt6x500.jpg
Completed Image ====> 284.5459957.jpg
Completed Image ====> 285.new-rocket-engine-london-sydney-768x659.jpg
Completed Image ====> 286.Sisymbrium_irio_[IMG_4445].jpg
Completed Image ====> 287.khubkala-london-rocket-sisymbrium-irio.jpg
Completed Image ====> 288.RocketSpace_Top-London-Event-Planners.png
Completed Image ====> 289.siiri0.jpg
Completed Image ====> 290.London+Rocket%2C+Sisymbrium+irio%2C+nitrate.jpg
Completed Image ====> 291.KHUBKALAN_10.jpg
Completed Image ====> 292.54447300_997537700439525_4130224835163473728_n.jpg
Completed Image ====> 293.london-rocket-copyright-lynda-terrill.jpg
Completed Image ====> 294.rocket-city-signature.jpg
Completed Image ====> 295.stock-photo-texas-wildflower-rapistrum-rugosum-london-rocket-bastardcabbage-1376555177.jpg
Completed Image ====> 296.226102.jpg
Completed Image ====> 297.131eedb9d220f7840a9e8f3d43839f07.jpg
Completed Image ====> 298.ddsao_commercial_Capco-London-2_008a-700x525.jpg
Completed Image ====> 299.maxresdefault.jpg
Completed Image ====> 300.ww2-air-raid-damage-brockley-london-rocket-raid-at-brockley-rescue-B3P47B.jpg
Completed Image ====> 301.LONDON+ROCKET.jpg
Completed Image ====> 302.Sisymbrium%20loeselii%20F%C3%A5r%C3%B6gatan%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160613_0047.jpg
Completed Image ====> 303.image.jpg
Completed Image ====> 304.19439045138_19f3a0d18e_m.jpg
Completed Image ====> 305.siir_002_lhp.jpg
Completed Image ====> 306.il_570xN.1576686148_4fk8.jpg
Completed Image ====> 307.plond3003110188_q1_2-0._UX357_QL90_.jpg
Completed Image ====> 308.maxresdefault.jpg
Completed Image ====> 309.50956118_377358896149576_3788801874683841679_n.jpg
Completed Image ====> 310.the-rocket-in-euston.jpg
Completed Image ====> 311.S120_29210a.jpg
Completed Image ====> 312.sisymbrium_irio_w.jpg
Completed Image ====> 313.Sisymbrium%20loeselii%20Sagaredzjo%2C%20Imeretien%2C%20Georgia%2020180428_3133.jpg
Completed Image ====> 314.KHUBKALAN_3.jpg
Completed Image ====> 315.rocket-bishopsgate-sep15.jpg
Completed Image ====> 316.v2damage_10.jpg
Completed Image ====> 317.Rocket-Restaurant-3-1200x800-optimised.jpg
Completed Image ====> 318.46421368874_7120d3f903_b.jpg
URLError on an image...trying next one... Error: HTTP Error 403: Forbidden
Completed Image ====> 319.New_GettyImagesSubs-531752444_trans_NvBQzQNjv4BqZgEkZX3M936N5BQK4Va8RT0aesusvN1TE7a0ddd_esI.jpg
Completed Image ====> 320.15FU4686o.jpg
Completed Image ====> 321..jpg
Completed Image ====> 322.226101.jpg
Completed Image ====> 323.46597159_324898131443324_8266813337300077069_n.jpg
Completed Image ====> 324.gwrfilmtile-2-1-1024x427-768x320.jpg
Completed Image ====> 325.pizza-with-rocket.jpg
Completed Image ====> 326.img-7641.jpg
Completed Image ====> 327.good_energy_gu_15-small.jpg
Completed Image ====> 328.Dx2x_1uVsAAqHP4.jpg
Completed Image ====> 329.sisymbrium_irio.jpg
Completed Image ====> 330.the-rocket-pub-in-euston-road-london-uk-DXP6JY.jpg
Completed Image ====> 331.london_rocket_2.jpg
Completed Image ====> 332.khubkalan-500x500.jpg
Completed Image ====> 333.hqdefault.jpg
Completed Image ====> 334.44E71EEE-1DD8-B71B-0B20A4ED31C2094E.jpg
Completed Image ====> 335.RocketSpace_Raising-Venture-Capital-in-San-Francisco-vs-London.png
Completed Image ====> 336.London-Rocket-4BCTV-Host.jpg
Completed Image ====> 337.240615.jpg
Completed Image ====> 338.54447152_381205215798386_7606656965033509534_n.jpg
Completed Image ====> 339.19006093973_c63196300b_b.jpg
Completed Image ====> 340.Sisymbrium%20loeselii%20F%C3%A5r%C3%B6gatan%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160613_0052.jpg
Completed Image ====> 341.Greenwich-Peninsula-775x270.jpg
Completed Image ====> 342.0000684_rocket-revolution-50-mins-london-eye_415.jpeg
Completed Image ====> 343.Sisymbrium_irio_[IMG_4446].jpg
Completed Image ====> 344._7394966.jpg
Completed Image ====> 345.3070ic1.jpg
Completed Image ====> 346.outdoor-dining-area-in-adams-court-of-rocket-restaurant-old-broad-JF68WM.jpg
Completed Image ====> 347.p2045519912-3.jpg
Completed Image ====> 348.London+Rocket.jpg
Completed Image ====> 349.ROCKET_PLANTER_0.jpg
Completed Image ====> 350.londonrocket.jpg
Completed Image ====> 351.tansymustard_post.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 352.Sisymbriom_Irio.jpg
Completed Image ====> 353.london-r-must09-073s.jpg
Completed Image ====> 354.023AnnualMercuryLimehoBasinLondSep14red.JPG
Completed Image ====> 355.4-16-19-thumbnail-description-london-rocket.png
Completed Image ====> 356.london-events_0.jpg
Completed Image ====> 357.KHUBKALAN_9.jpg
Completed Image ====> 358.03-Rocket-Catering-Branding-Van-Livery-Here-Design-UK-BPO.jpg
Completed Image ====> 359.BZ4LWZ5L8ZWHAHMH1HXHCHUHHRUHAZ4LNZNHHR4HHRUHZR9HFHNHJHIHAHKLOHWHHR8LNZZLDH4HDH9HDHRL2Z0LEZLL.jpg
Completed Image ====> 360.e5aaab2e503952d8b1949ecdf84c2d35.jpg
Completed Image ====> 361.Lyles-lamb-720x480.jpg
Completed Image ====> 362.SultanStoryRocket.jpg
Completed Image ====> 363.London%20Rocket,%20Sisymbrium%20irio%20(2)_small.jpg
IOError on an image...trying next one... Error: [Errno 104] Connection reset by peer
Completed Image ====> 364.London_Metropolitan_University%2C_Rocket_Complex%2C_Holloway_Road.jpg
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 365.boyrocketsmallblack.jpg
Completed Image ====> 366.226103.jpg
Completed Image ====> 367.S120_29216a.jpg
Completed Image ====> 368.TA-TA-small-plates-poussin-aubergine-jack1-720x480.jpg
Completed Image ====> 369.lr_rosette.jpg
Completed Image ====> 370.1103161.jpg
Completed Image ====> 371.tansy_mustard_descurainia_pinnata_walt_britt_003.jpg
Completed Image ====> 372.london-explodes-sea-fireworks-over-ben-london-eye-new_cg1p18020635c_th.jpg
Completed Image ====> 373.lr.jpg
Completed Image ====> 374.Sisymbrium_irio_flower2.jpg
Completed Image ====> 375.londonrocket.jpg
Completed Image ====> 376.tower-of-london-yann-lazarus-canvas-print.jpg
Completed Image ====> 377.s-l1000.jpg
Completed Image ====> 378.Sisymbrium_irio_[IMG_4447].jpg
Completed Image ====> 379.sisymbriumfull.jpg
Completed Image ====> 380.5459955.jpg
Completed Image ====> 381.maxresdefault.jpg
Completed Image ====> 382.RLCS-Season-5-Announcement-02_1080.309bf22bd29c2e411e9dd8eb07575bb1.jpg
Completed Image ====> 383.33141801252_b7d99a209d_b.jpg
Completed Image ====> 384.rocket-and-prosciutto.jpg
Completed Image ====> 385.london_rocket_by_patgoltz_d1ccww0-250t.jpg
Completed Image ====> 386.1-nocturne-in-black-and-gold-james-a-m-whistler-canvas-print.jpg
Completed Image ====> 387.retro-graffiti-rocket-ship-art-brick-lane-london-61414437.jpg
Completed Image ====> 388.el-pastor_trans_NvBQzQNjv4Bqeo_i_u9APj8RuoebjoAHt0k9u7HhRJvuo-ZLenGRumA.jpg
Completed Image ====> 389.SegaWorld_London_Rocket_Entrance_3.png
Completed Image ====> 390.tansy_mustard_field_post.jpg
Completed Image ====> 391.rocket-complex-london-metropolitan-university-holloway-road-islington-BF60EE.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 392._1459074.jpg
Completed Image ====> 393.86865.jpg
Completed Image ====> 394.il_340x270.1808318442_d7m2.jpg
Completed Image ====> 395.V2-launch.jpg
Completed Image ====> 396.BBC-Weather-forecast-news-London-Met-Office-UK-947465.jpg
Completed Image ====> 397.pima-canyon-hiking-trail-small-260nw-1380027323.jpg
Completed Image ====> 398.Sisymbrium_irio_[IMG_4444].jpg
Completed Image ====> 399.new-year-bigalbaloo-stock-canvas-print.jpg
Completed Image ====> 400.siir_001_lhp.jpg
Completed Image ====> 401.London-Rocket.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 402.SpaceX-plans-rocket-flights-from-London-to-New-York-in-29-minutes-660x330.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 403.rocket.jpg
Completed Image ====> 404.RECP-130900-SHTF-08-EDITED.jpg
Completed Image ====> 405.Dalston-Library-4th-January-1945.jpg
Completed Image ====> 406.Dubai-London-Elon-Musk.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 407.https%3A%2F%2Fblogs-images.forbes.com%2Fbridaineparnell%2Ffiles%2F2017%2F09%2FElon-Musk-Giant-Rocket-Could-Take-Us-To-Mars-In-Just-7-Years-And-London-In-29-Minutes.jpg
Completed Image ====> 408.new-year-london-11499911.jpg
Completed Image ====> 409.folderthumb.jpg
Completed Image ====> 410.05b4d31ca93e3ad36ec015064bd6ff07.jpg
Completed Image ====> 411.Sisymbrium_loeselii,I_MEL3468.jpg
Completed Image ====> 412.london-house-prices.jpg
Completed Image ====> 413.Gagarin-Sqaure-artists-impression-from-38-Southwark-Street-Photo-Lees-Associates-700x455.jpg
Completed Image ====> 414.il_340x270.1901271951_25j8.jpg
Completed Image ====> 415.Himalayan-Balsam_resized-225x300.jpg
Completed Image ====> 416.d731f365745629827fed3ade91155985.jpg
Completed Image ====> 417.file.jpg
Completed Image ====> 418.Dimmit%20County,%20Texas.JPG
Completed Image ====> 419.file.jpg
Completed Image ====> 420.m_5b377e73baebf689a7de2285.jpg
Completed Image ====> 421.The-Ethicurean-at-the-Barley-Wood-Walled-Garden-720x480.jpg
Completed Image ====> 422.paper-london-WhiteBlack-Rocket-Dot-Sweater.jpeg
Completed Image ====> 423.IMG_2059_600x.jpg
Completed Image ====> 424.siiri5.jpg
Completed Image ====> 425.salami-rocket-parmesan.jpg
Completed Image ====> 426.1031069-smurfslostvillage.jpg
Completed Image ====> 427.9464140.png
Completed Image ====> 428.SegaWorld_London_Rocket_Entrance_2.png
Completed Image ====> 429.5498126289_e4c8595bcd_b.jpg
Completed Image ====> 430.16641874958_af3efa301e_m.jpg
Completed Image ====> 431.3574411866_717f8d2b91_b-700x525.jpg
Completed Image ====> 432.5459956.jpg
Completed Image ====> 433.Imgf1053.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 434.siir_004_lhp.jpg
Completed Image ====> 435.24831958631_e18617f41e.jpg
Completed Image ====> 436.V2-Rocket-small1.jpg
Completed Image ====> 437.fe0eb763be438e422d675770d2a49f16.image.310x550.jpg
Completed Image ====> 438.pic817.jpg
Completed Image ====> 439.cd4071c72b2f25ead18518b2d74e9390.jpg
Completed Image ====> 440.e9662b_6cbaa7225c2d4cf98879010a7c5e1197~mv2.webp
Completed Image ====> 441.NINTCHDBPICT000481640683.jpg
Completed Image ====> 442.large_paper-london-blue-rocket-pleated-sleeve-jumper.jpg
Completed Image ====> 443.sisymbrium-irio15.jpg
Completed Image ====> 444.bobby_london_rocket.jpg
Completed Image ====> 445.$_86.JPG
Completed Image ====> 446.gettyimages-855370170.jpg
Completed Image ====> 447.Faviken1-720x480.jpg
Completed Image ====> 448.rocket-complex.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 449.SpaceX-to-SLASH-travel-times-Elon-Musk-will-rocket-passengers-from-London-to-New-York-1791179.jpg
Completed Image ====> 450.Sisymbrium%20loeselii%20-%20False%20London%20Rocket%20-%20borstsenap_Sisymbrium_loeselii-8712.jpg
Completed Image ====> 451.Skinnydip_iPhone_6_Rocket_Glitter_Case_3_5a03b09f-3076-4ea6-a912-b6b5f82cd463.jpg
Completed Image ====> 452.20daceff-7adb-421b-9c82-51aa53cb9c30.jpeg
Completed Image ====> 453.weed-LondonRocket3.jpg
Completed Image ====> 454.burrata-rocket-and-proscuitto.jpg
Completed Image ====> 455.7922399e-995f-4f51-a2ee-6bff2cd9d248.jpg
Completed Image ====> 456.london-united-kingdom-april-12-450w-75306139.jpg
Completed Image ====> 457.BottleRocketLondon-300x225.jpeg
Completed Image ====> 458.stephenson-s-rocket-locomotive-science-museum-london-uk-was-preserved-now-display-53493967.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 459.Sisymbrium_irio,_seed,I_USID257.jpg
Completed Image ====> 460.supersonic-plane.jpg
Completed Image ====> 461.il_340x270.1139711024_5sj5.jpg
Completed Image ====> 462.elton-john--rocket-man-lesley-giles-canvas-print.jpg
Completed Image ====> 463.7d6e8d3df8990e9b826c3719b65a00fd.jpg
Completed Image ====> 464.IMG_6979-910x1024.jpg
Completed Image ====> 465.beef-3-860x348.jpg
Completed Image ====> 466.SpaceX0512.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 467.spacex-rocket_md.jpg
Completed Image ====> 468.rocket-tomato-salad.jpg
Completed Image ====> 469.1798575_cheesegrater.jpg
Completed Image ====> 470.1410342683916_wps_2_V2_map_3_jpg.jpg
Completed Image ====> 471.rocket_restaurant_bar_city_london_photo_4.jpg
Completed Image ====> 472.SegaWorld_London_Rocket_Entrance_1.png
Completed Image ====> 473.space-rocket-cup-and-straw-28567-lifestyle.jpg
Completed Image ====> 474.24367604.jpg
Completed Image ====> 475.file.jpg
Completed Image ====> 476.rocket-league-wheels.jpg
Completed Image ====> 477.Sisymbrium_loeselii,I_MEL3469.jpg
Completed Image ====> 478.404-restaurant.jpg
Completed Image ====> 479.large_000000.jpg
Completed Image ====> 480.4py55lifhzj21.jpg
Completed Image ====> 481.london2018-970x970_1200x1200.jpg
Completed Image ====> 482.item_XL_31752380_0d28a22b0bcfb.jpg
Completed Image ====> 483.london-uk-06th-june-2019-celebs-attend-cash-rocket-photocall-at-wellington-arch-on-6-june-2019-london-uk-credit-picture-capitalalamy-live-news-TC6PKA.jpg
Completed Image ====> 484.weedsladybug.jpg
Completed Image ====> 485.DB-photo-by-Miriam-Preis-culinary-academy-of-sweden-720x480.jpg
Completed Image ====> 486.rocket-jump-london-1560x1560.jpg
Completed Image ====> 487.MB915210_942long.jpg
Completed Image ====> 488.londons-flat-iron-lenny-carter-canvas-print.jpg
Completed Image ====> 489.13395371_f1024.jpg
Completed Image ====> 490.Rocket-Restaurants-Holborn-London-Interior-Design-5.jpg
Completed Image ====> 491.ligularia-the-rocket-1024x681.jpg
Completed Image ====> 492.consultancy.jpg
Completed Image ====> 493.10320809.jpg
Completed Image ====> 494.UK-weather-forecast-August-2017-summer-Met-Office-Britain-heatwave-Lucifer-Europe-837552.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 495.74393.jpg
Completed Image ====> 496.rocket-food-home_slide-03413210015106607188113618863.jpg
Completed Image ====> 497.p3229209331-3.jpg
Completed Image ====> 498.81132-tomato-and-rosemary-london-rocket-smoothie.jpg
Completed Image ====> 499.64659_creative_1515578815583.jpg
Completed Image ====> 500.IMG_20190117_142023-01-500x500.jpeg
Completed Image ====> 501.Market-Hall-4-1320x880.jpg
Completed Image ====> 502.012EchiumPlantagineumLondFldsAug15red.JPG
Completed Image ====> 503.bar-ingenious-sign-funny.jpg
Completed Image ====> 504.pool-sharks-from-the-london-office.jpg
Completed Image ====> 505.MUS-FAPC1114_405.jpg
Completed Image ====> 506.powerboating%20and%20London%20Eye%20320.jpg
Completed Image ====> 507.MUS-FAFP1114_black_622.jpg
Completed Image ====> 508.145221.jpg
Completed Image ====> 509.thames-rockets-london-speed-14101327.jpg
Completed Image ====> 510.UK-009916_large.jpg
Completed Image ====> 511.people-cars-front-rocket-pub-king-s-cross-london-uk-july-one-busiest-pubs-euston-126558552.jpg
Completed Image ====> 512.wild_rocket.jpg
Completed Image ====> 513.img-7639.jpg
Completed Image ====> 514.PAPER%20London%20Rocket%20Wool%20Jumper%20Sweaters%20%20Knits%20Sapphire%20FQLEWI_3.jpg
Completed Image ====> 515.7649196.jpg
Completed Image ====> 516.hqdefault.jpg
URLError on an image...trying next one... Error: HTTP Error 503: Service Unavailable
Completed Image ====> 517.sisymbrium_irio.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 518.img_20190324_130321824.jpg
Completed Image ====> 519.mev-11113199.jpg
Completed Image ====> 520.london_rocket_sisymbrium_irio_l_007.jpg
Completed Image ====> 521.310558d8342a5d918d137fafe1094de5_featured_v2.jpg
Completed Image ====> 522.gherkinrocket.jpg
Completed Image ====> 523.rocket_restaurant_bar_city_london_photo_2.jpg
Completed Image ====> 524.7QFRQQYRJKQ0X0DQ70TQ50Q0N0Q080BR7QYRQQCR90YRZQNRM0FQ90R060CQ20DQ20Q0U0JR0Q00P0ORMQDRKQWRQQ3R.jpg
Completed Image ====> 525.Rocket-by-Balls-Brothers-1-optimised.jpg
Completed Image ====> 526.London-Rocket-flower-Sisymbrium-irio-jpg.jpg
Completed Image ====> 527.ea9d42f9-da0e-46c3-b268-105543074d79.jpeg
Completed Image ====> 528.37568262_2222731437743083_622871120931979264_n-Copy-1.jpg
Completed Image ====> 529.001-houses-for-sale-11-57ed5317f264d-57ed53180e718.jpg
Completed Image ====> 530.clifton-nurseries-london-banner-double.jpg
Completed Image ====> 531.43722581-london-england-may-31-stephenson-s-rocket-locomotive-science-museum-in-london-on-may-31-2015-in-lond.jpg
Completed Image ====> 532.the-rocket-in-euston.jpg
Completed Image ====> 533.Saltimporten-720x480.jpg
Completed Image ====> 534.north-korea-london-center.jpg
Completed Image ====> 535.98327919_Supersonic_rocket_trial_trans_NvBQzQNjv4BqZgEkZX3M936N5BQK4Va8RWtT0gK_6EfZT336f62EI5U.jpg
Completed Image ====> 536.Legends-of-Gaming-2015-main_tcm25-395616.jpg
Completed Image ====> 537.team-dignitas-win-rocket-league-champs.jpg
Completed Image ====> 538.kiss-peter-cade-canvas-print.jpg
Completed Image ====> 539.p979539651-3.jpg
Completed Image ====> 540.Rocket%2C_Science_Museum%2C_London_-_DSC05416.JPG
Completed Image ====> 541.5b8ff137dda4c8452c8b45b3.jpg
Completed Image ====> 542._2dc285ae-49b3-11e7-942b-1b07039b2a8c.jpg
Completed Image ====> 543.85224.jpg
Completed Image ====> 544.Startupbootcamp_Insurtech_RocketSpace_Partnership_London.jpg
Completed Image ====> 545.s-l300.jpg
Completed Image ====> 546.pyongyangsatellite0903.jpg
Completed Image ====> 547.027008bd-f3a9-4346-ba95-8841adc5daf2.jpeg
Completed Image ====> 548.Stephenson%27s_Rocket.jpg
Completed Image ====> 549.25035770948_99f2d2f570_b.jpg
Completed Image ====> 550.zpg_agent_static_agent_profile_images_(18623590).jpg
Completed Image ====> 551.med_1418105beac739472d8b5cc13671d4cc.jpg
Completed Image ====> 552.green-machine-avocado.jpg
Completed Image ====> 553.7d7f721e-ad3b-444f-9a46-928d265c9646.jpg
Completed Image ====> 554.50883754_1997344140302270_3575933874234229939_n.jpg
Completed Image ====> 555.First-V2-Rocket-13.jpg
Completed Image ====> 556.rocket%20man%20at%20call%20me%20mr%20lucky.png
Completed Image ====> 557.30_St_Mary_Axe_from_Leadenhall_Street.jpg
Completed Image ====> 558.p942494144-3.jpg
Completed Image ====> 559.1800.jpg
Completed Image ====> 560.londonrocket2.jpg
Completed Image ====> 561.londonrocket6874.jpg
Completed Image ====> 562.Leon-Leon-London_Rocket_12-2_15th-June-1.jpg
Completed Image ====> 563.JON-LONDON-Paolo-Rocket-Factory.jpg
Completed Image ====> 564.Morito-breakfast-1320x880.jpg
Completed Image ====> 565.29d33e06-093b-4ec7-b448-64b2127f8a17.jpeg
Completed Image ====> 566.sisymbrium-610773b6-adb9-4595-9c4c-e425df6e5c3-resize-750.jpeg
Completed Image ====> 567.627.jpg
Completed Image ====> 568.davidminn2.jpg
Completed Image ====> 569.V2-rocket-remains-st-stephens-rd-sept-17-1944-c.jpg
Completed Image ====> 570.24629827090_4b0daf81b2_b.jpg
Completed Image ====> 571.p935073872-3.jpg
Completed Image ====> 572.2_4_d5.jpg
Completed Image ====> 573.Space_Shuttle_Columbia_launching-808x454.jpg
Completed Image ====> 574.pic1.jpg
Completed Image ====> 575.saved-london-monument-shape-v-rocket-inscription-sarnaki-poland-commemorating-world-war-ii-polish-heroes-71868054.jpg
Completed Image ====> 576.DTFXLB.jpg
Completed Image ====> 577.54447169_337552116881558_1489561345650094779_n.jpg
Completed Image ====> 578.formosat.jpg
Completed Image ====> 579.metro-piazza-pizza.jpg
Completed Image ====> 580.Lambeth-baths-bombed.jpg
Completed Image ====> 581.rocket-league-rumble.jpg
Completed Image ====> 582.maxresdefault.jpg
Completed Image ====> 583.image_90004.jpeg
Completed Image ====> 584.Santa-Bufalina-pizza-720x480.jpg
Completed Image ====> 585.7836309_f520.jpg
Completed Image ====> 586.dsc05409.jpg
Completed Image ====> 587.rocketML010803_100x110.jpg
Completed Image ====> 588.682074327.jpg
Completed Image ====> 589.Thames%2BRockets.jpg
Completed Image ====> 590.Diamondback-Moth-on-London-.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 591.29604074145_8b48c4315e_b.jpg
Completed Image ====> 592.londonRocketSm.jpg
Completed Image ====> 593.lh_3.jpg
Completed Image ====> 594.20190216_170313-e1550625559355-768x1024.jpg
Completed Image ====> 595.2_4_d6.jpg
Completed Image ====> 596.Estimated-lower-threshold-temperatures-and-times-for-isothermal-inactivation-of-seed-of.png
Completed Image ====> 597.space-rockets-at-london-science-museum.jpg
Completed Image ====> 598.londonrocket1.jpg
Completed Image ====> 599.Frame_Black-Arrow1.jpg
Completed Image ====> 600.bresaola-parmesan-rocket.jpg
Completed Image ====> 601._MG_3861%20copy%202.jpg
Completed Image ====> 602.IMG_2510.jpg
Completed Image ====> 603.Teff.jpg
Completed Image ====> 604.D6sLquIX4AAFw9y.jpg
Completed Image ====> 605.78683e_7027722c38d74cc0b513ee43b32e4aa2~mv2.webp
Completed Image ====> 606.hqdefault.jpg
Completed Image ====> 607.54428676_362798810994767_5988585013693480279_n.jpg
Completed Image ====> 608.p1220343083-3.jpg
Completed Image ====> 609.stephensons-rocket-locomotive-science-museum-london-uk-avante-garde-template-steam-powered-passenger-locomotives-53493961.jpg
Completed Image ====> 610.PAPER%20London%20Rocket%20Wool%20Jumper%20Sweaters%20%20Knits%20Sapphire%20FQLEWI_1.jpg
Completed Image ====> 611.316120_1.jpg
Completed Image ====> 612.IMG_0641.jpg
Completed Image ====> 613.Stripped-Back-tomato-salad.jpg
Completed Image ====> 614.hqdefault.jpg
Completed Image ====> 615.property.jpg
Completed Image ====> 616.c6461645-1a13-48bb-a5b1-6d7661712435.jpeg
Completed Image ====> 617.p196041756-3.jpg
Completed Image ====> 618.53419775_660699761016397_2026533198008089050_n.jpg
Completed Image ====> 619.vintage-street-style-london-rocket-originals-sophia-blue-wedge-sandals-navy-1940s-1950s-handbag-hat-chiffon-scarf.jpg
Completed Image ====> 620.The-Proud-Archivist-cauliflower-720x480.jpg
Completed Image ====> 621.maxresdefault.jpg
Completed Image ====> 622.p411390444-3.jpg
Completed Image ====> 623.tansy.jpg
Completed Image ====> 624.p1220347285-3.jpg
Completed Image ====> 625.20131022Rauke2.jpg
Completed Image ====> 626.snapdragon%2Bin%2Bgarden.jpg
Completed Image ====> 627.p813812566-3.jpg
Completed Image ====> 628.priya-guha-rocketspace-uk-london-general-manager.jpg
Completed Image ====> 629.tOMwMEu2Dcqfr2PxVKu0BlLz6FBUIamZsQRQhDSX1Kg.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 629 is all we got for this search filter!

Errors: 37

Sow Thistle

keywords["keywords"] = "smooth sow thistle"
sow_thistle_paths = google_images.download(keywords)

Item no.: 1 --> Item name = smooth sow thistle
Evaluating...
Getting you a lot of images. This may take a few moments...
Reached end of Page.
Starting Download...
Completed Image ====> 1.sowthistle_smooth.jpg
Completed Image ====> 2.SowThistle(Smooth)_DSC07766p1.JPG
Completed Image ====> 3.9652.jpg
Completed Image ====> 4.SowThistle(Smooth)_eastLancsRd_2010_09_21_003p9.jpg
Completed Image ====> 5.Sow-thistle,%20Smooth%20(Sonchus%20oleraceus)%20Church%20Walk%20Sapcote%20SP%204894%209320%20(taken%2011.10.2008).JPG
Completed Image ====> 6.Smooth_Sow_Thistle_sw_080716_60983c.jpg
Completed Image ====> 7.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_018p2.jpg
Completed Image ====> 8.sonch_oler.jpg
Completed Image ====> 9.large_Sowthistle1.jpg
Completed Image ====> 10.SowThistle(Smooth)_2009_04_03_BoatCrawl_LancasterCanal_KenBirchs_540p6.jpg
Completed Image ====> 11.sonchus_oleraceus_smooth_sow_thistle.jpg
Completed Image ====> 12.1200px-Sonchus_February_2008-1.jpg
Completed Image ====> 13.SowThistle(Smooth)_2009_04_03_BoatCrawl_LancasterCanal_KenBirchs_542p6.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 14.web%208.jpg
Completed Image ====> 15.5374204_8c2e7bdd.jpg
Completed Image ====> 16.Sow-Thistle-8.jpg
Completed Image ====> 17.common_sow_thistle_plant1.jpg
Completed Image ====> 18.Sow-thistle,%20Prickly%20(Sonchus%20asper)%20Old%20Fosse%20Sapcote%20SP%204909%209166%20(taken%202.6.2006)..JPG
Completed Image ====> 19.web%202.jpg
Completed Image ====> 20.flowering-tops-of-smooth-sow-thistle-sonchus-oleraceus-the-leaves-J4Y65Y.jpg
Completed Image ====> 21.Sow-Thistle-4.jpg
Completed Image ====> 22.ece0de.jpg
Completed Image ====> 23.Sow-thistle-Prickly-1.jpg
Completed Image ====> 24.Sow-thistle-Prickly-2.jpg
Completed Image ====> 25.p18mjkdkkn9251qh3lht1n8m13sv3.jpg
Completed Image ====> 26.flowering-top-of-smooth-sow-thistle-sonchus-oleraceus-young-leaves-edible-as-a-foraged-food-common-uk-european-weed-T5KTH3.jpg
Completed Image ====> 27.Smooth%20Sowthistle.jpeg
Completed Image ====> 28.IMG_20190528_103650946.jpg
Completed Image ====> 29.sonchus_oleraceus_smooth_sow_thistle_common_flower_plant_side_view_19-09-08.jpg
Completed Image ====> 30.2011-06-23%20at%2012-41-40.jpeg
Completed Image ====> 31.ecf0a7.jpg
Completed Image ====> 32.flowering-top-of-smooth-sow-thistle-sonchus-oleraceus-young-leaves-edible-as-a-foraged-food-common-uk-european-weed-T5KTHD.jpg
Completed Image ====> 33.smooth_sowthistle_IMGP0261.jpg
Completed Image ====> 34.p179q2ticb1lro1rlg1koq1j3v18pf3l.jpg
Completed Image ====> 35.yellow-flowered-smooth-sow-thistle-sonchus-oleraceus-is-a-member-of-J0NPFP.jpg
Completed Image ====> 36.Common_sowthistle___Sonchus_oleraceus-005.JPG
URLError on an image...trying next one... Error: HTTP Error 404: Not Found
Completed Image ====> 37.IMG_1747.JPG
Completed Image ====> 38.yellow-flowers-flowering-top-of-smooth-sow-thistle-sonchus-oleraceus-young-leaves-edible-as-a-foraged-food-common-uk-european-weed-T7A95H.jpg
Completed Image ====> 39.sonchus_oleraceus_smooth_sow_thistle_close.jpg
Completed Image ====> 40.sonchus-oleraceus1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 41.SS2521204.jpg
Completed Image ====> 42.Smooth-sow-thistle-seedling.jpg
Completed Image ====> 43.FOOD_sowthistle-1024x673.jpg
Completed Image ====> 44.prickly_sowthistle.jpg
Completed Image ====> 45.smooth_sowthistle_2907t_r20.jpg
Completed Image ====> 46.maxresdefault.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 47.85b24d.jpg
Completed Image ====> 48.80115760.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 49.smooth-sow-thistle-sonchus-oleraceus-flowers-XE1RR3.jpg
Completed Image ====> 50.Sow-thistle-Smooth-1.jpg
Completed Image ====> 51.smooth-sow-thistle-sonchus-oleraceus-yellow-soft-79333227.jpg
Completed Image ====> 52.Common%20Sowthistle.jpg
Completed Image ====> 53.smooth_sow_thistle.jpg
Completed Image ====> 54.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_017p1.jpg
Completed Image ====> 55.29139600124_115d1a9af8_b.jpg
Completed Image ====> 56.yellow-flowered-smooth-sow-thistle-sonchus-oleraceus-is-a-member-of-J0NPG2.jpg
Completed Image ====> 57.common-sow-thistle-leaves.jpg
Completed Image ====> 58.5374202_0b7ad895.jpg
Completed Image ====> 59.common-sow-thistle-plant.jpg
Completed Image ====> 60.72225205.jpg
Completed Image ====> 61.SNCOL-Sonchus_oleraceus_t.jpg
Completed Image ====> 62.80116088.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 63.IMG_1917.JPG
Completed Image ====> 64.Pricklysow-croprotect.jpg
Completed Image ====> 65.Smooth%20Sowthistle_P1020431.jpeg
Completed Image ====> 66.bd78cc.jpg
Completed Image ====> 67.annual-sowthistle-sonchus-oleraceus-common-450w-1166678155.jpg
Completed Image ====> 68.329121.jpg
Completed Image ====> 69.sowthistle_large.jpg
Completed Image ====> 70.ed85f8.jpg
Completed Image ====> 71.smooth_sowthistle_2909t_r22.jpg
Completed Image ====> 72.24.jpg
Completed Image ====> 73.29010992-smooth-sow-thistle-conchus-oleraceus-inflorescence.jpg
Completed Image ====> 74.Sonchus%20oleraceus%20Chersonesos%2C%20Sevastopol%2C%20Crimea%2C%20Russia%2020150914_0096.jpg
Completed Image ====> 75.p16v168dm2mla19ejvf198v7v57.jpg
Completed Image ====> 76.3535847370_6391db8170_b.jpg
Completed Image ====> 77.80125617.jpg
Completed Image ====> 78.Smooth-Sowthistle2.jpg
Completed Image ====> 79.sonchus-oleraceus_560x315.jpg
Completed Image ====> 80.Common_sowthistle___Sonchus_oleraceus-007.JPG
Completed Image ====> 81.young-sonchus-oleraceus-common-sowthistle-sow-thistle-smooth-annual-hare-s-colwort-other-names-milky-tassel-milk-soft-swinies-117936556.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 82.IMG_20190605_122936493.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 83.IMG_1964.JPG
Completed Image ====> 84.sonchus-oleraceus1.jpg
Completed Image ====> 85.jcs-sonchus-oleraceus-63325.jpg
Completed Image ====> 86.sowthistle_perennial_thumb_410.jpg
Completed Image ====> 87.gwg-sch661.jpg
Completed Image ====> 88.stock-photo-sonchus-oleraceus-or-annual-sowthistle-common-sow-thistle-smooth-sow-thistle-1123582856.jpg
Completed Image ====> 89.annual-sowthistle-sonchus-oleraceus-common-260nw-1328571110.jpg
Completed Image ====> 90.il_794xN.1614660773_px89.jpg
Completed Image ====> 91.smooth-sowthistle-salsa-recipe-750x420.png
Completed Image ====> 92.European_Goldfinch_%28Carduelis_carduelis%29_eating_seeds_of_Smooth_Sow_Thistle_%28Sonchus_oleraceus%29_%2826067225674%29.jpg
Completed Image ====> 93.sow-thistle-flowers.jpg
Completed Image ====> 94.sonchus_oleraceus_smooth_sow_thistle_02-02-13_1.jpg
Completed Image ====> 95.smooth_sow_thistle3_5-4-2014_th.JPG
Completed Image ====> 96.sow-thistle-full-view.jpg
Completed Image ====> 97.Sonchus_oleraceus_flower2.jpg
Completed Image ====> 98.17789.jpg
Completed Image ====> 99.Sow-Thistle-Smooth-2.jpg
Completed Image ====> 100.sonchus-oleraceus-Smooth-Sow-thistle-J.R.Crellin-Floralimages.co.uk.jpg
Completed Image ====> 101.fromother_077_mid.jpg
Completed Image ====> 102.4692982753_46fcb46493_b.jpg
Completed Image ====> 103.83ec77.jpg
Completed Image ====> 104.5374208_158efadd.jpg
Completed Image ====> 105.20.jpg
Completed Image ====> 106.SONOL-leaf-sideW_1344580907.jpg
Completed Image ====> 107.ccb53cb0208a03a5a557396b9c24917e.jpg
Completed Image ====> 108.videoblocks-many-dry-common-sowthistle-flowers-with-fluff-swaying-in-wind-in-late-summer-or-early-autumn-also-called-sow-thistle-smooth-sow-thistle-annual-sow-thistle-hares-colwort-sonchus-oleraceus_rdg29jqnqg_thumbnail-full01.png
URLError on an image...trying next one... Error: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1056)>
Invalid or missing image format. Skipping...
Completed Image ====> 109.annual-sowthistle-sonchus-oleraceus-common-260nw-1328571026.jpg
Completed Image ====> 110.sonchus-oleraceus-smooth-sow-thistle-seed-head-and-flowers-on-the-end-of-a-tall-stem-PFR2BJ.jpg
Completed Image ====> 111.rdc-ad_135126.jpg
Completed Image ====> 112.SowthistleE.jpg
Completed Image ====> 113.beautiful-dry-common-sowthistle-flower-with-fluff-swaying-in-wind-in-late-summer-or-early-autumn-also-called-sow-thistle-smooth-sow-thistle-annual-sow-thistle-hares-colwort-sonchus-oleraceus_sixajmgbil_thumbnail-full01.png
Completed Image ====> 114.142a5.jpg
Completed Image ====> 115.a5aa6c.jpg
Completed Image ====> 116.Common_sowthistle___Sonchus_oleraceus-004.JPG
Completed Image ====> 117.76138.jpg
Completed Image ====> 118.Sonchus_oleraceus.jpg
Completed Image ====> 119.Sonchus_oleraceus_flower3.jpg
Completed Image ====> 120.web%209.jpg
Completed Image ====> 121.5374207_ad55345e.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 122.Sonchus%20oleraceus%202%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Completed Image ====> 123.Sonchus%20asper%20Jordh%C3%B6gar%20Hyllie%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020180604_0035.jpg
Completed Image ====> 124.475ded.jpg
Completed Image ====> 125.sonchus-oleraceus2.jpg
Completed Image ====> 126.Sonchus%20oleraceus%205%2C%20Gewone%20melkdistel%2C%20Saxifraga-Peter%20Meininger.JPG
Completed Image ====> 127.655196.jpg
Completed Image ====> 128.5455851254_fa04765b5d_b.jpg
IOError on an image...trying next one... Error: The read operation timed out
Completed Image ====> 129.sonchus_oleraceus_smooth_sow_thistle_common_flower_01-05-04.jpg
Completed Image ====> 130.sonchus-asper-juvenile-plant-in-nature1.jpg
Completed Image ====> 131.smooth-sow-thistle-sonchus-oleraceus-flower-bud-and-seedheads-forming-BR6A78.jpg
Completed Image ====> 132.plant_Smooth_Sow_thistle_wf_080614_60264c.jpg
Completed Image ====> 133.46662533232_ccfe6335a7_b.jpg
Completed Image ====> 134.23.jpg
Completed Image ====> 135.Sonchus_oleraceus_-_Smooth_Sow-thistle.JPG
URLError on an image...trying next one... Error: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1056)>
Completed Image ====> 136.sow_thistle_360x203.png
Completed Image ====> 137.8158769_orig.jpg
Completed Image ====> 138.sonchus-oleraceus-beautiful-dry-common-sowthistle-flower-with-fluff-swaying-in-wind-in-late-summer-or-early-autumn-also-called-sow-thistle-smooth-sow-thistle-annual-sow-thistle-hares-colwort_setyznjh_thumbnail-full01.png
Completed Image ====> 139.sow-thistle-flower-2.jpg
Completed Image ====> 140.aam-aaes91799.jpg
Completed Image ====> 141.67916.jpg
Completed Image ====> 142.3097063_orig.jpg
Completed Image ====> 143.SNCOL-Flower20.jpg
Completed Image ====> 144.01321434.jpg
Completed Image ====> 145.Weed178.jpg
Completed Image ====> 146.Sonchus%20oleraceus%20Ridhuset%2C%20Klagshamns%20udde%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020150609_0016.jpg
Completed Image ====> 147.3170025235_c0fa8a4ea5_b.jpg
Completed Image ====> 148.SowThistle2.jpg
Completed Image ====> 149.smooth-sow-thistle-sonchus-oleraceus-young-plant-leaf-rosette-B4YA1A.jpg
Completed Image ====> 150.smooth_sow_thistle2_5-4-2014_th.JPG
Completed Image ====> 151.sowthistle_plant1.jpg
Completed Image ====> 152.smooth-sow-thistle-sonchus-oleraceus-260nw-1097605763.jpg
Completed Image ====> 153.smooth-sow-thistle.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 154.b112d2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 155.2012-01-24%20at%2012-12-40.jpeg
Completed Image ====> 156.rosette_smooth_sow_thistle_21-2-2018_th.JPG
Completed Image ====> 157.Smooth-Sow-Thistle-Sonchus-oleraceus-POPUP.jpg
Completed Image ====> 158.500_F_82043410_9WuvLcouY72SO2MIP35u8pUt0M3HSRZS.jpg
Completed Image ====> 159.IMG_20190609_145833225.jpg
Completed Image ====> 160.stock-photo-sonchus-oleraceus-or-annual-sowthistle-common-sow-thistle-smooth-sow-thistle-1125654875.jpg
Completed Image ====> 161.53372.jpg
Completed Image ====> 162.90361106.jpg
Completed Image ====> 163.96b547.jpg
Completed Image ====> 164.Sonchus%20oleraceus%203%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 165.fhr-88888-12309-686.jpg
Completed Image ====> 166.videoblocks-scenic-dry-common-sowthistle-flower-with-fluff-swaying-in-wind-in-late-summer-or-early-autumn-also-called-sow-thistle-smooth-sow-thistle-annual-sow-thistle-hares-colwort-sonchus-oleraceus_sdaio7hcg_thumbnail-full01.png
Completed Image ====> 167.Common_sowthistle___Sonchus_oleraceus-003.JPG
Completed Image ====> 168.142a3.jpg
Completed Image ====> 169.yellow-flowered-smooth-sow-thistle-sonchus-oleraceus-is-a-member-of-J0NPFG.jpg
Completed Image ====> 170.SONSS-EAR-700.jpg
Completed Image ====> 171.scenic-dry-common-sowthistle-flower-fluff-swaying-wind-late-summer-early-autumn-also-called-sow-thistle-smooth-annual-113403593.jpg
Completed Image ====> 172.sonchus-oleraceus-smooth-sow-thistle-english-school.jpg
Completed Image ====> 173.p661350765-3.jpg
Completed Image ====> 174.27445a.jpg
Completed Image ====> 175.sow-thistle-2.jpg
Completed Image ====> 176.sonchus_oleraceus_smooth_sow_thistle_common_00_flower_03-06-08_1.jpg
Completed Image ====> 177.possible_smooth_sow_thistle_4-4-2014_th.JPG
Completed Image ====> 178.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_020p3.jpg
Completed Image ====> 179.perennial_sowthistle-young.jpg
Completed Image ====> 180.3373645632_ffe48fe31a_b.jpg
Completed Image ====> 181.4f36b5.jpg
Completed Image ====> 182.18b.jpg
Completed Image ====> 183.IMG_7500-Smooth-Sow-thistle-Sonchus-oleraceus-Old-croft-house-NC044306-6-12-16-2.jpg
Completed Image ====> 184.14033.jpg
Completed Image ====> 185.sonchus-oleraceus2.jpg
Completed Image ====> 186.stock-photo-annual-sowthistle-or-sonchus-oleraceus-common-sow-thistle-smooth-sow-thistle-hare-s-colwort-1170548473.jpg
Completed Image ====> 187.field-sowthistle-seedhead.jpg
Completed Image ====> 188.IMG_4692.JPG
Completed Image ====> 189.2013-07-02%20at%2015-23-58.jpeg
Completed Image ====> 190.web%204.jpg
Completed Image ====> 191.plants_484_mid.jpg
Completed Image ====> 192.smooth-sow-thistle-sonchus-oleraceus-flowering-plants-a1w22m.jpg
Completed Image ====> 193.SNCOL-Flower5.jpg
Completed Image ====> 194.rdc-ad-175924.jpg
Completed Image ====> 195.sow-thistle-pulled.jpg
Completed Image ====> 196.SowThistle(Smooth)_2009_04_03_BoatCrawl_LancasterCanal_KenBirchs_540p7.jpg
Completed Image ====> 197.Sow-thistle-Perennial-2.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 198.fab10s00f.jpg
Completed Image ====> 199.sonchus_oleraceus_smooth_sow_thistle_common_flower_19-09-08.jpg
Completed Image ====> 200.Sonchus_oleraceus__Smooth_Sow_Thistle_.JPG
Completed Image ====> 201.c5f7d7.jpg
Completed Image ====> 202.sow-thistle.jpg
Completed Image ====> 203.142a1.jpg
Completed Image ====> 204.3244d2.jpg
Completed Image ====> 205.3321766617_fd28c26175_b.jpg
Completed Image ====> 206.smooth-sow-thistle-sonchus-oleraceus-bob-gibbons-canvas-print.jpg
Completed Image ====> 207.web%203.jpg
Completed Image ====> 208.plants_485_mid.jpg
Completed Image ====> 209.80110235.jpg
Completed Image ====> 210.329126.jpg
Completed Image ====> 211.SNCOL-Plant5.jpg
Completed Image ====> 212.field-sow-thistle.jpg
Completed Image ====> 213.stock-photo-annual-sowthistle-or-sonchus-oleraceus-common-sow-thistle-smooth-sow-thistle-hare-s-colwort-1170546952.jpg
Completed Image ====> 214.4543s.jpg
Completed Image ====> 215.Sonchus-Oleraceus-Smooth-Sowthistle.jpg
Completed Image ====> 216.08757-Sonchus-oleraceus.jpg
Completed Image ====> 217.smooth-sowthistle.jpg
Completed Image ====> 218.rdc-ad_135097.jpg
Completed Image ====> 219.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_027p5.jpg
Completed Image ====> 220.smooth_sow_thistle4_5-4-2014_th.JPG
Completed Image ====> 221.Common_sowthistle___Sonchus_oleraceus-001.JPG
Completed Image ====> 222.stock-photo-annual-sowthistle-or-sonchus-oleraceus-common-sow-thistle-smooth-sow-thistle-hare-s-colwort-1163731474.jpg
Completed Image ====> 223.13.jpg
Completed Image ====> 224.Leaves151.jpg
Completed Image ====> 225.c72dca.jpg
Completed Image ====> 226.smooth-sow-thistle-sonchus-oleraceus-bob-gibbonsscience-photo-library.jpg
Completed Image ====> 227.sow-thistle.jpg
Completed Image ====> 228.103166.jpg
Completed Image ====> 229.Smooth-Sow-Thistle-Sonchus-oleraceus-grubbed-out-popup.jpg
Completed Image ====> 230.smooth-sow-thistle-leaf-detail.jpg
Completed Image ====> 231.IMG_20190605_102911324.jpg
Completed Image ====> 232.sonchus_oleraceus_smooth_sow_thistle_common_flower_leaf_18-06-04.jpg
Completed Image ====> 233.Sonchus%20oleraceus%20P-pl%20Kloster%C3%A4ngsv%C3%A4gen%2C%20Lund%2C%20Sk%C3%A5ne%2C%20Sweden%2020150608_0097.jpg
Completed Image ====> 234.Sonchus%20oleraceus%201%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Completed Image ====> 235.smooth-sow-thistle.jpg
Completed Image ====> 236.sonchus_oleraceus_564.jpg
Completed Image ====> 237.Sonchus_oleraceus,I_TQBH4670.jpg
Completed Image ====> 238.SONOL-from-aboveW_1344580830.jpg
Completed Image ====> 239.weed_dandelionflower-e1401844344375.jpg
Completed Image ====> 240.Sow-thistle-Perennial-1.jpg
Completed Image ====> 241.SNCOL-Flower02_L.jpg
Completed Image ====> 242.25343015684_f8d326024c.jpg
Completed Image ====> 243.SowThistle.jpg
Completed Image ====> 244.54317.jpg
Completed Image ====> 245.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_019p09.jpg
Completed Image ====> 246.IMG_02091.jpg
Completed Image ====> 247.SONoler3b.JPG
Completed Image ====> 248.11053300674_eca626ca2a_b.jpg
Completed Image ====> 249.2012-07-04%20at%2010-26-44.jpeg
Completed Image ====> 250.fhr-88888-12441-686.jpg
Completed Image ====> 251.Smooth_Sow-thistle.jpg
Completed Image ====> 252.032.jpg
Completed Image ====> 253.sonchus_oleraceus_smooth_sow_thistle_close_large.jpg
Completed Image ====> 254.a2449d.jpg
Completed Image ====> 255.sow-thistle-bud.jpg
Completed Image ====> 256.24982479211_9bb743b51e.jpg
Completed Image ====> 257.80122105.jpg
Completed Image ====> 258.may17SmSowThFl.jpg
Completed Image ====> 259.smoothsowthistle.JPG
Completed Image ====> 260.SNCOL-Inflorescences.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 261.roughsowthistle2.jpg
Completed Image ====> 262.jjj%2B%25281%2529.JPG
Completed Image ====> 263.weed_sowthistle.jpg
Completed Image ====> 264.Warren_St_smooth_sow_thistle_12-2-2019_th.JPG
Completed Image ====> 265.SST-271016.jpg
Completed Image ====> 266.67917.jpg
Completed Image ====> 267.SNCOL-Flower21.jpg
Completed Image ====> 268.sow_thistle3_560x315.png
Completed Image ====> 269.S_oleraceus_IMGP0259.jpg
Completed Image ====> 270.unknown_weed2_27-3-2014_th.JPG
Completed Image ====> 271.tn_Smooth%20sowthistle.jpg
Completed Image ====> 272.Warren_St_weeds_12-2-2019_th.JPG
Completed Image ====> 273.a1487740-7171-4c80-8e09-70db9825bd35.jpg
Completed Image ====> 274.7e15d8.jpg
Completed Image ====> 275.sonchus_oleraceus_smooth_sow_thistle_common_leaf_19-09-08.jpg
Completed Image ====> 276.hqdefault.jpg
Completed Image ====> 277.sow-thistle-stem.jpg
Completed Image ====> 278.2012-12-04%20at%2012-26-56.jpeg
Completed Image ====> 279.Sonchus_oleraceus__Sow_thistle_6.JPG
Completed Image ====> 280.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_044p7.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 281.440463301_09a2660f39_b.jpg
Completed Image ====> 282.002840-sonchus-oleraceus.jpg
Completed Image ====> 283.dscn1101_orig.jpg
Completed Image ====> 284.sonchus_oleraceus_19e1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 285.TFIEF+02.jpg
Completed Image ====> 286.15.jpg
Completed Image ====> 287.SONSS-FLO-700.jpg
Completed Image ====> 288.il_340x270.1614660773_px89.jpg
Completed Image ====> 289.puha...jpg
Completed Image ====> 290.318097.jpg
Completed Image ====> 291.hqdefault.jpg
Completed Image ====> 292.pre-rm01936270351.jpg
Completed Image ====> 293.SST230.jpg
Completed Image ====> 294.SmoothSowThistle.jpg
Completed Image ====> 295.SONOL-adultW_1344580654.jpg
Completed Image ====> 296.SNCOL-Leaf07.jpg
Completed Image ====> 297.Sonchus%20oleraceus%206%2C%20Gewone%20melkdistel%2C%20Saxifraga-Willem%20van%20Kruijsbergen.jpg
Completed Image ====> 298.f9fa3a.jpg
Completed Image ====> 299.44738367760_7413aa0788_b.jpg
Completed Image ====> 300.IMG_02091-e1359058715293-764x1024.jpg
Completed Image ====> 301.smooth-sow-thistle-sonchus-oleraceus-bob-gibbonsscience-photo-library.jpg
Completed Image ====> 302.sonchus_oleraceus_smooth_sow_thistle_common_flower_13-08-05.jpg
Completed Image ====> 303.smooth-sow-thistle.JPG
Completed Image ====> 304.194189_w_300.jpg
Completed Image ====> 305.53310.jpg
Completed Image ====> 306.smooth_sow_thistle_buds_21-4-2017.JPG
Completed Image ====> 307.IMG_20190603_102602098.jpg
Completed Image ====> 308.2013-06-07%20at%2009-01-57.jpeg
Completed Image ====> 309.3147587535_27cc95929d_b.jpg
Completed Image ====> 310.il_570xN.1567199632_psuv.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 311.0181be.jpg
Completed Image ====> 312.sonchus_oleraceus_01.jpg
Completed Image ====> 313.sonchus_oleraceus_1.jpg
Completed Image ====> 314.15jun004.jpg
Completed Image ====> 315.sow-thistle-seedlings.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 316.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_045p99.jpg
Completed Image ====> 317.93a92f.jpg
Completed Image ====> 318.SNCOL-Plant2.jpg
Completed Image ====> 319.5711750775_4336bc77a6_b.jpg
Completed Image ====> 320.p821331182-3.jpg
Completed Image ====> 321.D00DTmiX4AUMiGb.jpg
Completed Image ====> 322.SONSS-COT-700.jpg
Completed Image ====> 323.5871.jpg
Completed Image ====> 324.Common_sowthistle___Sonchus_oleraceus-006.JPG
Completed Image ====> 325.sow-thistle-flower.jpg
Completed Image ====> 326.sonchus%20oleraceus%207172.JPG
Completed Image ====> 327.v-cardoon-large-smooth_620x.jpg
Completed Image ====> 328.SowThistle154.jpg
Completed Image ====> 329.Sonchus_oleraceus_flower.jpg
Completed Image ====> 330.sonchus_oleraceus_smooth_sow_thistle_common_flowering_plant_19-09-08.jpg
Completed Image ====> 331.Cicerbita+macrophylla+NT0035+17June2016+PW+2.jpg
Completed Image ====> 332.80103630.jpg
Completed Image ====> 333.sonchus-oleraceus15412.jpg
Completed Image ====> 334.smooth_sow_thistles_24-2-2018_th.JPG
Completed Image ====> 335.20278481668_566392b427_b.jpg
Completed Image ====> 336.Sonchus%20oleraceus%207%2C%20Gewone%20melkdistel%2C%20Saxifraga-Rutger%20Barendse.jpg
Completed Image ====> 337.8a6ba5.jpg
Completed Image ====> 338.Spray-Application-Advice.jpg
Completed Image ====> 339.2012-07-04%20at%2010-26-31.jpeg
Completed Image ====> 340.16jun016.jpg
Completed Image ====> 341.6soaru.jpg
Completed Image ====> 342.spiny-sow-thistle-1.JPG
Completed Image ====> 343.smooth-sow-thistle-sonchus-oleraceus-bob-gibbonsscience-photo-library-canvas-print.jpg
Completed Image ====> 344.DSCN1349-Dryad-on-Smooth-Sow-Thistle.jpg
Completed Image ====> 345.smooth-sow-thistle-sonchus-oleraceus_4_orig.jpg
Completed Image ====> 346.25343006054_9d04872569.jpg
Completed Image ====> 347.sow-thistle-seed.jpg
Completed Image ====> 348.TFIEF+01.jpg
Completed Image ====> 349.Dandelion.jpg
Completed Image ====> 350.sonchus_oleraceus_smooth_sow_thistle_common_flower_09-07-04.jpg
Completed Image ====> 351.Weed187.jpg
Completed Image ====> 352.27803f.jpg
Completed Image ====> 353.67915.jpg
Completed Image ====> 354.sowthistle_harvest.jpg
Completed Image ====> 355.sowthistle-root.jpg
Completed Image ====> 356.cultivation_principles_1_560x315.jpg
Completed Image ====> 357.s-l225.jpg
Completed Image ====> 358.smooth-sow-thistle-sonchus-oleraceus_3_orig.jpg
Completed Image ====> 359.4498967791_e25c6d2338_z.jpg
Completed Image ====> 360.map_of_Sonchus_oleraceus.jpg
Completed Image ====> 361.Cystiphora%20sonchi4.jpg
Completed Image ====> 362.Sonchus%20oleraceus%202%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Completed Image ====> 363.hqdefault.jpg
Completed Image ====> 364.Sonchus%20oleraceus%20Yevpatoria%2C%20Crimea%2C%20Russia%2020150910_0219.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 365.Lactuca-serriola-leaves-900x900.jpg
Completed Image ====> 366.12jul001.jpg
Completed Image ====> 367.Bristly-Ox-Tongue-RM-10_2D00_7_2D00_15-HTV-_2800_23_2900_.jpg
Completed Image ====> 368.sowthistle%2Bflowers.jpg
Completed Image ====> 369.Golovinomyces_sonchicola.jpg
Completed Image ====> 370.smooth-sowthistle.jpg
Completed Image ====> 371.unknown_weed_rosette_30-1-2019_th.JPG
Completed Image ====> 372.PFFT1139_Cicerbita_plumieri.jpg
Completed Image ====> 373.sowthistle_HTN.jpg
Completed Image ====> 374.s-l225.jpg
Completed Image ====> 375.33893850613_ee257ea130_b.jpg
Completed Image ====> 376.15.jpg
Completed Image ====> 377.8583870041_016664b427.jpg
Completed Image ====> 378.91301.jpg
Completed Image ====> 379.1156e6.jpg
Completed Image ====> 380.web%206.jpg
Completed Image ====> 381.41TmZtO7ykL.jpg
Completed Image ====> 382.D00DRAdX0AAYH70.jpg
Completed Image ====> 383.SowThistle(Smooth)_2010_09_05_Wigan_Parbold_BurscoughBridge_025p8.jpg
Completed Image ====> 384.sow%20thistle_spiney%20annual_123.jpeg
Completed Image ====> 385.philip_wright_560x315.jpg
Completed Image ====> 386.SNCOL-Bud3.jpg
Completed Image ====> 387.35101351485_80f0d363aa_m.jpg
Completed Image ====> 388.sonchus_oleraceus_smooth_sow_thistle_common_flower_side_view_13-08-05.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 389.498optimized.jpg
Completed Image ====> 390.200811191415440.smooth_sow-thistle.JPG
Completed Image ====> 391.Warren_St_swine_cress_buds_in_situ_12-2-2019_th.JPG
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 392.Common_sowthistle___Sonchus_oleraceus.JPG
Completed Image ====> 393.rue-leaved-saxifrage-2.jpg
Completed Image ====> 394.20180520_124526.jpg
Completed Image ====> 395.weeds-tsln-060317-5-3-930x1240.jpg
Completed Image ====> 396.smooth-sow-thistle-sonchus-oleraceus_2_orig.jpg
Completed Image ====> 397.sonchus-oleraceus-smooth-sow-thistle_u-l-pvu2820.jpg
Completed Image ====> 398.Smooth-Hawk_2700_s_2D00_beard-RM-10_2D00_7_2D00_15-HTV-_2800_39_2900_.jpg
Completed Image ====> 399.08f7b527f01601ccc032f34d1eae84ee.jpg
Completed Image ====> 400.SONoler2b.JPG
Completed Image ====> 401.sonchus_oleraceus_smooth_sow_thistle_common_flower_03-06-08_2.jpg
Completed Image ====> 402.Thsmthsowthistle.jpg
Completed Image ====> 403.large.jpg
Completed Image ====> 404.SNCOL-Flower03_L.jpg
Completed Image ====> 405.9593b5130ef023a7ec2aee16f0a5e3c6.jpg
Completed Image ====> 406.rosette_verbascum_20-3-2018.JPG
Completed Image ====> 407.habit_750.jpg
Completed Image ====> 408.Sonchus_oleraceus_leaf.png
Completed Image ====> 409.25.jpg
Completed Image ====> 410.SNCOL-Flower01.jpg
Completed Image ====> 411.puha-2.jpg
Completed Image ====> 412.Sonchus%20oleraceus%20Yevpatoria%2C%20Crimea%2C%20Russia%2020150910_0219.jpg
Completed Image ====> 413.CIMG4907.jpg
Completed Image ====> 414.bee.jpg
Completed Image ====> 415.c0342f.jpg
Completed Image ====> 416.Sonchus_arvensis,I_MWS28869.jpg
Completed Image ====> 417.p18qhkg196uos1tgc1mmr2c9ahd4.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 418.Gall_on_SonchusLeaves_2018_07_21_Ainsdale_GreenBeach_Botanisin_262p1.jpg
Completed Image ====> 419.red-sorrel-11621-p1010765.jpg
Completed Image ====> 420.Cats-ear-and-dandelion.jpg
Completed Image ====> 421.S_Sowthistle1.jpg
Completed Image ====> 422.19deb0f654eff1f8b3297ce938098d492efefc43.jpg
Completed Image ====> 423.geranium_molle_rosette_centre_close-up_30-1-2019_th.JPG
Completed Image ====> 424.il_340x270.1664549223_hfgq.jpg
Completed Image ====> 425.sonchus_oleraceus.jpg
Completed Image ====> 426.24.jpg
Completed Image ====> 427.Prickly%20sow%20thistle_LR_29.jpeg
Completed Image ====> 428.sow-thistle.jpg
Completed Image ====> 429.MUS-CS1212_622.jpg
Completed Image ====> 430.ssthistle.png
Completed Image ====> 431.Sonchus%20oleraceus%20Smooth%20Sow-thistle%20p8200764%20thumb.jpg
Completed Image ====> 432.SONSS-COT-200.jpg
Completed Image ====> 433.P1590845.jpg
Completed Image ====> 434.IMG_8129.JPG
Completed Image ====> 435.weed_dandelion.jpg
Completed Image ====> 436.Smooth_Hawksbeard12.JPG
Completed Image ====> 437.SowThistle157.jpg
Completed Image ====> 438.Sonchus%20palustris%20Lagunens%20sm%C3%A5b%C3%A5tshamn%2C%20Ribersborg%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160725_0032.jpg
Completed Image ====> 439.img_1458.jpg
Completed Image ====> 440.SmoothHawksbeard.jpg
Completed Image ====> 441.87186da60d4d275c993d6bf2e3614439--wild-edibles-medicinal-herbs.jpg
Completed Image ====> 442.winterhel-1.jpeg
Completed Image ====> 443.06jun041.jpg
Completed Image ====> 444.Hypochaeris-glabra02.jpg
Completed Image ====> 445.rosette_smooth_sow_thistle_2-12-2017_th.JPG
Completed Image ====> 446.crepis-capillaris-Smooth-Hawk_s-beard-J.-R.-Crellin-Floralimages.co.uk.jpg
Completed Image ====> 447.sonchus-arvensis.jpg
Completed Image ====> 448.Majjistral%20June%202014%20(27).jpg
Completed Image ====> 449.SowThistle(Perennial)_2007_07_27_HallRoad_Formby_Freshfield_594p7.jpg
Completed Image ====> 450.Sonchus%20oleraceus%204%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Completed Image ====> 451.Golovinomyces_sonchicola_mic1.jpg
Completed Image ====> 452.3598637700_77b4e28e18_z.jpg
Completed Image ====> 453.SNCOL-SeedsRipe.jpg
Completed Image ====> 454.181208.jpg
Completed Image ====> 455.nbnr_primrose_100423_1.jpg
Completed Image ====> 456.o_1d8ghjvl51ovq1o8nhgb1aq53jo29.jpg
Completed Image ====> 457.19.jpg
Completed Image ====> 458.181202-smooth-sowthistle-maybe.jpg
Completed Image ====> 459.smooth-sow-thistle-sonchus-oleraceus-plant-leaf-rosette-X7YXKW.jpg
Completed Image ====> 460.SowThistle11051.jpg
Completed Image ====> 461.DSCN2567-001.jpg
Completed Image ====> 462.DSC00078-768x432.jpg
Completed Image ====> 463.Creeping-Thistle-RM-10_2D00_7_2D00_15-HTV-_2800_30_2900_.jpg
Completed Image ====> 464.19843886014_51131b7986_b.jpg
Completed Image ====> 465.f43f85.jpg
Completed Image ====> 466.nbnr_teasel_477x670.jpg
Completed Image ====> 467.fab10s00h.jpg
Completed Image ====> 468.SONSS-FLO-700.jpg
Completed Image ====> 469.sasperleaf.jpg
Completed Image ====> 470.creeping-thistle.jpg
Completed Image ====> 471.SowThistle(Rough)_2011_04_28_EyeHosp_KnottBar_BridgewaterCanal_Home_222p2.jpg
Completed Image ====> 472.41TmZtO7ykL.jpg
Completed Image ====> 473.Sonchus%20oleraceus%20Yevpatoria%2C%20Crimea%2C%20Russia%2020150910_0219.jpg
Completed Image ====> 474.sonchus-oleraceus-2.jpg
Completed Image ====> 475.D00DRAdX0AAYH70.jpg
Completed Image ====> 476.sowthistle-root.jpg
Completed Image ====> 477.o_1aq2pu1kt1uc31dhokcl1s4csms3m.jpg
Completed Image ====> 478.map_of_Sonchus_oleraceus.jpg
Completed Image ====> 479.91301.jpg
Completed Image ====> 480.smooth-sowthistle.jpg
Completed Image ====> 481.35101351485_80f0d363aa_m.jpg
Completed Image ====> 482.fieldsowthistbracth.jpg
Completed Image ====> 483.unknown_weed_rosette_30-1-2019_th.JPG
Completed Image ====> 484.SONOL-flower-bud-L-61_1398180290.jpg
Completed Image ====> 485.sow%20thistle_spiney%20annual_123.jpeg
Completed Image ====> 486.1156e6.jpg
Completed Image ====> 487.498optimized.jpg
Completed Image ====> 488.200811191415440.smooth_sow-thistle.JPG
Completed Image ====> 489.SNCOL-Bud3.jpg
Completed Image ====> 490.sowthistle%2Bflowers.jpg
Completed Image ====> 491.61152677_930201003978159_5940430441820228445_n.jpg
Completed Image ====> 492.8583870041_016664b427.jpg
Completed Image ====> 493.sonchus_oleraceus_smooth_sow_thistle_common_flower_side_view_13-08-05.jpg
Completed Image ====> 494.15.jpg
URLError on an image...trying next one... Error: <urlopen error unknown url type: x-raw-image>
Completed Image ====> 495.SowThistle(Prickly)_2010_09_05_Wigan_Parbold_BurscoughBridge_040p3.jpg
Completed Image ====> 496.opium-lettuce-Lactuca-Serriola.jpg
Completed Image ====> 497.rue-leaved-saxifrage-2.jpg
Completed Image ====> 498.20180520_124526.jpg
Completed Image ====> 499.Sow%2BThistle%2BI.JPG
Completed Image ====> 500.weeds-tsln-060317-5-3-930x1240.jpg
Completed Image ====> 501.sonchus-oleraceus-smooth-sow-thistle_u-l-pvu2820.jpg
Completed Image ====> 502.smooth-sow-thistle-sonchus-oleraceus_2_orig.jpg
Completed Image ====> 503.1050psowthistlepamp.jpg
Completed Image ====> 504.red-sorrel-11621-p1010765.jpg
Completed Image ====> 505.web%208.jpg
Completed Image ====> 506.SONoler2b.JPG
Completed Image ====> 507.Smooth-Hawk_2700_s_2D00_beard-RM-10_2D00_7_2D00_15-HTV-_2800_39_2900_.jpg
Completed Image ====> 508.08f7b527f01601ccc032f34d1eae84ee.jpg
Completed Image ====> 509.common-sow-thistle-stem.jpg
Completed Image ====> 510.senecio2-453x573.jpg
Completed Image ====> 511.sow%20thistle%20N1.jpg
Completed Image ====> 512.1452646619101.jpeg
Completed Image ====> 513.large.jpg
Completed Image ====> 514.fieldsowthistflwh.jpg
Completed Image ====> 515.cultivation_principles_1_560x315.jpg
Completed Image ====> 516.PerennialSowThistle2_500_rdax_333x311_80.jpg
Completed Image ====> 517.Sonchus_asper,I_TQBH14676.jpg
Completed Image ====> 518.Warren_St_swine_cress_buds_in_situ_12-2-2019_th.JPG
Completed Image ====> 519.Flower-and-flowerbuds-of-Prickly-sow-thistle.jpg
Completed Image ====> 520.20100326135648e12.jpg
Completed Image ====> 521.9593b5130ef023a7ec2aee16f0a5e3c6.jpg
Completed Image ====> 522.habit_750.jpg
Completed Image ====> 523.Sonchus_oleraceus_leaf.png
Completed Image ====> 524.p1645ncekam3qkq418nb1cjv1dkji.jpg
Completed Image ====> 525.7278637248_1b14b80755_m.jpg
Completed Image ====> 526.SNCOL-Flower01.jpg
Completed Image ====> 527.nipplewort.lf.jpg
Completed Image ====> 528.puha-2.jpg
Completed Image ====> 529.CIMG4907.jpg
Completed Image ====> 530.SONSS-COT-700.jpg
Completed Image ====> 531.SNCOL-Flower03_L.jpg
URLError on an image...trying next one... Error: HTTP Error 403: Forbidden
Completed Image ====> 532.bee.jpg
Completed Image ====> 533.up09.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 534.sonchus_oleraceus9.jpg
Completed Image ====> 535.c0342f.jpg
Completed Image ====> 536.Cats-ear-and-dandelion.jpg
Completed Image ====> 537.S_Sowthistle1.jpg
Completed Image ====> 538.Sonchus%20oleraceus%20flower1.JPG
Completed Image ====> 539.Sow%2BIII.JPG
Completed Image ====> 540.common_sow_thistle_leaf_margin1.jpg
Completed Image ====> 541.Plant7135e2.jpg
Completed Image ====> 542.19deb0f654eff1f8b3297ce938098d492efefc43.jpg
Completed Image ====> 543.fab10s00g.jpg
Completed Image ====> 544.sonchus_oleraceus.jpg
Completed Image ====> 545.25075819075_a0c66db222.jpg
Completed Image ====> 546.06jun041.jpg
Completed Image ====> 547.greater-knapweed-4.JPG
Completed Image ====> 548.frankenstein_weed_30-4-2017.JPG
Completed Image ====> 549.25.jpg
Completed Image ====> 550.sow-thistle.jpg
Completed Image ====> 551.Sonchus%20oleraceus%20Yevpatoria%2C%20Crimea%2C%20Russia%2020150910_0219.jpg
Completed Image ====> 552.MUS-FAPC1114_405.jpg
Completed Image ====> 553.ssthistle.png
Completed Image ====> 554.Sonchus%20oleraceus%20Smooth%20Sow-thistle%20p8200764%20thumb.jpg
Completed Image ====> 555.P1590845.jpg
Completed Image ====> 556.common-sow-thistle-top.jpg
Completed Image ====> 557.weed_dandelion.jpg
Completed Image ====> 558.fab10s00p.jpg
Completed Image ====> 559.web%201.jpg
Completed Image ====> 560.136917.JPG
Completed Image ====> 561.5871.jpg
Completed Image ====> 562.Prickly%20sow%20thistle_LR_29.jpeg
Completed Image ====> 563.Closer-view-of-flower-of-Prickly-sow-thistle.jpg
Completed Image ====> 564.img_1458.jpg
Completed Image ====> 565.SmoothHawksbeard.jpg
Completed Image ====> 566.87186da60d4d275c993d6bf2e3614439--wild-edibles-medicinal-herbs.jpg
Completed Image ====> 567.winterhel-1.jpeg
Completed Image ====> 568.p17642kd5g1gmu1e3iuaj1klp12qn14.jpg
Completed Image ====> 569.Hypochaeris-glabra02.jpg
Completed Image ====> 570.rosette_verbascum_20-3-2018.JPG
Completed Image ====> 571.19843886014_51131b7986_b.jpg
Completed Image ====> 572.crepis-capillaris-Smooth-Hawk_s-beard-J.-R.-Crellin-Floralimages.co.uk.jpg
Completed Image ====> 573.Screen-Shot-2017-10-24-at-2.12.14-pm-306x400.png
Completed Image ====> 574.Golovinomyces_sonchicola_mic1.jpg
Completed Image ====> 575.Majjistral%20June%202014%20(27).jpg
Completed Image ====> 576.24.jpg
Completed Image ====> 577.fieldsowthistleflw600sq.jpg
Completed Image ====> 578.Sonchus_asper,I_TQBH14672.jpg
Completed Image ====> 579.3598637700_77b4e28e18_z.jpg
Completed Image ====> 580.nbnr_primrose_100423_1.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 581.smooth-sowthistle-seeds.JPG
Completed Image ====> 582.Sonchus%20oleraceus%204%2C%20Gewone%20melkdistel%2C%20Saxifraga-Jan%20van%20der%20Straaten.jpg
Completed Image ====> 583.21446.jpg
Completed Image ====> 584.181202-smooth-sowthistle-maybe.jpg
Completed Image ====> 585.Leaves-of-Prickly-sow-thistle.jpg
Completed Image ====> 586.SowThistle157.jpg
Completed Image ====> 587.web%206.jpg
Completed Image ====> 588.SNCOL-SeedsRipe.jpg
Completed Image ====> 589.IMG_8129.JPG
Completed Image ====> 590.DSC00078-768x432.jpg
Completed Image ====> 591.p17v9mb9oi1qd1jk61bk4efr1ifl3.jpg
Completed Image ====> 592.DSCN2567-001.jpg
Completed Image ====> 593.Creeping-Thistle-RM-10_2D00_7_2D00_15-HTV-_2800_30_2900_.jpg
Completed Image ====> 594.nbnr_teasel_477x670.jpg
Completed Image ====> 595.geranium_molle_rosette_centre_close-up_30-1-2019_th.JPG
Completed Image ====> 596.Sonchus%20palustris%20Lagunens%20sm%C3%A5b%C3%A5tshamn%2C%20Ribersborg%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160725_0026.jpg
Completed Image ====> 597.rosette_750.jpg
Completed Image ====> 598.IMG_4393-Prickly-Sow-thistle-Sonchus-asper-at-post-box-Drumbeg-Stores-9-6-17.jpg
Completed Image ====> 599.5985044b-67df-48ad-bc53-5f253f0672ad.jpg
Completed Image ====> 600.3170025235_c0fa8a4ea5_b.jpg
Completed Image ====> 601.shutterstock_1080645086.jpg
Completed Image ====> 602.f43f85.jpg
Completed Image ====> 603.prod500134.jpg
Completed Image ====> 604.sow_zpsd1hhu45z.JPG
Completed Image ====> 605.ThistleWeedWeaknessExposed.jpg
Completed Image ====> 606.1050psowthistleleaf.jpg
Completed Image ====> 607.common-sow-thistle-buds.jpg
Completed Image ====> 608.19.jpg
Completed Image ====> 609.432612_1_En_7_Figg_HTML.jpg
Completed Image ====> 610.SowThistle11051.jpg
Completed Image ====> 611.Sonchus_arvensis,I_MWS28869.jpg
Completed Image ====> 612.22933.jpg
Completed Image ====> 613.Galium_mollugo-7A650B2644.jpg
Completed Image ====> 614.Kerr-PoisonousPlants1007-2005-13.jpg
Completed Image ====> 615.Sonchus%20palustris%20Lagunens%20sm%C3%A5b%C3%A5tshamn%2C%20Ribersborg%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020160725_0032.jpg
Completed Image ====> 616.rosette_smooth_sow_thistle_2-12-2017_th.JPG
Completed Image ====> 617.SNCOL-Leaf03b.jpg
Completed Image ====> 618.DXeKiJ7WsAEmhCy.jpg
Completed Image ====> 619.Malacothrix_glabrata_1_600.jpg
Completed Image ====> 620.DSCN0963-001.jpg
Completed Image ====> 621.IMG_0031_zps7zwydx6x.JPG
Completed Image ====> 622.fab10s00c.jpg
Completed Image ====> 623.5f3320be1a771c9211b4f9baeb6a631c.jpg
Completed Image ====> 624.sowthistle.jpg
Completed Image ====> 625.1050psowthistleplant.jpg
Completed Image ====> 626.Chemical.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 627.wall-group-web.jpg
Completed Image ====> 628.hmustard.jpg
Completed Image ====> 629.web%205.jpg
Completed Image ====> 630.fieldsowthistseedhd300.jpg
Completed Image ====> 631.Leaf158.jpg
Completed Image ====> 632.Lactuca%20macrophylla%20Banvallen%2C%20Ribersborg%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020180612_5.jpg
Completed Image ====> 633.50716178_245205593069909_667013002427659958_n.jpg
Completed Image ====> 634.15056529_1841355912759707_1091743041254850560_n.jpg
Completed Image ====> 635.201011081438260.smooth_sow_thistle.JPG
Completed Image ====> 636.34137.jpg
Completed Image ====> 637.sonchus_oleraceus_smooth_sow-thistle_055891c66.jpg
Completed Image ====> 638.sonchus-arvensis.jpg
Completed Image ====> 639.4067033308_4a6ba8a601.jpg
Completed Image ====> 640.12.jpg
Completed Image ====> 641.71Xd5wy8TAL._SL1141_.jpg
Completed Image ====> 642.comparison_of_weed_roots_25-4-2015.jpg
Completed Image ====> 643.Sonchus%20palustris%20Lertagsdammen%2C%20Klagshamns%20udde%2C%20Malm%C3%B6%2C%20Sk%C3%A5ne%2C%20Sweden%2020140808_0109.jpg
Completed Image ====> 644.DXeKiImWsAArMaF.jpg
Completed Image ====> 645.d356c865bea0667d6be27f8f5cbc1396--smooth-thistles.jpg
Completed Image ====> 646.t_Sow%20thistle_nipplewort_lr.jpg
Completed Image ====> 647.sonchus_arvensis_perennial_sow_thistle_corn_leaf_06-07-04.jpg
Completed Image ====> 648.22934.jpg
Completed Image ====> 649.5390077_a3fe0cc6.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 650.Weed-182.jpg
Completed Image ====> 651.sow4_zpsceitoega.JPG
Completed Image ====> 652.fab10s00m.jpg
Completed Image ====> 653.27113.jpg
Completed Image ====> 654.SmoothSowThistle229.jpg
Completed Image ====> 655.Dj27c9xW4AA0vXG.jpg
Invalid or missing image format. Skipping...
Completed Image ====> 656.hounds_tongue_mature.jpg
Completed Image ====> 657.web%203.jpg
Completed Image ====> 658.Yellow147.jpg
Completed Image ====> 659.s-l300.jpg
Completed Image ====> 660.RockSamphire083.jpg
Completed Image ====> 661.web%2013.jpg


Unfortunately all 1000 could not be downloaded because some images were not downloadable. 661 is all we got for this search filter!

Errors: 33

Checking the Images

for classification in weed_path.iterdir():
    verify_images(classification, delete=True, max_size=500)
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/lambs-quarters/188.crop_common_lambsquarters_2_robert_videki_doronicum_kft_bugwood.jpg'>
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/lambs-quarters/111.crop_common_lambsquarters_robert_videki_doronicum_kft_bugwood.jpg'>
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/purslane/61.VELEA19595_3.jpg'>
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
Corrupt EXIF data.  Expecting to read 4 bytes but only got 0. 
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/dandelion/568.775759.jpg'>
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:965: UserWarning: Palette images with Transparency   expressed in bytes should be converted to RGBA images
  ' expressed in bytes should be converted ' +
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
/home/athena/data/datasets/images/weeds/cats-ear/298.Ammi-majus.jpg: Removing corrupt EXIF data
/home/athena/.virtualenvs/In-Too-Deep/lib/python3.7/site-packages/PIL/Image.py:1018: UserWarning: Couldn't allocate palette entry for transparency
  warnings.warn("Couldn't allocate palette entry " +
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/smooth-sow-thistle/554.Sonchus%20oleraceus%20Smooth%20Sow-thistle%20p8200764%20thumb.jpg'>
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/smooth-sow-thistle/431.Sonchus%20oleraceus%20Smooth%20Sow-thistle%20p8200764%20thumb.jpg'>
cannot identify image file <_io.BufferedReader name='/home/athena/data/datasets/images/weeds/london-rocket/510.UK-009916_large.jpg'>

View the Data

numpy.random.seed(42)
data = ImageDataBunch.from_folder(weed_path, train=".", valid_pct=0.2,
        ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)

print(data.classes)
['cats-ear', 'dandelion', 'lambs-quarters', 'london-rocket', 'purslane', 'smooth-sow-thistle']
data.show_batch(rows=3, figsize=(7, 8))

show_batch.png

show_batch.png

print("Classes:")
for classification in data.classes:
    print(f" - {classification}")
print(f"\nNumber of Classes: {data.c}"
      "\nSize of Training"
      f" Set: {len(data.train_ds):,}\nSize of validation set: "
      f"{len(data.valid_ds):,}")

Classes:

  • cats-ear
  • dandelion
  • lambs-quarters
  • london-rocket
  • purslane
  • smooth-sow-thistle

Number of Classes: 6 Size of Training Set: 3,112 Size of validation set: 777

The Resnet 34 Model

model = cnn_learner(data, models.resnet34, metrics=error_rate)
model.fit_one_cycle(4)
model.save('stage-1')
model.unfreeze()
print(model.lr_find())
LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.
None
model.recorder.plot()

learning.png

learning.png

model.fit_one_cycle(2, max_lr=slice(3e-5,3e-4))
model.save('stage-2')

Interpretation

interp = ClassificationInterpretation.from_learner(model)
interp.plot_confusion_matrix()

# Out[88]: confusion_matrix.png

confusion_matrix.png

Looking at the mistakes

If you go and look at the actual images, you'll find that despite our reliance on google as the arbiter of search, there's a pretty large number of images that are wrong (for Cat's Ear this is a place where the prevelance of images of cats becomes a particular problem).

Take Two

It seems to struggle with Cat's Ear, which might not be surprising since it is one of the "false dandelions", although that fact would suggest that it would be misidentified as a dandelion, which wasn't generally the case. For dandelions it did provide the most false positives, but for the other plants "Smooth Sow Thistle" seems to have been the most problematic.

data = ImageDataBunch.from_folder(weed_path, train=".", valid_pct=0.2,
        ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)

model = cnn_learner(data, models.resnet34, metrics=error_rate)

model.fit_one_cycle(4)

model.save('stage-1')

model.unfreeze()
print(model.lr_find())
LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.
None
model.recorder.plot()

learning_2.png

model.fit_one_cycle(2, max_lr=slice(3e-5,3e-4))
model.save('stage-2')

Interpretation

interp = ClassificationInterpretation.from_learner(model)
interp.plot_confusion_matrix()

End

Source

The original lesson was created by Francisco Ingham and Jeremy Howard. Inspired by Adrian Rosebrock. It accompanies Fast Ai Lesson 2.

from fastai.widgets import *

db = (ImageList.from_folder(path) .no_split() .label_from_folder() .transform(get_transforms(), size=224) .databunch() )

learn_cln = cnn_learner(db, models.resnet34, metrics=error_rate)

learn_cln.load('stage-2');

ds, idxs = DatasetFormatter().from_toplosses(learn_cln)

ImageCleaner(ds, idxs, path)

ds, idxs = DatasetFormatter().from_similars(learn_cln)

ImageCleaner(ds, idxs, path, duplicates=True)

learn.export()

defaults.device = torch.device('cpu')

img = open_image(path/'black'/'00000021.jpg') img

learn = load_learner(path)

pred_class,pred_idx,outputs = learn.predict(img) pred_class

learn = cnn_learner(data, models.resnet34, metrics=error_rate)

learn.fit_one_cycle(1, max_lr=0.5)

learn = cnn_learner(data, models.resnet34, metrics=error_rate)

learn.fit_one_cycle(5, max_lr=1e-5)

learn.recorder.plot_losses()

learn = cnn_learner(data, models.resnet34, metrics=error_rate, pretrained=False)

learn.fit_one_cycle(1)

np.random.seed(42) data = ImageDataBunch.from_folder(path, train=".", valid_pct=0.9, bs=32, ds_tfms=get_transforms(do_flip=False, max_rotate=0, max_zoom=1, max_lighting=0, max_warp=0 ),size=224, num_workers=4).normalize(imagenet_stats)

learn = cnn_learner(data, models.resnet50, metrics=error_rate, ps=0, wd=0) learn.unfreeze()

learn.fit_one_cycle(40, slice(1e-6,1e-4))

Dog and Cat Breed Classification (What's Your Pet?)

Departure

This is lesson one from the fastai course Practical Deep Learning for Coders, v3, which I assume is the third version of the course, and not a reference to a Japanese television show. It uses the fastai V1 library which uses Pytorch 1.0 but is an opinionated framework that bundles some sensible defaults so you don't have to spend as much time building the networks.

The goal is to train a neural network to identify the breeds of cats and dogs based of photos of them. It uses the Oxford-IIT Pet Dataset which was created by researchers at Oxford University's Visual Geometry Group.

Imports

Python

Other than the re none of the python imports were part of the original lesson. I'm importing gc to do garbage collection because the lesson starts with a smaller network and then changes to a larger one which caused my machine to run out of memory on the GPU. The rest of the imports are for settings and setup.

from argparse import Namespace
from functools import partial
from pathlib import Path
import gc
import os
import re

PyPi

fastai recommends using * to import everything, but I'd like to know where everything comes from and not import something that might conflict with my naming conventions so I'm going to (at least try to) import things individually. Luckily, unlike some projects (I'm looking at you, bokeh), their site has a search feature so you can look things up to see which module they come from.

I'll keep the fast.ai stuff separate to maybe make it easier to reference what comes from where.

from fastai.datasets import untar_data, URLs
from fastai.metrics import accuracy, error_rate
from fastai.train import ClassificationInterpretation
from fastai.vision.data import (
    get_image_files, 
    imagenet_stats, 
    ImageDataBunch)
from fastai.vision.learner import cnn_learner
from fastai.vision.models import resnet18, resnet34, resnet50
from fastai.vision.transform import get_transforms

And the rest…

from dotenv import load_dotenv
from ipyexperiments import IPyExperimentsPytorch
from tabulate import tabulate
import holoviews
import matplotlib.pyplot as pyplot
import numpy
import pandas
import seaborn
import torch

My Stuff

This is just some convenience stuff wrapped around other people's code (my lite-version of opinionated code).

from graeae.tables import CountPercentage
from graeae.timers import Timer
from graeae.visualization import EmbedHoloview

Some Setup

Some Constants

There's a lot of values scattered all over the place and I just wanted one place to keep track of them and maybe change them if needed.

Net = Namespace(
    random_seed=2,
    batch_size=64,
    low_memory_batch_size=16,
)

The Random Seed

To make this reproducible I'll set the random seed in numpy.

numpy.random.seed(Net.random_seed)

The Path

This loads where I put the image data-set.

load_dotenv(".env", override=True)
DATA_PATH = Path(os.environ.get("OXFORD_PET_DATASET")).expanduser()

Plotting

Although I'd prefer to plot things in HoloViews/bokeh, some of their stuff is too tightly bundled to make it easy (and the image plots maybe don't need to be interactive) so this sets up some formatting for the matplotlib plots.

Matplotlib
get_ipython().run_line_magic('matplotlib', 'inline')
get_ipython().run_line_magic('config', "InlineBackend.figure_format = 'retina'")
seaborn.set(style="whitegrid",
            rc={"axes.grid": False,
                "font.family": ["sans-serif"],
                "font.sans-serif": ["Open Sans", "Latin Modern Sans", "Lato"],
                "figure.figsize": (8, 6)},
            font_scale=1)
The Bokeh

This sets up some stuff for the javascript-based plotting.

holoviews.extension("bokeh")
SLUG = "dog-and-cat-breed-classification"
OUTPUT_FOLDER = Path("../../files/posts/fastai/")/SLUG
Embed = partial(EmbedHoloview, folder_path=OUTPUT_FOLDER)

This is where I'm going to put the settings for the javascript-based plotting.

Plot = Namespace(
    width = 1000,
    height = 800,
)

The Timer

This times how long things take so I can estimate how long it will take if I re-run cells. It also speaks a message so I can do something else and will know that the code is done running without having to watch the messages.

TIMER = Timer()

Tabulate

This is to format tables in the org-mode format (since I'm running this in emacs org-babel).

ORG_TABLE = partial(tabulate, headers="keys", 
                    showindex=False, 
                    tablefmt="orgtbl")

Initiation

Downloading the Data

As I mentioned before, the data will be the Oxford-IIIT Pet Dataset by O. M. Parkhi et al., 2012. In the dataset there are twelve breeds of cat and twenty-five breeds of dog. When the researchers performed their experiments in 2012 the best accuracy they got was 59.21 %.

The original lesson uses the untar_data function to download the data-set.

help(untar_data)
Help on function untar_data in module fastai.datasets:

untar_data(url: str, fname: Union[pathlib.Path, str] = None, dest: Union[pathlib.Path, str] = None, data=True, force_download=False) -> pathlib.Path
    Download `url` to `fname` if it doesn't exist, and un-tgz to folder `dest`.

This data set is 774 Megabytes and given my over-priced yet still incredibly slow CenturyLink speeds I found downloading it directly from the fastai datasets page a little more satisfactory, since the progress widget that runs during the download when untar_data downloads the dataset doesn't show up in emacs.

assert DATA_PATH.is_dir()
print(DATA_PATH)
/home/athena/data/datasets/images/oxford-iiit-pet

I didn't know it, but Paths have an ls method (so far as I could see this isn't in python's documentation) which I mention because I found out because it was in the original lesson. This is nice because, well, it's easy to remember, but the way I'm using it iterdir makes more sense.

for path in DATA_PATH.iterdir():
    print(f" - {path}")
  • /home/athena/data/datasets/images/oxford-iiit-pet/images_backup
  • /home/athena/data/datasets/images/oxford-iiit-pet/README.org
  • /home/athena/data/datasets/images/oxford-iiit-pet/images
  • /home/athena/data/datasets/images/oxford-iiit-pet/annotations

Here's another trick I didn't know about, but learned from the lesson - instead of using the joinpath method you can just use a forward-slash.

path_to_annotations = DATA_PATH/'annotations'
path_to_images = DATA_PATH/'images'

Looking At the Data

Getting the Labels

Here's where we peek at our data set. The dataset is set up so that the breeds are used in the names of the image files. fast.ai has a convenient classmethod named ImageDataBunch.from_name_re that will extract the labels from the filenames using a regular expression.

Before we get to that, though, we can take a look at some file names using get_image_files.

file_names = get_image_files(path_to_images)
for path in file_names[:5]:
    print(f" - {path.name}")
  • Boxer_20.jpg
  • Saint_Bernard_195.jpg
  • Saint_Bernard_133.jpg
  • English_Cocker_Spaniel_43.jpg
  • Pug_51.jpg

So it looks like the format is <breed>_<index>.jpg. Later on we're going to use the labels when we inspect the model so next I'm going to make the standardize the file-name cases to be title-cased.

UNDERSCORE, SPACE = "_", " "
for path in file_names:
    name, extension = os.path.splitext(path.name)
    name = name.replace(UNDERSCORE, SPACE).title()
    file_name = (name + extension).replace(SPACE, UNDERSCORE)
    target = path.parent.joinpath(file_name)
    path.rename(target)

file_names = get_image_files(path_to_images)
for path in file_names[:2]:
    print(f" - {path.name}")
  • Boxer_20.jpg
  • Saint_Bernard_195.jpg

Now I'll construct the pattern to match the file-name.

is_not_a = "^"
end_of_line = "$"
one_or_more = "+"
digit = r"\d"
forward_slash = "/"
character_class = "[{}]"
group = "({})"

anything_but_a_slash = character_class.format(f"{is_not_a}{forward_slash}")

index = rf"{digit}{one_or_more}"
label = group.format(f'{anything_but_a_slash}{one_or_more}')
file_extension = ".jpg"

expression = rf'{forward_slash}{label}{UNDERSCORE}{index}{file_extension}{end_of_line}'
test = "/home/athena/data/datasets/images/oxford-iiit-pet/images/Saint_Bernard_195.jpg"
assert re.search(expression, test).groups()[0] == "Saint_Bernard"

The reason for the forward slash at the beginning of the expression is that we're passing in the entire path to each image, not just the name of the image.

Now on to the ImageDataBunch. Here's the arguments we need to pass in.

print(help(ImageDataBunch.from_name_re))
Help on method from_name_re in module fastai.vision.data:

from_name_re(path: Union[pathlib.Path, str], fnames: Collection[pathlib.Path], pat: str, valid_pct: float = 0.2, **kwargs) method of builtins.type instance
    Create from list of `fnames` in `path` with re expression `pat`.

None

Okay, so let's get the labels.

data = ImageDataBunch.from_name_re(path_to_images, 
                                   file_names, 
                                   expression, 
                                   ds_tfms=get_transforms(), 
                                   size=224, 
                                   bs=Net.batch_size
                                  ).normalize(imagenet_stats)

One of the arguments we passed in (ds_tfms?) isn't particularly obviously named, unless you already know about applying transforms to images, but here's what we passed to it.

print(help(get_transforms))
Help on function get_transforms in module fastai.vision.transform:

get_transforms(do_flip:bool=True, flip_vert:bool=False, max_rotate:float=10.0, max_zoom:float=1.1, max_lighting:float=0.2, max_warp:float=0.2, p_affine:float=0.75, p_lighting:float=0.75, xtra_tfms:Union[Collection[fastai.vision.image.Transform], NoneType]=None) -> Collection[fastai.vision.image.Transform]
    Utility func to easily create a list of flip, rotate, `zoom`, warp, lighting transforms.

None

get_transforms adds random changes to the images to augment the datasets for our training.

We also added a call to normalize which sets the mean and standard deviation of the images to match those of the images used to train the model that we're going to use (ResNet).

Looking at Some of the Images

The show_batch method will plot some of the images in matplotlib. It retrieves them randomly so calling the method repeatedly will pull up different images. Unfortunately you can't pass in a figure or axes so it isn't easily configurable.

help(data.show_batch)
Help on method show_batch in module fastai.basic_data:

show_batch(rows:int=5, ds_type:fastai.basic_data.DatasetType=<DatasetType.Train: 1>, reverse:bool=False, **kwargs) -> None method of fastai.vision.data.ImageDataBunch instance
    Show a batch of data in `ds_type` on a few `rows`.

data.show_batch(rows=3, figsize=(7,6))

show_batch.png

I'm guessing that the reason why so many images look "off" is because the of the data-transforms being added, and not that the photographers were horrible (or drunk). Why don't we look at the representation of the data bunch?

print(data)
ImageDataBunch;

Train: LabelList (5912 items)
x: ImageList
Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224)
y: CategoryList
Boxer,Saint_Bernard,Saint_Bernard,Ragdoll,Birman
Path: /home/athena/data/datasets/images/oxford-iiit-pet/images;

Valid: LabelList (1478 items)
x: ImageList
Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224),Image (3, 224, 224)
y: CategoryList
Siamese,British_Shorthair,English_Cocker_Spaniel,Newfoundland,Russian_Blue
Path: /home/athena/data/datasets/images/oxford-iiit-pet/images;

Test: None

So it looks like the ImageDataBunch created a training and a validation set and each of the images has three channels and is 224 x 224 pixels.

Training: resnet34

Here's where we train the model, a convolutional neural network in the back with a fully-connected network at the end.

I'll use fast.ai's cnn_learner to load the data, pre-trained model (resnet34), and the metric to use when training (error_rate). If you look at the fast ai code they are importing the resnet34 model from pytorch's torchvision.

This next block sets up the IPyExperiments which will delete all the variables that were created after it was created when it is deleted. This is to free up memory because the resnet architecture takes up a lot of memory on the GPU.

experiment = IPyExperimentsPytorch()

Experiment started with the Pytorch backend

Device: ID 0, GeForce GTX 1060 6GB (6069 RAM)

Current state:

RAM: Used Free Total Util CPU: 2,375 58,710 64,336 MB 3.69% GPU: 916 5,153 6,069 MB 15.10%

・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.000 ・ CPU: 0 0 2,375 MB | ・ GPU: 0 0 916 MB |

learn = cnn_learner(data, resnet34, metrics=error_rate)
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:01.758
・ CPU:          0          0      2,551 MB |
・ GPU:        114          0      1,030 MB |
Downloading: "https://download.pytorch.org/models/resnet34-333f7ec4.pth" to /home/athena/.torch/models/resnet34-333f7ec4.pth
87306240it [00:26, 3321153.99it/s]

As you can see, it downloaded the stored model parameters from pytorch. This is because I've never downloaded this particular model before - if you run it again it shouldn't need to re-download it. Since this is a pytorch model we can look at it's represetantion to see the architecture of the network.

print(learn.model)
Sequential(
  (0): Sequential(
    (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (2): ReLU(inplace)
    (3): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    (4): Sequential(
      (0): BasicBlock(
        (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicBlock(
        (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (2): BasicBlock(
        (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (5): Sequential(
      (0): BasicBlock(
        (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (downsample): Sequential(
          (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)
          (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        )
      )
      (1): BasicBlock(
        (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (2): BasicBlock(
        (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (3): BasicBlock(
        (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (6): Sequential(
      (0): BasicBlock(
        (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (downsample): Sequential(
          (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)
          (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        )
      )
      (1): BasicBlock(
        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (2): BasicBlock(
        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (3): BasicBlock(
        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (4): BasicBlock(
        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (5): BasicBlock(
        (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (7): Sequential(
      (0): BasicBlock(
        (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (downsample): Sequential(
          (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
          (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        )
      )
      (1): BasicBlock(
        (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
      (2): BasicBlock(
        (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace)
        (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (1): Sequential(
    (0): AdaptiveConcatPool2d(
      (ap): AdaptiveAvgPool2d(output_size=1)
      (mp): AdaptiveMaxPool2d(output_size=1)
    )
    (1): Flatten()
    (2): BatchNorm1d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout(p=0.25)
    (4): Linear(in_features=1024, out_features=512, bias=True)
    (5): ReLU(inplace)
    (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout(p=0.5)
    (8): Linear(in_features=512, out_features=37, bias=True)
  )
)

That's a pretty big network, but the main thing to notice is the last layer, which has 37 out_features which corresponds to the number of breeds we have in our data-set. If you were working directly with pytorch you'd have to remove the last layer and add it back yourself, but fast.ai has done this for us.

Now we need to train it using the fit_one_cycle method. At first I thought 'one cycle' meant just one pass through the batches but according to the documentation, this is a reference to a training method called the 1Cycle Policy proposed by Leslie N. Smith that changes the hyperparameters to make the model train faster.

TIMER.mesasge = "Finished fitting the ResNet 34 Model."
with TIMER:
    learn.fit_one_cycle(4)
Started: 2019-04-21 18:18:45.894630
Ended: 2019-04-21 18:22:09.988508
Elapsed: 0:03:24.093878
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:03:24.095
・ CPU:          0          0      2,999 MB |
・ GPU:        151      3,322      1,182 MB |

Depending on how busy the computer is this takes two to three minutes when I run it. Next let's store the parameters for the trained model to disk.

learn.save('stage-1')
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.145
・ CPU:          0          0      3,000 MB |
・ GPU:         -1          0      1,181 MB |

Results

Let's look at how the model did. If I was running this in a jupyter notebook there would be a table output of the accuracy, but I'm not, and I can't find any documentation on how to get that myself, so, tough luck, then. We can look at some things after the fact, though - the ClassificationInterpretation class contains methods to help look at how the model did.

interpreter = ClassificationInterpretation.from_learner(learn)

The top_losses method returns a tuple of the highest losses along with the indices of the data that gave those losses. By default it actually gives all the losses sorted from largest to smallest, but you could pass in an integer to limit how much it returns.

losses, indexes = interpreter.top_losses()
print(losses)
print(indexes)
assert len(data.valid_ds)==len(losses)==len(indexes)
tensor([7.1777e+00, 6.8882e+00, 5.8577e+00,  ..., 3.8147e-06, 3.8147e-06,
        1.9073e-06])
tensor([1298, 1418,  166,  ...,  735,  404,  291])
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.002
・ CPU:          0          0      3,000 MB |
・ GPU:          0          0      1,181 MB |
plot = holoviews.Distribution(losses).opts(title="Loss Distribution", 
                                           xlabel="Loss", 
                                           width=Plot.width, 
                                           height=Plot.height)
Embed(plot=plot, file_name="loss_distribution")()

Figure Missing

Although it looks like there are negative losses, that's just the way the distribution works out, it looks like most of the losses are around zero.

print(losses.max())
print(losses.min())
tensor(7.1777)
tensor(1.9073e-06)
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.001
・ CPU:          0          0      3,000 MB |
・ GPU:          7          0      1,188 MB |

Here's a count of the losses when they are broken up into ten bins.

bins = pandas.cut(losses.tolist(), bins=10).value_counts().reset_index()
total = bins[0].sum()
percentage = 100 * bins[0]/total
bins["percent"] = percentage
print(ORG_TABLE(bins, headers="Range Count Percent(%)".split()))
Range Count Percent(%)
(-0.00718, 0.718] 1349 91.272
(0.718, 1.436] 61 4.1272
(1.436, 2.153] 31 2.09743
(2.153, 2.871] 14 0.947226
(2.871, 3.589] 15 1.01488
(3.589, 4.307] 3 0.202977
(4.307, 5.024] 2 0.135318
(5.024, 5.742] 0 0
(5.742, 6.46] 1 0.067659
(6.46, 7.178] 2 0.135318

It's not entirely clear to me how to interpret the losses - what does a loss of seven mean, exactly? -0.00744? But, anyway, it looks like the vast majority are less than one.

Another thing we can do is plot the images that had the highest losses.

interpreter.plot_top_losses(9, figsize=(15,11))

top_losses.png

It looks like the ones that had the most loss had some kind of weird flare effect applied to the image. Now that we've used it, maybe we can see how we're supposed to call plot_top_losses.

print(help(interpreter.plot_top_losses))
Help on method _cl_int_plot_top_losses in module fastai.vision.learner:

_cl_int_plot_top_losses(k, largest=True, figsize=(12, 12), heatmap:bool=True, heatmap_thresh:int=16, return_fig:bool=None) -> Union[matplotlib.figure.Figure, NoneType] method of fastai.train.ClassificationInterpretation instance
    Show images in `top_losses` along with their prediction, actual, loss, and probability of actual class.

None

Note: in the original notebook they were using a function called doc, which tries to open another window and will thus hang when run in emacs. They really want you to use jupyter.

Next let's look at the confusion matrix.

interpreter.plot_confusion_matrix(figsize=(12,12), dpi=60)

confusion_matrix.png

One way to interpret this is to look at the x-axis (the actual breed) and sweep vertically up to see the counts for the y-axis (what our model predicted it was). The diagonal cells from the top left to the bottom right is where the predicted matched the actual. In this case, the fact that almost all the counts are in the diagonal means our model did pretty well at predicting the breeds in the images.

If you compare the images with the worst losses to the confusion matrix you'll notice that they don't seem to correlate with the worst performances overall - the worst losses were one-offs, probably due to the flare effect. The most confused was the Ragdoll being confused for a Birman, but, as noted in the lecture, distinguishing them is hard for people too.

Here's the breeds that were the hardest for the model to predict.

print(ORG_TABLE(interpreter.most_confused(min_val=3), 
                headers="Actual Predicted Count".split()))
Actual Predicted Count
American_Pit_Bull_Terrier Staffordshire_Bull_Terrier 10
Staffordshire_Bull_Terrier American_Pit_Bull_Terrier 5
American_Bulldog Staffordshire_Bull_Terrier 4
Bengal Egyptian_Mau 4
American_Pit_Bull_Terrier American_Bulldog 3
Miniature_Pinscher Chihuahua 3
Ragdoll Birman 3
Samoyed Great_Pyrenees 3

It doesn't look too bad, actually, other that the first few entries, maybe.

Unfreezing, fine-tuning, and learning rates

So, this is what we get with a straight off-the-shelf setup from fast.ai, but we want more, don't we? Let's unfreeze the model (allow the entire model's weights to be trained) and train some more.

learn.unfreeze()

Since we are using a pre-trained model we normally freeze all but the last layer to do transfer learning, by unfreezing the model we'll train all the layers to our dataset.

TIMER.message = "Finished training the unfrozen model."
with TIMER:
    learn.fit_one_cycle(1)
Started: 2019-04-21 18:29:47.149628
Ended: 2019-04-21 18:30:28.689325
Elapsed: 0:00:41.539697
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:41.541
・ CPU:          0          0      3,010 MB |
・ GPU:        694      1,923      1,883 MB |

Now we save the parameters to disk again.

learn.save('stage-1');

Now we're going to use the lr_find method to find the best learning rate.

TIMER.message = "Finished finding the best learning rate."
with TIMER:
    learn.lr_find()
Started: 2019-04-21 18:31:02.961941
LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.
Ended: 2019-04-21 18:31:29.892324
Elapsed: 0:00:26.930383
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:26.931
・ CPU:          0          0      3,010 MB |
・ GPU:        339      1,646      2,218 MB |
learn.recorder.plot()

learning.png

So, it's kind of hard to see the exact number, but you can see that somewhere around a learning rate of 0.0001 we get a good loss and then after that the loss starts to go way up.

So next we're going to re-train it using an interval that hopefully gives us the best loss.

learn.unfreeze()
with TIMER:
    print(learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4)))
Started: 2019-04-21 18:34:11.748741
None
Ended: 2019-04-21 18:35:34.827655
Elapsed: 0:01:23.078914
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:01:23.083
・ CPU:          0          0      3,011 MB |
・ GPU:          9      1,634      2,231 MB |

Now the experiment is over so let's free up some memory.

del experiment

・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.000 ・ CPU: 0 0 3,011 MB | ・ GPU: -17 0 2,214 MB |

IPyExperimentsPytorch: Finishing

Experiment finished in 00:20:22 (elapsed wallclock time)

Newly defined local variables:

Deleted: bins, codecs, indexes, interpreter, learn, losses, percentage, total

Circular ref objects gc collected during the experiment:

cleared 12 objects (only temporary leakage)

Experiment memory:

RAM: Consumed Reclaimed CPU: 636 0 MB ( 0.00%) GPU: 1,297 1,308 MB (100.82%)

Current state:

RAM: Used Free Total Util CPU: 3,011 57,984 64,336 MB 4.68% GPU: 906 5,163 6,069 MB 14.93%

Training: resnet50

Okay, so we trained the resnet34 model, and although I haven't figured out how to tell exactly how well it's doing, it seems to be doing pretty well. Now it's time to try the resnet50 model, which has pretty much the same architecture but more layers. This means it should do better, but it also takes up a lot more memory.

Even after deleting the old model I still run out of memory so I'm going to have to fall back to a smaller batch-size.

experiment = IPyExperimentsPytorch()

*** Experiment started with the Pytorch backend
Device: ID 0, GeForce GTX 1060 6GB (6069 RAM)


*** Current state:
RAM:    Used    Free   Total       Util
CPU:   3,011  57,984  64,336 MB   4.68% 
GPU:     906   5,163   6,069 MB  14.93% 


・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.000
・ CPU:          0          0      3,011 MB |
・ GPU:          0          0        906 MB |
data = ImageDataBunch.from_name_re(
    path_to_images, 
    file_names, 
    expression, 
    ds_tfms=get_transforms(),
    size=299, 
    bs=Net.low_memory_batch_size).normalize(imagenet_stats)

Now I'll re-build the learner with the new pre-trained model.

learn = cnn_learner(data, resnet50, metrics=error_rate)
learn.lr_find()
learn.recorder.plot()

learning_50.png

So with this learner we can see that there's a rapid drop in loss followed by a sudden spike in loss.

TIMER.message = "Done fitting resnet 50"
with TIMER:
    learn.fit_one_cycle(8)
Started: 2019-04-21 18:42:03.987300
Ended: 2019-04-21 18:57:43.628598
Elapsed: 0:15:39.641298
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:15:39.643
・ CPU:          0          0      3,067 MB |
・ GPU:         17      4,474      1,117 MB |

Okay, so save the parameters again.

learn.save('stage-1-50')

Now we can try and unfreeze and re-train it.

TIMER.message = "Finished training resnet 50 with the optimal learning rate."
learn.unfreeze()
with TIMER:
    learn.fit_one_cycle(3, max_lr=slice(1e-6,1e-4))
Started: 2019-04-21 18:58:22.070603
Ended: 2019-04-21 19:06:24.471347
Elapsed: 0:08:02.400744
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:08:02.406
・ CPU:          0          0      3,069 MB |
・ GPU:        259      4,586      1,376 MB |
with TIMER:
    metrics = learn.validate()
Started: 2019-04-21 19:08:37.971400
Ended: 2019-04-21 19:08:49.648814
Elapsed: 0:00:11.677414
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:11.679
・ CPU:          0          0      3,069 MB |
・ GPU:         22        410      1,398 MB |
print(f"Error Rate: {metrics[0]:.2f}")
Error Rate: 0.15

Since it didn't improve let's go back to the previous model.

learn.load('stage-1-50');
with TIMER:
    metrics = learn.validate()
print(f"Error Rate: {metrics[0]:.2f}")
Started: 2019-04-21 19:09:19.655769
Ended: 2019-04-21 19:09:30.841289
Elapsed: 0:00:11.185520
Error Rate: 0.16
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:16.011
・ CPU:          1          1      3,069 MB |
・ GPU:        308        612      1,706 MB |

Interpreting the Result

interpreter = ClassificationInterpretation.from_learner(learn)
The Most Confusing Breeds
print(ORG_TABLE(interpreter.most_confused(min_val=3),
                headers="Actual Predicted Count".split()))
Actual Predicted Count
American_Pit_Bull_Terrier Staffordshire_Bull_Terrier 6
Bengal Egyptian_Mau 5
Ragdoll Birman 5
Staffordshire_Bull_Terrier American_Pit_Bull_Terrier 5
Bengal Abyssinian 3

It got fewer breeds with more than two wrong than the resnet34 model did, but both of them seem to have trouble telling an American Pit Bull Terrier from a Staffordshire Bull Terrier.

del experiment
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.000
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |

Other Data Formats

This is a look at other data sets.

MNIST

This is a set of handwritten digits. The originals are hosted on yann.lecun.com but the fast.ai datasets page has the images converted from the original IDX format to the PNG format.

experiment = IPyExperimentsPytorch()

*** Experiment started with the Pytorch backend
Device: ID 0, GeForce GTX 1060 6GB (6069 RAM)


*** Current state:
RAM:    Used    Free   Total       Util
CPU:   3,070  57,254  64,336 MB   4.77% 
GPU:   1,706   4,363   6,069 MB  28.11% 


・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.097
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.043
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |
mnist_path_original = Path(os.environ.get("MNIST")).expanduser()
assert mnist_path_original.is_dir()
print(mnist_path_original)
/home/athena/data/datasets/images/mnist_png
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.001
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.046
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |

Now that we know it's there we can create a data bunch for it… Actually I tried it and found out that this is the wrong set (it throws an error for some reason), let's try it their way.

print(URLs.MNIST_SAMPLE)
mnist_path = untar_data(URLs.MNIST_SAMPLE)
print(mnist_path)
http://files.fast.ai/data/examples/mnist_sample
/home/athena/.fastai/data/mnist_sample
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.309
・ CPU:          0          1      3,070 MB |
・ GPU:          0          0      1,706 MB |
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.379
・ CPU:          0          0      3,070 MB |
・ GPU:          0          0      1,706 MB |

Let's look at the difference. Here's what I downloaded.

for path in mnist_path_original.iterdir():
    print(f" - {path}")
  • /home/athena/data/datasets/images/mnist_png/testing
  • /home/athena/data/datasets/images/mnist_png/README.org
  • /home/athena/data/datasets/images/mnist_png/training

・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.026 ・ CPU: 0 0 3,070 MB | ・ GPU: 0 0 1,706 MB | ・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.071 ・ CPU: 0 0 3,070 MB | ・ GPU: 0 0 1,706 MB |

And here's what they downloaded.

for path in mnist_path.iterdir():
    print(f" - {path}")
  • home/athena.fastai/data/mnist_sample/labels.csv
  • home/athena.fastai/data/mnist_sample/train
  • home/athena.fastai/data/mnist_sample/valid
  • home/athena.fastai/data/mnist_sample/models

・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.043 ・ CPU: 0 0 3,070 MB | ・ GPU: 0 0 1,706 MB | ・ RAM: △Consumed △Peaked Used Total | Exec time 0:00:00.090 ・ CPU: 0 0 3,070 MB | ・ GPU: 0 0 1,706 MB |

Maybe you need a labels.csv file… I guess that's the point of this being in the "other formats" section.

transforms = get_transforms(do_flip=False)
data = ImageDataBunch.from_folder(mnist_path, ds_tfms=transforms, size=26)

I don't know why the size is 26 in this case.

data.show_batch(rows=3, figsize=(5,5))

mnist_batch.png

Now to fit the model. This uses a smaller version of the resnet (18 layers) and the accuracy metric.

with TIMER:
    learn = cnn_learner(data, resnet18, metrics=accuracy)
    learn.fit(2)
Started: 2019-04-21 19:15:13.568995
Ended: 2019-04-21 19:15:44.806330
Elapsed: 0:00:31.237335
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:31.239
・ CPU:          0          0      3,075 MB |
・ GPU:         46      1,379      1,733 MB |
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:31.297
・ CPU:          0          0      3,075 MB |
・ GPU:         46      1,379      1,733 MB |

So, since the labels are so important, maybe we should look at them.

labels = pandas.read_csv(mnist_path/'labels.csv')
print(ORG_TABLE(labels.iloc[:5]))
name label
train/3/7463.png 0
train/3/21102.png 0
train/3/31559.png 0
train/3/46882.png 0
train/3/26209.png 0

Well, that's not realy revelatory.

data = ImageDataBunch.from_csv(mnist_path, ds_tfms=transforms, size=28)
data.show_batch(rows=3, figsize=(5,5))
print(data.classes)
[0, 1]
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.001
・ CPU:          0          0      3,080 MB |
・ GPU:          0          0      1,733 MB |
・ RAM:  △Consumed    △Peaked    Used Total | Exec time 0:00:00.047
・ CPU:          0          0      3,080 MB |
・ GPU:          0          0      1,733 MB |

So there are only two classes, presumably meaning that they are 3 and 7.

There's more examples of… something in the notebook, but they don't explain it so I'm just going to skip over the rest of it.

Return

This last bit just let's me run the whole notebook and get a message when it's over.

TIMER.message = "The Dog and cat breed classification buffer is done. Come check it out."
with TIMER:
    pass
Started: 2019-04-21 10:43:46.858157
Ended: 2019-04-21 10:43:46.858197
Elapsed: 0:00:00.000040

Pytorch 60 Minute Blitz

The Departure

This is a replication of Deep Learning With Pytorch: A 60 Minute Blitz to get me back into using PyTorch.

Imports

PyPi

Although the project is called PyTorch, the package is named torch.

import torch
import torch.nn as neural_network
import torch.nn.functional as functional

And we're going to use numpy a little.

import numpy

The Initiation

What is PyTorch?

Tensors

In PyTorch, tensors are similar to numpy's ndarrays (n-dimensional arrays). You can create an unitialized one using the empty function.

  • Empty
    empty_tensor = torch.empty(5, 3)
    print(empty_tensor)
    
    tensor([[-2.3492e+02,  4.5902e-41, -2.3492e+02],
            [ 4.5902e-41,  3.1766e+30,  1.7035e+25],
            [ 4.0498e-43,  0.0000e+00, -2.3492e+02],
            [ 4.5902e-41,  2.6417e-37,  0.0000e+00],
            [ 1.4607e-19,  1.8469e+25,  1.0901e+27]])
    

    Here's the docstring for empty:

    print(torch.empty.__doc__)
    
    
    empty(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) -> Tensor
    
    Returns a tensor filled with uninitialized data. The shape of the tensor is
    defined by the variable argument :attr:`sizes`.
    
    Args:
        sizes (int...): a sequence of integers defining the shape of the output tensor.
            Can be a variable number of arguments or a collection like a list or tuple.
        out (Tensor, optional): the output tensor
        dtype (:class:`torch.dtype`, optional): the desired data type of returned tensor.
            Default: if ``None``, uses a global default (see :func:`torch.set_default_tensor_type`).
        layout (:class:`torch.layout`, optional): the desired layout of returned Tensor.
            Default: ``torch.strided``.
        device (:class:`torch.device`, optional): the desired device of returned tensor.
            Default: if ``None``, uses the current device for the default tensor type
            (see :func:`torch.set_default_tensor_type`). :attr:`device` will be the CPU
            for CPU tensor types and the current CUDA device for CUDA tensor types.
        requires_grad (bool, optional): If autograd should record operations on the
            returned tensor. Default: ``False``.
    
    Example::
    
        >>> torch.empty(2, 3)
        tensor(1.00000e-08 *
               [[ 6.3984,  0.0000,  0.0000],
                [ 0.0000,  0.0000,  0.0000]])
    
    
    
  • Random
    print(torch.rand(5, 3))
    
    tensor([[0.1767, 0.9520, 0.1488],
            [0.5592, 0.4836, 0.2645],
            [0.8066, 0.8864, 0.1083],
            [0.9206, 0.7311, 0.1278],
            [0.0140, 0.5370, 0.3123]])
    

    The arguments are the same as for empty.

  • Zeros

    Here we'll create a tensor of zeros as long integers.

    print(torch.zeros(5, 3, dtype=torch.long))
    
    tensor([[0, 0, 0],
            [0, 0, 0],
            [0, 0, 0],
            [0, 0, 0],
            [0, 0, 0]])
    

    Once again the argument for zeros is the same as those for empty.

  • From Data
    print(torch.tensor([5.5, 3]))
    
    tensor([5.5000, 3.0000])
    
  • From A Tensor

    You can create a new tensor from a previously constructed one. This preserves any parameters you passed in that you don't subsequently override.

    x = torch.tensor([5, 3], dtype=torch.int)
    print(x)
    y = x.new_ones(5, 3)
    print(y)
    
    tensor([5, 3], dtype=torch.int32)
    tensor([[1, 1, 1],
            [1, 1, 1],
            [1, 1, 1],
            [1, 1, 1],
            [1, 1, 1]], dtype=torch.int32)
    

    PyTorch also has another syntax for creating a random tensor from another tensor.

    print(torch.randn_like(x, dtype=torch.float))
    
    tensor([ 0.6447, -0.9750])
    

    So in this case it kept the shape but used our dtype. The values seemed odd at first, but that's because the randn indicates it comes from a standard-normal distribution centered at 0, not some value in the range from zero to one (non-inclusive) like a regular random function would.

  • Tensor Size

    Like pandas, the tensor has a shape, but confusingly it's called Size and can be accessed either from the size method of the shape attribute.

    print(y.size())
    
    torch.Size([5, 3])
    
    print(y.shape)
    
    torch.Size([5, 3])
    
    print(torch.Size.__base__)
    
    <class 'tuple'>
    

    The Size object inherits from tuples and supports all the tuple operations.

Operations

  • Addition

    For some operations you can use either the operators (like +) or method calls. Here's two ways to do addition.

    SIZE = (5, 3)
    x = torch.rand(*SIZE)
    y = torch.rand(*SIZE)
    output = x + y
    print(output)
    print()
    print(torch.add(x, y))
    
    tensor([[0.4370, 1.4905, 0.8806],
            [1.7555, 0.9883, 0.8121],
            [1.1988, 0.6291, 1.2755],
            [1.2424, 1.1548, 1.1025],
            [0.8627, 0.9954, 1.1028]])
    
    tensor([[0.4370, 1.4905, 0.8806],
            [1.7555, 0.9883, 0.8121],
            [1.1988, 0.6291, 1.2755],
            [1.2424, 1.1548, 1.1025],
            [0.8627, 0.9954, 1.1028]])
    
  • Pre-Made Tensors

    One advantage to using the function is that you can pass in a tensor, rather than having pytorch create the output-tensor for you.

    summation = torch.empty(SIZE)
    torch.add(x, y, out=summation)
    print(summation)
    
    tensor([[0.4370, 1.4905, 0.8806],
            [1.7555, 0.9883, 0.8121],
            [1.1988, 0.6291, 1.2755],
            [1.2424, 1.1548, 1.1025],
            [0.8627, 0.9954, 1.1028]])
    
  • In-Place Operations

    Tensors also have methods that let you update them instead of creating a new tensor.

    x.add_(y)
    print(x)
    
    tensor([[0.4370, 1.4905, 0.8806],
            [1.7555, 0.9883, 0.8121],
            [1.1988, 0.6291, 1.2755],
            [1.2424, 1.1548, 1.1025],
            [0.8627, 0.9954, 1.1028]])
    
  • Slicing

    The slicing follows what numpy's arrays do. Here's how to get all the rows of the second column.

    print(x[:, 1])
    
    tensor([1.4905, 0.9883, 0.6291, 1.1548, 0.9954])
    
  • Reshaping

    You can create a new tensor with the same data but a different shape using the view method.

    y = x.view(15)
    z = x.view(-1, 5)
    print(x.shape)
    print(y.shape)
    print(z.shape)
    
    torch.Size([5, 3])
    torch.Size([15])
    torch.Size([3, 5])
    

    Using -1 tells pytorch to infer the dimension based on the original and the dimension that you did pass in.

Torch to Numpy

While there are advantages to using torch for operations (it can use the GPU, for instance), there might be times when you want to convert the tensor to a numpy array.

x = torch.zeros(5)
print(x)
y = x.numpy()
print(y)
x.add_(1)
print(x)
print(y)
print(type(y))
tensor([0., 0., 0., 0., 0.])
[0. 0. 0. 0. 0.]
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
<class 'numpy.ndarray'>

Somehow updating the tensor in place updates the numpy array as well, even though it's an ndarray.

Numpy to Torch

You can go the other way as well.

x = numpy.zeros(5)
print(x)
y = torch.from_numpy(x)
print(y)
x += 5
print(y)
[0. 0. 0. 0. 0.]
tensor([0., 0., 0., 0., 0.], dtype=torch.float64)
tensor([5., 5., 5., 5., 5.], dtype=torch.float64)

So updating the array (in place) updates the tensor.

Cuda

As I mentioned before, an advantage of pytorch tensors is that they can be run on the GPU - unfortunately the computer I'm on is old and CUDA doesn't run on it, but we can make a check to see if it will first using =torch.cuda.is_available()

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
print(device)

x = torch.ones(5)

# pass in the device
y = torch.ones_like(x, device=device)

# or move the tensor to the device (not an inplace operation)
x = x.to(device)

z = x + y
print(z)

Autograd: Automatic Differentiation

The autograd module in pytorch performs automatic differentiation for you. It works using define-by-run, meaning that as you run you forward-pass through the network, it tracks your calls so you don't have to explicitly define anything for backpropagation to work. To enable or disable it you set the requires_grad attribute of the tensor you want to train.

tense = torch.ones(2, 2, requires_grad=True)
print(tense)
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

Now if you do a tensor operation:

tensed = tense + 1
print(tensed)
tensor([[2., 2.],
        [2., 2.]], grad_fn=<AddBackward0>)

Our new tensor has a gradient function set for it. If you do more operations on tensed:

tenser = tensed * 5
print(tenser)
tensor([[10., 10.],
        [10., 10.]], grad_fn=<MulBackward0>)
a = torch.ones(5, requires_grad=False)
b = a * 5
a.requires_grad_(True)
c = a * 6
print(b)
print(c)
tensor([5., 5., 5., 5., 5.])
tensor([6., 6., 6., 6., 6.], grad_fn=<MulBackward0>)

Two things to note, one is that the gradient function is only set while the requires_grad attribute is true, the other is that this only works on the leafs in the graph - you can set it on a and b but not c - because since I set requires_grad to True on a, when I created c by multiplying a by 6, c became part of a's graph… I think. Anyway, you can't set it on tensors that are part of the backpropagation path.

Backpropagation

You run back-propagation by calling the backward method on the last tensor in the graph. In our case the last tensor we have (tenser) doesn't output numbers so we need to create a final tensor that does for back-propagation to work.

output = tenser.mean()
output.backward()
print(tense.grad)
tensor([[1.2500, 1.2500],
        [1.2500, 1.2500]])

After one pass through the network (and back) our root-node tensor has some gradients.

Context Manager

If you need to temporarily turn the gradient tracking on or off you can use a context manager.

print((tense*2).requires_grad)
with torch.no_grad():
    print((tense* 2).requires_grad)
print((tense * 2).requires_grad)
True
False
True

Note that the root-will still have require_grad as true, it's the output of operations working with it that don't get the gradient set.

print(tense.requires_grad)
with torch.no_grad():
    print(tense.requires_grad)
print(tense.requires_grad)
True
True
True

Neural Networks

A Typical Model Training Procedure

  1. Define the neural network
  2. Iterate over a dataset of inputs
  3. Process each input through the network
  4. Compute the loss (how much error there is)
  5. Update the weights of the network

The most common way to update the weights is to use a simple formula. \[ weight = weight - textit{learning rate} \times gradient \]

Defining the Network

This will be a network with five layers - two convolutional layers followed by three fully-connected layers. For the convolutional layers we're going to use Max-Pooling and for the fully-connected layers we'll use ReLU activation.

  • The Layers

    You can just create the layers in the constructor, but since I'm trying to re-learn what's going on I'm going to peel it apart a little more.

    The first layer is the input layer, so the inputs have to match whatever data you are going to get. In our case we are going to look at a black and white image so it has one input-channel. The three required arguments to the Conv2d constructor are:

    • in_channels
    • out_channels
    • kernel_size
    class LayerOne:
        inputs = 1
        outputs = 6
        convolution_size = 5
        layer = neural_network.Conv2d(inputs, outputs, convolution_size)
    
    class LayerTwo:
        inputs = LayerOne.outputs
        outputs = 16
        convolution_size = 5
        layer = neural_network.Conv2d(inputs, outputs, convolution_size)
    

    Layer Three is the first Linear layer. Linear layers do a linear transformation on the inputs.

    \[ y = x W^T + b \]

    Where x is the input, W is the weight matrix and b is a bias constant.

    class LayerThree:
        inputs = (LayerTwo.outputs * LayerOne.convolution_size 
                  * LayerTwo.convolution_size)
        outputs = 120
        layer = neural_network.Linear(inputs, outputs)
    
    class LayerFour:
        inputs = LayerThree.outputs
        outputs = 84
        layer = neural_network.Linear(inputs, outputs)
    

    This is the last layer so the outputs are the outputs for the model as a whole.

    class LayerFive:
        inputs = LayerFour.outputs
        outputs = 10
        layer = neural_network.Linear(inputs, outputs)
    

    For the forward-pass our convolutional layers will have their output pooled using max_pool2d and all the layers (except for the output layers) will use relu as the activation function to keep the model from being linear.

    class NeuralNetwork(neural_network.Module):
        """A five-layer Convolutional Neural Network"""
        def __init__(self):
            super().__init__()
            self.layer_one = LayerOne.layer
            self.layer_two = LayerTwo.layer
            self.layer_three = LayerThree.layer
            self.layer_four = LayerFour.layer
            self.layer_five = LayerFive.layer
            return
    
        def flattened_features_counts(self, x):
            sizes = x.size()[1:]
            features = 1
            for size in sizes:
                features *= size
            return features
    
        def forward(self, x):
            """One forward pass through the network
    
            Args:
             x: a one-channel image
    
            Returns:
             a ten-output linear layer
            """
            x = functional.max_pool2d(functional.relu(self.layer_one(x)), (2, 2))
            x = functional.max_pool2d(functional.relu(self.layer_two(x)), 2)
            x = x.view(-1, self.flattened_features_counts(x))
            x = functional.relu(self.layer_three(x))
            x = functional.relu(self.layer_four(x))
            return self.layer_five(x)
    
    model = NeuralNetwork()
    print(model)
    
    NeuralNetwork(
      (layer_one): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
      (layer_two): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
      (layer_three): Linear(in_features=400, out_features=120, bias=True)
      (layer_four): Linear(in_features=120, out_features=84, bias=True)
      (layer_five): Linear(in_features=84, out_features=10, bias=True)
    )
    

    The output shows the parameters for each layer in our model.

    A sample output.

    INPUT_SIZE = 32
    mock_image = torch.randn(1, 1, INPUT_SIZE, INPUT_SIZE)
    output = model(mock_image)
    print(output)
    
    tensor([[ 0.1163,  0.0882,  0.0529,  0.0546, -0.0196, -0.1215, -0.1736,  0.0659,
              0.0762, -0.0093]], grad_fn=<AddmmBackward>)
    

    This is the output after one forward pass. Unfortunately we didn't want to train it on fake data so we should reset it.

    model.zero_grad()
    output.backward(torch.randn(1, 10))
    

The Loss Function

Backpropagation

Update the Weights

Training a Classifier

Data Parallelism

The Return

Chatbot Tutorial

Introduction

This is a walk-through the pytorch Chatbot Tutorial which builds a chatbot using a recurrent Sequence-to-Sequence model trained on the Cornell Movie-Dialogs Corpus.

Set Up

Imports

Python

from collections import defaultdict, namedtuple
import codecs
from pathlib import Path
from typing import Dict, List, Union
from zipfile import ZipFile
import csv
import os
import subprocess

PyPi

from dotenv import load_dotenv
import requests
import torch

This Project

from neurotic.tangles.timer import Timer

Setup the Timer

TIMER = Timer()

Load Dotenv

load_dotenv("../../.env")

Check CUDA

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Using {}".format(device))
Using cuda

Some Type Hints

OptionalList = Union[list, None]

Some Constants

ENCODING = "iso-8859-1"

The Data

Download

class MovieData:
    """Dowload and ready the movie data
    Args:
     download_path: Path to the folder to store the data
     url: download url for the zip file
     chunk_size: bytes to read from stream during download
     clean_up: remove the extra downloaded files
    """
    def __init__(self,
                 download_path: Path,
                 url: str=("http://www.cs.cornell.edu/~cristian/data/"
                           "cornell_movie_dialogs_corpus.zip"),
                 chunk_size=1024,
                 clean_up: bool=True) -> None:
        self.download_path = download_path
        self.url = url
        self.chunk_size = chunk_size
        self.clean_up = clean_up
        self._zip_path = None
        self._data_path = None
        self._zip_file = None
        return

    @property
    def zip_path(self) -> Path:
        """Path to the downloaded zip file"""
        if self._zip_path is None:
            self._zip_path = self.download_path.joinpath(Path(self.url).name)
        return self._zip_path

    @property
    def data_path(self) -> Path:
        """Path to the unzipped file"""
        if self._data_path is None:
            self._data_path = self.download_path.joinpath(
                Path(self.zip_path).stem)
        return self._data_path

    @property
    def zip_file(self) -> ZipFile:
        """the Zip file for the zipped data"""
        if self._zip_file is None:
            self._zip_file = ZipFile(self.zip_path)
        return self._zip_file

    def clean(self) -> None:
        """remove the extra downloaded files"""
        os.remove(self.zip_path)
        return

    def __call__(self) -> None:
        """downloads and prepares the file if needed"""
        if not self.data_path.is_dir():
            if not self.zip_path.is_file():
                response = requests.get(self.url, stream=True)
                with self.zip_path.open("wb") as writer:
                    for chunk in response.iter_content(chunk_size=self.chunk_size):
                        if chunk:
                            writer.write(chunk)
            unpacked = []
            for name in self.zip_file.namelist():
                name = Path(name)
                # there's extra folders and hidden files in there that I'll avoid
                if name.suffix in (".pdf", ".txt") and not name.name.startswith("."):
                    self.zip_file.extract(str(name), path=self.data_path)
                    unpacked.append(name)
            assert self.data_path.is_dir()
            if self.clean_up:
                # there is a sub-folder in the unzipped folder so move the
                # the files up one
                for to_move in unpacked:
                    self.data_path.joinpath(to_move).rename(
                        self.data_path.joinpath(to_move.name))

                # now delete the temporary file
                os.remove(self.zip_path)
                if unpacked:
                    # now remove the sub-folder
                    self.data_path.joinpath(unpacked[0].parent).rmdir()
        return

Now let's download and unpack the data.

datasets = Path(os.environ.get("DATASETS")).expanduser()
assert datasets.is_dir()
movie_data = MovieData(datasets, clean_up=True)
movie_data()
for name in movie_data.data_path.iterdir():
    print(" - {}".format(name.name))
  • chameleons.pdf
  • conversation_line_pairs.tsv
  • movie_conversations.txt
  • movie_characters_metadata.txt
  • movie_lines.txt
  • movie_titles_metadata.txt
  • raw_script_urls.txt
  • README.txt
class MovieFile:
    urls = "raw_script_urls.txt"
    readme = "README.txt"
    lines = "movie_lines.txt"
    characters = "movie_characters_metadata.txt"
    conversations = "movie_conversations.txt"
    titles = "movie_titles_metadata.txt"

Movie Lines

Here's an excerpt from the README.txt file:

In all files the field separator is " $ "

  • movie_lines.txt
    • contains the actual text of each utterance
    • fields:
      • lineID
      • characterID (who uttered this phrase)
      • movieID
      • character name
      • text of the utterance

Movie Line Data

To load the lines I'm going to make a namedtuple.

MovieLine = namedtuple("MovieLine", ["line_id",
                                     "character_id",
                                     "movie_id",
                                     "character_name",
                                     "text"])

LineData = Dict[str, MovieLine]
LineFields = MovieLine(**{field: index
                          for index, field in enumerate(MovieLine._fields)})

A Line Loader

class MovieLines:
    """loads the movie dialog lines

    Args:
     path: path to the source file
     separator: column-separator
     encoding: the file encoding type (e.g. UTF-8)
    """
    def __init__(self, path: Path, separator: str=" +++$+++ ",
                 encoding="UTF-8") -> None:
        self.path = path
        self.separator = separator
        self.encoding = encoding
        self._lines = None
        return

    @property
    def lines(self) -> LineData:
        """Dictionary Of Lines in the Data"""
        if self._lines is None:
            self._lines = {}
            with self.path.open(encoding=self.encoding) as reader:
                for line in reader:
                    tokens = line.strip().split(self.separator)

                    text = tokens[LineFields.text] if len(tokens) == len(LineFields) else ""
                    movie_line = MovieLine(line_id=tokens[LineFields.line_id],
                                           character_id=tokens[LineFields.character_id],
                                           movie_id=tokens[LineFields.movie_id],
                                           character_name=tokens[LineFields.character_name],
                                           text=text,
                    )
                    self._lines[movie_line.line_id] = movie_line
        return self._lines

    def head(self, lines: int=5, get: bool=False) -> OptionalList:
        """show the first lines

        Args:
         lines: number of lines to read
         get: if true, return the lines
        """
        output = [] if get else None
        with self.path.open() as reader:
            for index, line in enumerate(reader):
                line = line.rstrip()
                print(line)
                if get:
                    output.append(line)
                if index + 1 >= lines:
                    break
        return output
movie_lines = MovieLines(movie_data.data_path.joinpath(MovieFile.lines), encoding=ENCODING)
output_lines = movie_lines.head(10)
L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!
L1044 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ They do to!
L985 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ I hope so.
L984 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ She okay?
L925 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Let's go.
L924 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ Wow
L872 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Okay -- you're gonna need to learn how to lie.
L871 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ No
L870 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ I'm kidding.  You know how sometimes you just become this "persona"?  And you don't know how to quit?
L869 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Like my fear of wearing pastels?

As note in the README.txt those strange characters are how the columns are separated (I guess so that the commas could be kept in the text). The Line IDs seem to be in reverse oredr, and don't seem to have all the lines - unless they're out of order and just looking at the head is misleading. For reference the movie for the lines I showed (the dialog between Bianca and Cameron) is from 12 Things I Hate About You. For some reason they both encode the chraracters and give their names - u0 is BIANCA.

If you poke around in the file you'll find that there's something peculiar about the characters in it.

output = subprocess.run(["file", "-i", str(movie_lines.path)], stdout=subprocess.PIPE)
print(output.stdout)
b'/home/athena/data/datasets/cornell_movie_dialogs_corpus/movie_lines.txt: text/plain; charset=unknown-8bit\n'

It doesn't look like standard ASCII, but I wonder if it matters. In the pytorch tutorial they give the encoding as iso-8859-1, although I can't find any documentation for this, but since they gave it, I guess we can use it.

ENCODING = "iso-8859-1"

I'm using it in MovieLines too so I defined ENCODING at the top of the notebook, this is just to show where it came from.

Conversations

The movie-lines file has all the movie-conversations together, but we want conversations between characters. For that you need to group the lines using the movie_conversations.txt file.

  • movie_conversations.txt
    • the structure of the conversations
    • fields
      • characterID of the first character involved in the conversation
      • characterID of the second character involved in the conversation
      • movieID of the movie in which the conversation occurred
      • list of the utterances that make the conversation, in chronological order: ['lineID1','lineID2',É,'lineIDN'] has to be matched with movie_lines.txt to reconstruct the actual content

You can see that the README has some kind of funky character in it (the third item in the order list). Weird.

A Conversation Holder

A conversation is a list of lines said by characters to each other. Although the dialog file is presumably in order, we want to be able to partition lines that are part of a single conversation - a verbal interaction between two characters.

ConversationIDs = namedtuple("ConversationIDs", ["character_id_1",
                                                 "character_id_2",
                                                 "movie_id",
                                                 "lines"])
ConversationFields = ConversationIDs(
    **{field: index
       for index, field in enumerate(ConversationIDs._fields)})
ConversationData = List[ConversationIDs]

A Conversations Builder

This is code to pull the lines out and group them by conversation.

class Conversations:
    """Holds the conversations

    Args:
     path: path to the conversations file
     moviez: object with the movie lines
     encoding: the encoding for the file
     separator: the column separator
    """
    def __init__(self,
                 path: Path,
                 movies: MovieLines,
                 separator: str=" +++$+++ ",
                 encoding:str="UTF-8") -> None:
        self.path = path
        self.movies = movies
        self.separator = separator
        self.encoding = encoding
        self._conversations = None
        self._sentence_pairs = None
        return

    @property
    def conversations(self) -> ConversationData:
        """The list of conversation line data
        """
        if self._conversations is None:
            self._conversations = []
            with self.path.open(encoding=self.encoding) as reader:
                for line in reader:
                    tokens = line.strip().split(self.separator)
                    line_ids = eval(tokens[ConversationFields.lines])
                    lines = [self.movies.lines[line_id] for line_id in line_ids]
                    self._conversations.append(
                        ConversationIDs(
                            character_id_1=tokens[ConversationFields.character_id_1],
                            character_id_2=tokens[ConversationFields.character_id_2],
                            movie_id=tokens[ConversationFields.movie_id],
                            lines = lines,
                        ))
        return self._conversations

    @property
    def sentence_pairs(self) -> list:
        """paired-sentences from the conversations"""
        if self._sentence_pairs is None:
            self._sentence_pairs = []
            for conversation in self.conversations:
                for index in range(len(conversation.lines) - 1):
                    utterance = conversation.lines[index].text
                    response = conversation.lines[index + 1].text
                    # you might not always have pairs
                    if utterance and response:
                        self._sentence_pairs.append([utterance, response])
        return self._sentence_pairs

    def head(self, count: int=5) -> None:
        """Print the first lines

        Args:
         count: how many lines to print
        """
        with self.path.open(encoding=self.encoding) as reader:
            so_far = 0
            for line in reader:
                print(line.rstrip())
                so_far += 1
                if so_far >= count:
                    break
        return

Now I'll build the conversations from the file.

conversations_path = movie_data.data_path.joinpath(MovieFile.conversations)
conversations = Conversations(conversations_path, movie_lines, encoding=ENCODING)
conversations.head()
u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L194', 'L195', 'L196', 'L197']
u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L198', 'L199']
u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L200', 'L201', 'L202', 'L203']
u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L204', 'L205', 'L206']
u0 +++$+++ u2 +++$+++ m0 +++$+++ ['L207', 'L208']

Store the Processed Lines

Since we've transformed the data we should store it to avoid needing to transform it again later.

with TIMER:
    processed_path = movie_data.data_path.joinpath("conversation_line_pairs.tsv")
    delimiter = str(codecs.decode("\t", "unicode_escape"))
    NEWLINE = "\n"
    with processed_path.open("w", encoding="utf-8") as outputfile:
        writer = csv.writer(outputfile, delimiter=delimiter)
        for pair in conversations.sentence_pairs:
            writer.writerow(pair)
Started: 2019-02-18 18:44:01.624014
Ended: 2019-02-18 18:44:04.127445
Elapsed: 0:00:02.503431

Check Our Stored File

with processed_path.open() as reader:
    count = 0
    for line in reader:
        print(repr(line))
        count += 1
        if count == 5:
            break
"Can we make this quick?  Roxanne Korrine and Andrew Barrett are having an incredibly horrendous public break- up on the quad.  Again.\tWell, I thought we'd start with pronunciation, if that's okay with you.\n"
"Well, I thought we'd start with pronunciation, if that's okay with you.\tNot the hacking and gagging and spitting part.  Please.\n"
"Not the hacking and gagging and spitting part.  Please.\tOkay... then how 'bout we try out some French cuisine.  Saturday?  Night?\n"
"You're asking me out.  That's so cute. What's your name again?\tForget it.\n"
"No, no, it's my fault -- we didn't have a proper introduction ---\tCameron.\n"

A Vocabulary

PADDING, START_OF_SENTENCE, END_OF_SENTENCE = 0, 1, 2

class Vocabulary:
    """A class to hold words and sentences

    Args:
     name: name of the vocabulary
     token_delimiter: what to split sentences on
    """
    def __init__(self, name: str, token_delimiter: str=" ") -> None:
        self.name = name
        self.trimmed = False
        self.token_delimiter = token_delimiter
        self.word_to_index = {}
        self._word_to_count = None
        self._index_to_word = None
        return

    @property
    def word_to_count(self) -> defaultdict:
        """map of word to word count"""
        if self._word_to_count is None:
            self._word_to_count = defaultdict(lambda: 1)
        return self._word_to_count

    @property
    def index_to_word(self) -> dict:
        """map of word-index back to the word"""
        if self._index_to_word is None:
            self._index_to_word = dict(
                PADDING="PAD",
                START_OF_SENTENCE="SOS",
                END_OF_SENTENCE="EOS",
            )
        return self._index_to_word

    @property
    def word_count(self) -> int:
        """the number of words in our vocabulary"""
        return len(self.index_to_word)

    def add_sentence(self, sentence: str) -> None:
        """Adds the words in the sentence to our dictionary

        Args:
         sentence: string of words
        """
        for word in sentence.split(self.token_delimiter):
            self.add_word(word)
        return

    def add_word(self, word: str) -> None:
        """add the word to our vocabulary

        Args:
         word: word to add
        """
        if word not in self.word_to_index:
            self.word_to_index[word] = self.word_count
            self.index_to_word[self.word_count] = word
        else:
            self.word_to_count[word] += 1
        return

    def trim(self, minimum: int) -> None:
        """Trim words below the minimum

        .. warning:: This will only work once, even if you change the
          minimum. set self.trimmed to False if you want to do it again

        Args:
         minimum: lowest acceptible count for a word
        """
        if self.trimmed:
            return
        self.trimmed = True
        keepers = []
        for word, count in self.word_to_count.items():
            if count >= minimum:
                keepers.append(word)
        print("Keep: {}/{} = {:.2f}".format(len(keepers),
                                            len(self.word_count),
                                            len(keepers)/len(self.word_count)))
        self.reset()
        for word in keepers:
            self.add_word(word)
        return

    def reset(self) -> None:
        """Resets the dictionaries"""
        self.word_to_index = {}
        self._word_to_count = None
        self._index_to_word = None
        return

Preparing the Data For Model-Training