In [1]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

In [2]:
df = pd.read_csv('../urls/data/scraped_urls.psv.gz', sep='|')

In [5]:
df.head()


Out[5]:
fish url
0 sea lamprey https://upload.wikimedia.org/wikipedia/commons...
1 sea lamprey http://www.glfc.org/images/factsheets/sea_lamp...
2 sea lamprey https://i.ytimg.com/vi/IgrOK_831DY/hqdefault.jpg
3 sea lamprey http://www.invadingspecies.com/wp-content/gall...
4 sea lamprey http://www.protectyourwaters.net/hitchhikers/i...

In [9]:
for i in range(2,5):
    print(i)


2
3
4

In [3]:
import numpy as np

In [3]:
import subprocess

In [253]:
subprocess.call(['mkdir','-p','temp'])
for fish in list(set(df.fish)):
    subprocess.call(['mkdir','-p','temp/'+fish.replace(' ','_')])

In [ ]:
i

In [249]:
ioffset = 1998

In [4]:
prev_fish='alewife'
for i in range(1415,1420):#len(df)):
    row = df.iloc[i]
    if np.mod(i,50) == 0:
        print(i/(len(df))*100., '%')
    
    url = df.iloc[i].url
    if (url[-4:] == '.jpg') and (url.find(' ') == -1):
        try:
            urlretrieve(url,'temp/' + row.fish.replace(' ','_') + '/' + row.fish.replace(' ','_') + '-' + str(i) + '.jpg')
        except:
            print('bad url: ',url)


bad url:  http://catsandcarp.com/wp-content/uploads/2013/12/Fantailed-carp.jpg
bad url:  https://archive.usgs.gov/archive/sites/fl.biology.usgs.gov/Carp_ID/assets/images/carp_id_fig_34.jpg
bad url:  https://s-media-cache-ak0.pinimg.com/736x/cf/26/26/cf262614afe9bd9a0b917d945620d2f8.jpg

In [251]:
i


Out[251]:
1258

In [6]:
url = df.iloc[0].url

In [7]:
url


Out[7]:
'https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Sea_Lamprey_fish.jpg/1200px-Sea_Lamprey_fish.jpg'

In [15]:
from PIL import Image
import requests
from io import StringIO, BytesIO

In [11]:
response = requests.get(url)
img = Image.open(StringIO(response.content))


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-bbae48ee8b8d> in <module>()
      1 response = requests.get(url)
----> 2 img = Image.open(StringIO(response.content))

TypeError: initial_value must be str or None, not bytes

In [33]:
response = requests.get(url)
Image.open(BytesIO(response.content))


Out[33]:

In [48]:
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

model = ResNet50(weights='imagenet')

In [49]:
from urllib.request import urlretrieve
urlretrieve(url,url.split('/')[-1])


Out[49]:
('1200px-Sea_Lamprey_fish.jpg', <http.client.HTTPMessage at 0x14263dc88>)

In [50]:
from urllib.request import urlretrieve
urlretrieve(url,url.split('/')[-1])
img_path = url.split('/')[-1]
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

In [ ]:
model = applications.VGG16(include_top=False, weights='imagenet')

In [53]:
preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])


Predicted: [('n01440764', 'tench', 0.85957623), ('n04067472', 'reel', 0.062848814), ('n02514041', 'barracouta', 0.04819512)]

In [ ]:


In [54]:
from keras.applications.vgg16 import VGG16

model2 = VGG16(weights='imagenet', include_top=False)

In [56]:
preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])


Predicted: [('n01440764', 'tench', 0.85957623), ('n04067472', 'reel', 0.062848814), ('n02514041', 'barracouta', 0.04819512)]

In [58]:
response = requests.get(url)
Image.open(BytesIO(response.content))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

In [132]:
Image.open('data/test/carp/carp-527.jpg')


Out[132]:

In [ ]:
img = Image.open('data/test/carp/carp-527.jpg')

In [59]:
preds = model.predict(x)

In [61]:
from keras.applications.vgg16 import decode_predictions

In [67]:
decode_predictions(preds, top=3)[0]


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-67-c49a5883ae0f> in <module>()
----> 1 decode_predictions(preds, top=3)[0]

/Users/matthewsochor/anaconda/lib/python3.5/site-packages/keras/applications/imagenet_utils.py in decode_predictions(preds, top)
     60                          'a batch of predictions '
     61                          '(i.e. a 2D array of shape (samples, 1000)). '
---> 62                          'Found array with shape: ' + str(preds.shape))
     63     if CLASS_INDEX is None:
     64         fpath = get_file('imagenet_class_index.json',

ValueError: `decode_predictions` expects a batch of predictions (i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 7, 7, 512)

In [63]:
model3 = VGG16(weights='imagenet')


Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5

In [64]:
preds = model3.predict(x)

In [66]:
preds = model2.predict(x)

In [69]:
np.shape(preds)


Out[69]:
(1, 7, 7, 512)

In [74]:
x = np.array([1,2,3])

In [76]:
x[0]


Out[76]:
1

In [78]:
x = np.concatenate((preds,preds))

In [79]:
np.shape(x)


Out[79]:
(2, 7, 7, 512)

In [82]:
df.groupby('fish').count()


Out[82]:
url
fish
alewife 600
atlantic salmon 600
bigmouth buffalo 600
black bass 600
black crappie 600
bluegill 300
bowfin 600
bullhead 600
burbot 500
carp 600
chain pickerel 600
channel catfish 200
chinook salmon 600
coho salmon 623
european rudd 600
freshwater drum 600
golden redhorse 200
lake trout 600
lake whitefish 600
longnose gar 600
muskellunge 600
nine spine stickleback 600
northern pike 600
pumpkinseed sunfish 300
quillback 700
rainbow smelt 600
rock bass 600
round goby 600
ruffe 653
sea lamprey 477
shad 600
shorthead redhorse 600
sockeye salmon 600
steelhead trout 600
walleye 600
white bass 600
white catfish 600
white crappie 600
white perch 600
white sucker 300
yellow perch 566

In [6]:
carp = df[df.fish == 'carp']
walleye = df[df.fish == 'walleye']

In [7]:
carp.head()


Out[7]:
fish url
1077 carp https://upload.wikimedia.org/wikipedia/commons...
1078 carp http://www.iowadnr.gov/portals/idnr/uploads/fi...
1079 carp http://fishermensangle.com/wp-content/uploads/...
1080 carp http://graytaxidermy.com/images/large-fishmoun...
1081 carp https://upload.wikimedia.org/wikipedia/commons...

In [94]:
for i in range(len(carp)):
    url = carp.iloc[i].url
    try:
        if url.split('.')[-1].find('jpg') >= 0:
            urlretrieve(url,'carp/carp-' + str(i) + '.jpg')
    except:
        print('bad url: ',url)


bad url:  http://www.fishingtipsdepot.com/images/carp-fishing.jpg
bad url:  http://www.roysfarm.com/wp-content/uploads/2014/03/Common+Carp.jpg
bad url:  http://clearwatersky.com/wp-content/uploads/2015/04/CWS-Carp-2-wpcf_622x301.jpg
bad url:  http://sirhealth.com/wp-content/uploads/2016/04/all-parts-of-the-carp-can-be-used-as-drugs-in-traditional-medicine-42-2.jpg
bad url:  https://www.organicfacts.net/wp-content/uploads/carp.jpg
bad url:  http://www.minturnanglers.com/wp-content/uploads/2011/09/carp_lips.jpg
bad url:  http://www.catholicsforanend.org/wp-content/uploads/2016/10/IMG_8369-Copy.jpg
bad url:  http://www.roysfarm.com/wp-content/uploads/2014/03/Grass+Carp.jpg
bad url:  http://www.fishingtipsdepot.com/images/carp.jpg
bad url:  http://www.catfishingcaspe.com/wp-content/uploads/2015/05/carp-fishing-in-spain-37lb-common-carp-gallery.jpg
bad url:  https://images.food52.com/EMdHB7hexTGX7vseQ-krnue_fAI=/753x502/c73c962f-3182-4680-9be9-a262c5e1982a--Final1.jpg
bad url:  https://www.fishermanholidays.com/uploads/waterpics/26ad0fc1-a843-47c6-9ca9-61a36b1fe458/26ad0fc1-a843-47c6-9ca9-61a36b1fe458.jpg?width=800&height=533&crop=auto
bad url:  https://www.sportquestholidays.com/wp-content/uploads/2016/06/carp-fishing-canada-canadian-carpin-g-8.jpg
bad url:  http://www.healthbenefitstimes.com/9/uploads/2016/12/Carp-fish-benefits-and-nutrition-facts.jpg
bad url:  https://roundvalleyfishing.com/wp-content/uploads/2014/01/1011251_518483994872343_796548868_n-500x668.jpg
bad url:  http://www.roysfarm.com/wp-content/uploads/2014/03/Mrigel.jpg
bad url:  http://www.ilovefishing24.com/wp-content/uploads/2015/11/dream-life-carp-fishing.jpg
bad url:  http://www.minturnanglers.com/wp-content/uploads/2012/03/South-platte-spring-carp-fishing-denver-co1.jpg
bad url:  http://gardnertackle.co.uk/wp-content/uploads/2017/02/carp-fishing-ricky-thomas-catch-report-30-01-17-mirror.jpg
bad url:  http://gardnertackle.co.uk/wp-content/uploads/2017/02/carp-fishing-ricky-thomas-catch-report-30-01-17-mirror.jpg
bad url:  http://mynorth.com/wp-content/uploads/2010/06/Carp-fish-Int-2.jpg
bad url:  http://www.clipartkid.com/images/609/silhouette-of-crucian-carp-fish-isolate-royalty-free-stock-images-4NTV4K-clipart.jpg
bad url:  http://www.lakeside-cottages.com/images/carp/carp_fishing03.jpg
bad url:  http://www.clipartkid.com/images/609/koi-carp-fish-with-lotus-flowers-stock-image-and-royalty-free-vector-9y5WSL-clipart.jpg
bad url:  https://www.thecarpspecialist.co.uk/images/made/50f5e84b566e5536/thecarpspecialist-carp-lakes-france-jurassik-carpe_780_500_s_c1.jpg
bad url:  http://www.catfishingcaspe.com/wp-content/uploads/2015/05/carp-fishing-in-spain-gallery.jpg
bad url:  http://www.clipartkid.com/images/609/carp-fish-catching-a-hook-vector-illustration-0vFw5Y-clipart.jpg
bad url:  http://voices.nationalgeographic.com/files/2012/02/asian-carp-leaping.jpg
bad url:  http://www.publicdomainpictures.net/pictures/150000/velka/fancy-carp-fish-1454429313C0C.jpg
bad url:  http://www.ebrosportingadventures.com/Specialists%20in%20Catfishing%20&%20Carp%20Fishing%20on%20the%20Spanish%20river%20Ebro,%20stay%20in%20our%20riverside%20accommodations%20&%20fish%20our%20private%20swims-1-3.jpg
bad url:  http://www.fishing-for-carp.co.uk/images/carp_type_species.jpg
bad url:  https://www.fishermanholidays.com/uploads/newspostpics/bb963288-1d0c-4cf9-a6fc-83ca95c049f1.jpg

In [96]:
for i in range(len(walleye)):
    url = walleye.iloc[i].url
    try:
        if url.split('.')[-1].find('jpg') >= 0:
            urlretrieve(url,'walleye/waleye-' + str(i) + '.jpg')
    except:
        print('bad url: ',url)


bad url:  http://www.clipartkid.com/images/755/walleye-fish-decals-fishing-decals-for-boat-truck-car-autothe-5Nd1Q7-clipart.jpg
bad url:  http://www.clipartkid.com/images/755/fish-identification-walleye-aka-pickerel-fishing-basics-amuhKy-clipart.jpg
bad url:  http://stmedia.startribune.com/images/ows_139492577649723.jpg
bad url:  http://guide.sportsmansguide.com/wp-content/uploads/Almys-Virginias-Overlooked-Walleye-Fishing-7-15-369378-R1-04-5.jpg
bad url:  http://stmedia.startribune.com/images/ows_139957942811169.jpg
bad url:  http://cdn0.wideopenspaces.com/wp-content/uploads/2016/02/Walleye-630x339.jpg
bad url:  https://www.dgif.virginia.gov/wp-content/uploads/walleye-forecast-03.jpg
bad url:  http://www.questfishing.com/images/WalleyeFishingGuide1.jpg
bad url:  http://showpiecetaxidermy.com/wp-content/uploads/20150904-walleye-skin-mount-chasing-bait-fish-webster-sd.jpg
bad url:  https://www.fishaddictions.com/images/jordan%20walleye.jpg
bad url:  https://static.vecteezy.com/system/resources/previews/000/125/078/non_2x/walleye-fish-take-the-bait-vector.jpg
bad url:  https://www.dgif.virginia.gov/wp-content/uploads/walleye-forecast-02.jpg
bad url:  http://showpiecetaxidermy.com/wp-content/uploads/20150904-walleye-skin-mount-bristol-sd.jpg
bad url:  http://www.cedarpointlodge.com/wp-content/gallery/2012-fishing-photos/100_0057.jpg
bad url:  http://stmedia.startribune.com/images/ows_143000481044325.jpg
bad url:  https://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2015/07/10421294_817770958259225_6052518681971923660_n-425x315.jpg
bad url:  http://aclivingmagazine.com/wp-content/uploads/2014/12/outdooradventure_decjan2014_1.jpg
bad url:  http://showpiecetaxidermy.com/wp-content/uploads/2015/08/20130129-walleye-smelt-fish-mount-denver-2.jpg
bad url:  http://www.clipartkid.com/images/755/walleye-fish-drawing-walleye-by-wayne-hughes-EQSbmu-clipart.jpg
bad url:  http://www.fishingtipsdepot.com/images/walleye-catch-and-release.jpg
bad url:  http://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2014/09/CAM01325.jpg
bad url:  https://visitsunsetcountry.com/sites/default/files/styles/hero/public/Walleye-Fishing-Ontario-Canada.jpg?itok=lqlRt28V
bad url:  http://explorealex.com/wp-content/uploads/2012/11/Monster-30-fall-walleye.jpg
bad url:  http://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2015/04/004.jpg
bad url:  http://stmedia.startribune.com/images/ows_136564923370346.jpg
bad url:  http://northwestwalleyefishing.com/wp-content/uploads/2015/08/Portland-Walleye-fishing2.jpg
bad url:  http://www.bestglasspatterns.com/wp-content/uploads/2013/05/walleye-thumb.jpg
bad url:  http://www.scheelscommunity.com/wp-content/uploads/2015/07/IMG_1366.jpg
bad url:  http://showpiecetaxidermy.com/wp-content/uploads/2015/08/20130129-walleye-smelt-fish-mount-denver-3.jpg
bad url:  http://www.williamslakelodge.net/picture_library/Zivkovich_32_walleye.jpg
bad url:  http://www.howtocatchfishnetwork.com/wp-content/uploads/walleye2.jpg
bad url:  https://cedarpointlodge.com/wp-content/gallery/fishing-walleye/walleye_01.jpg
bad url:  http://ultimatefishingsite.net/wp-content/uploads/featured-walleye-destinations.jpg
bad url:  http://explorealex.com/wp-content/uploads/2012/11/Fall-walleye.jpg
bad url:  https://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2016/04/060-725x540.jpg
bad url:  http://cdn0.wideopenspaces.com/wp-content/uploads/2013/10/7-fish-ohio-walleye.jpg
bad url:  http://cdn0.wideopenspaces.com/wp-content/uploads/2016/03/WalleyeFI-630x339.jpg
bad url:  https://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2014/09/CAM01318-725x540.jpg
bad url:  http://twodogsfishing.com/wp-content/uploads/2014/02/IMG_0752.jpg
bad url:  https://static.artfire.com/uploads/products/2015/04/06/ec/11648486/large/trout_fish_drawing_9_x_16_matted_print_1f959c7c_249386.jpg
bad url:  http://www.in-depthoutdoors.com/wp-content/uploads/sites/2/2014/07/CAM00721.jpg
bad url:  https://www.drab6fishing.com/wp-content/gallery/walleye-charter-gallery/image84.jpg

In [3]:
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
import os

# dimensions of our images.
img_width, img_height = 150, 150

top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'data/train'
test_data_dir = 'data/test'
epochs = 50
batch_size = 5


def save_bottlebeck_features(data_dir):
    datagen = ImageDataGenerator(rescale=1. / 255)
    fish = os.listdir(data_dir)
    fish_count = 0
    for f in fish:
        fish_count += len(os.listdir(data_dir + '/' + f))
        
    # build the VGG16 network
    model = applications.VGG16(include_top=False, weights='imagenet')

    datagen = ImageDataGenerator(rescale=1. / 255)
    generator = datagen.flow_from_directory(
        data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    return model.predict_generator(generator, fish_count // batch_size)


def train_top_model(train_data, validation_data):
    
    model = Sequential()
    model.add(Flatten(input_shape=train_data.shape[1:]))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation='sigmoid'))

    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy', metrics=['accuracy'])

    model.fit(train_data, train_labels,
              epochs=epochs,
              batch_size=batch_size,
              validation_data=(validation_data, validation_labels))
    model.save_weights(top_model_weights_path)
    return model

In [31]:
from keras.applications.inception_v3 import InceptionV3
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K

img_width, img_height = 150, 150

train_data_dir = 'data/train'
test_data_dir = 'data/test'
epochs = 50
batch_size = 32

def get_generator(data_dir):
    datagen = ImageDataGenerator(
        rotation_range=20,
        width_shift_range=0.2,
        height_shift_range=0.2,
        horizontal_flip=True)
    
    return datagen.flow_from_directory(
        data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')

def train_inception(train_data, validation_data):
    # create the base pre-trained model
    base_model = InceptionV3(weights='imagenet', include_top=False)

    # add a global spatial average pooling layer
    x = base_model.output
    x = GlobalAveragePooling2D()(x)
    # let's add a fully-connected layer
    x = Dense(1024, activation='relu')(x)
    # and a logistic layer -- let's say we have 200 classes
    predictions = Dense(1, activation='sigmoid')(x)

    # this is the model we will train
    model = Model(input=base_model.input, output=predictions)

    # first: train only the top layers (which were randomly initialized)
    # i.e. freeze all convolutional InceptionV3 layers
    for layer in base_model.layers:
        layer.trainable = False

    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy', metrics=['accuracy'])

    model.fit_generator(train_data, 
              50,
              epochs=epochs,
              validation_data=validation_data,
              validation_steps=25)
    return model

In [32]:
test_data = get_generator(test_data_dir)
train_data = get_generator(train_data_dir)\


Found 270 images belonging to 2 classes.
Found 627 images belonging to 2 classes.

In [33]:
inception_model = train_inception(train_data, test_data)


/Users/matthewsochor/anaconda/lib/python3.5/site-packages/keras/legacy/interfaces.py:86: UserWarning: Update your `Model` call to the Keras 2 API: `Model(outputs=Tensor("de..., inputs=Tensor("in...)`
  '` call to the Keras 2 API: ' + signature)
Epoch 1/50
50/50 [==============================] - 276s - loss: 0.9780 - acc: 0.6961 - val_loss: 1.5907 - val_acc: 0.3848
Epoch 2/50
50/50 [==============================] - 249s - loss: 0.4938 - acc: 0.7755 - val_loss: 1.2813 - val_acc: 0.5684
Epoch 3/50
50/50 [==============================] - 264s - loss: 0.4951 - acc: 0.7772 - val_loss: 0.4953 - val_acc: 0.7627
Epoch 4/50
50/50 [==============================] - 235s - loss: 0.4609 - acc: 0.8030 - val_loss: 0.5781 - val_acc: 0.7748
Epoch 5/50
50/50 [==============================] - 240s - loss: 0.3972 - acc: 0.8312 - val_loss: 0.3855 - val_acc: 0.8204
Epoch 6/50
50/50 [==============================] - 242s - loss: 0.4193 - acc: 0.8249 - val_loss: 0.6877 - val_acc: 0.6702
Epoch 7/50
50/50 [==============================] - 243s - loss: 0.3593 - acc: 0.8497 - val_loss: 0.4692 - val_acc: 0.7936
Epoch 8/50
50/50 [==============================] - 775s - loss: 0.4023 - acc: 0.8316 - val_loss: 0.5383 - val_acc: 0.7936
Epoch 9/50
50/50 [==============================] - 242s - loss: 0.3771 - acc: 0.8435 - val_loss: 0.4120 - val_acc: 0.8298
Epoch 10/50
50/50 [==============================] - 239s - loss: 0.3696 - acc: 0.8416 - val_loss: 0.4699 - val_acc: 0.7827
Epoch 11/50
50/50 [==============================] - 11058s - loss: 0.3279 - acc: 0.8612 - val_loss: 0.4599 - val_acc: 0.8137
Epoch 12/50
50/50 [==============================] - 19811s - loss: 0.3412 - acc: 0.8597 - val_loss: 0.3823 - val_acc: 0.8244
Epoch 13/50
50/50 [==============================] - 360s - loss: 0.3492 - acc: 0.8539 - val_loss: 0.4174 - val_acc: 0.8311
Epoch 14/50
50/50 [==============================] - 235s - loss: 0.3354 - acc: 0.8580 - val_loss: 0.4127 - val_acc: 0.8338
Epoch 15/50
50/50 [==============================] - 236s - loss: 0.3234 - acc: 0.8583 - val_loss: 1.3989 - val_acc: 0.5724
Epoch 16/50
50/50 [==============================] - 234s - loss: 0.3232 - acc: 0.8680 - val_loss: 0.4453 - val_acc: 0.8351
Epoch 17/50
50/50 [==============================] - 236s - loss: 0.2961 - acc: 0.8779 - val_loss: 0.6288 - val_acc: 0.7708
Epoch 18/50
50/50 [==============================] - 236s - loss: 0.2710 - acc: 0.8949 - val_loss: 0.4384 - val_acc: 0.8181
Epoch 19/50
50/50 [==============================] - 237s - loss: 0.2723 - acc: 0.8895 - val_loss: 0.3779 - val_acc: 0.8272
Epoch 20/50
50/50 [==============================] - 234s - loss: 0.2931 - acc: 0.8868 - val_loss: 0.4973 - val_acc: 0.8271
Epoch 21/50
50/50 [==============================] - 236s - loss: 0.2768 - acc: 0.8916 - val_loss: 0.4574 - val_acc: 0.8204
Epoch 22/50
50/50 [==============================] - 234s - loss: 0.2760 - acc: 0.8868 - val_loss: 0.4904 - val_acc: 0.8298
Epoch 23/50
50/50 [==============================] - 235s - loss: 0.2624 - acc: 0.8985 - val_loss: 0.5381 - val_acc: 0.8029
Epoch 24/50
50/50 [==============================] - 234s - loss: 0.2701 - acc: 0.8874 - val_loss: 0.4230 - val_acc: 0.8485
Epoch 25/50
50/50 [==============================] - 236s - loss: 0.2879 - acc: 0.8806 - val_loss: 0.4657 - val_acc: 0.8083
Epoch 26/50
50/50 [==============================] - 234s - loss: 0.2524 - acc: 0.9006 - val_loss: 0.4708 - val_acc: 0.8150
Epoch 27/50
50/50 [==============================] - 237s - loss: 0.2442 - acc: 0.9025 - val_loss: 0.4305 - val_acc: 0.8194
Epoch 28/50
50/50 [==============================] - 236s - loss: 0.2420 - acc: 0.9091 - val_loss: 1.5564 - val_acc: 0.7304
Epoch 29/50
50/50 [==============================] - 236s - loss: 0.2479 - acc: 0.9058 - val_loss: 0.4095 - val_acc: 0.8244
Epoch 30/50
50/50 [==============================] - 234s - loss: 0.2512 - acc: 0.8920 - val_loss: 0.4650 - val_acc: 0.8110
Epoch 31/50
50/50 [==============================] - 235s - loss: 0.2169 - acc: 0.9122 - val_loss: 0.4630 - val_acc: 0.8190
Epoch 32/50
50/50 [==============================] - 234s - loss: 0.2577 - acc: 0.8991 - val_loss: 0.5155 - val_acc: 0.8070
Epoch 33/50
50/50 [==============================] - 236s - loss: 0.1942 - acc: 0.9277 - val_loss: 0.8367 - val_acc: 0.7936
Epoch 34/50
50/50 [==============================] - 234s - loss: 0.2226 - acc: 0.9076 - val_loss: 0.4486 - val_acc: 0.8338
Epoch 35/50
50/50 [==============================] - 235s - loss: 0.2038 - acc: 0.9252 - val_loss: 0.6731 - val_acc: 0.8029
Epoch 36/50
50/50 [==============================] - 237s - loss: 0.2155 - acc: 0.9214 - val_loss: 0.7577 - val_acc: 0.8154
Epoch 37/50
50/50 [==============================] - 237s - loss: 0.2342 - acc: 0.9077 - val_loss: 0.4979 - val_acc: 0.8403
Epoch 38/50
50/50 [==============================] - 234s - loss: 0.2043 - acc: 0.9231 - val_loss: 0.4259 - val_acc: 0.8217
Epoch 39/50
50/50 [==============================] - 235s - loss: 0.2317 - acc: 0.9087 - val_loss: 0.4180 - val_acc: 0.8244
Epoch 40/50
50/50 [==============================] - 246s - loss: 0.1797 - acc: 0.9258 - val_loss: 0.4656 - val_acc: 0.8137
Epoch 41/50
50/50 [==============================] - 703s - loss: 0.1974 - acc: 0.9296 - val_loss: 1.1574 - val_acc: 0.7601
Epoch 42/50
50/50 [==============================] - 30432s - loss: 0.1955 - acc: 0.9208 - val_loss: 0.4636 - val_acc: 0.8271
Epoch 43/50
50/50 [==============================] - 36371s - loss: 0.2034 - acc: 0.9262 - val_loss: 0.8660 - val_acc: 0.7882
Epoch 44/50
50/50 [==============================] - 16633s - loss: 0.2030 - acc: 0.9235 - val_loss: 0.6013 - val_acc: 0.7560
Epoch 45/50
50/50 [==============================] - 961s - loss: 0.1831 - acc: 0.9319 - val_loss: 0.5676 - val_acc: 0.8338
Epoch 46/50
50/50 [==============================] - 278s - loss: 0.2045 - acc: 0.9229 - val_loss: 0.7725 - val_acc: 0.7866
Epoch 47/50
50/50 [==============================] - 312s - loss: 0.1861 - acc: 0.9300 - val_loss: 0.8016 - val_acc: 0.7212
Epoch 48/50
50/50 [==============================] - 299s - loss: 0.1729 - acc: 0.9408 - val_loss: 0.6718 - val_acc: 0.8204
Epoch 49/50
50/50 [==============================] - 269s - loss: 0.1756 - acc: 0.9381 - val_loss: 0.7210 - val_acc: 0.8217
Epoch 50/50
50/50 [==============================] - 233s - loss: 0.2200 - acc: 0.9210 - val_loss: 0.4990 - val_acc: 0.8016

In [34]:
model.save_weights('inception_v1_model.h5')

In [5]:
from keras.applications.resnet50 import ResNet50

In [6]:
model = ResNet50(weights='imagenet')

In [13]:
model.layers.pop()


Out[13]:
<keras.layers.core.Dense at 0x11db9b4a8>

In [14]:
for layer in model.layers:
    layer.trainable = False

In [15]:
model.add(Dense(1, activation='sigmoid'))


--------------------------------------------------------
AttributeError         Traceback (most recent call last)
<ipython-input-15-fe2198fe9e73> in <module>()
----> 1 model.add(Dense(1, activation='sigmoid'))

AttributeError: 'Model' object has no attribute 'add'

In [8]:
len(model.layers)


Out[8]:
177

In [ ]:
model.layer

In [11]:
model.layers_by_depth?

In [10]:
model2 = Sequential()
for layer in model.layers_by_depth:
    model2.add(layer)


--------------------------------------------------------
TypeError              Traceback (most recent call last)
<ipython-input-10-02d63cf3af5a> in <module>()
      1 model2 = Sequential()
      2 for layer in model.layers_by_depth:
----> 3     model2.add(layer)

/Users/matthewsochor/anaconda/lib/python3.5/site-packages/keras/models.py in add(self, layer)
    404             raise TypeError('The added layer must be '
    405                             'an instance of class Layer. '
--> 406                             'Found: ' + str(layer))
    407         if not self.outputs:
    408             # first layer in model: check that it is an input layer

TypeError: The added layer must be an instance of class Layer. Found: 0

In [7]:
ResNet50?

In [4]:
test_data = save_bottlebeck_features(test_data_dir)


Found 270 images belonging to 2 classes.

In [ ]:
train_data = save_bottlebeck_features(train_data_dir)

In [194]:
model = train_top_model(train_data, validation_data)


Train on 800 samples, validate on 200 samples
Epoch 1/50
800/800 [==============================] - 5s - loss: 1.0537 - acc: 0.5763 - val_loss: 0.5085 - val_acc: 0.7900
Epoch 2/50
800/800 [==============================] - 4s - loss: 0.6189 - acc: 0.6925 - val_loss: 0.4145 - val_acc: 0.8200
Epoch 3/50
800/800 [==============================] - 4s - loss: 0.4942 - acc: 0.7725 - val_loss: 0.4148 - val_acc: 0.8400
Epoch 4/50
800/800 [==============================] - 4s - loss: 0.4308 - acc: 0.7975 - val_loss: 0.5494 - val_acc: 0.7750
Epoch 5/50
800/800 [==============================] - 4s - loss: 0.3608 - acc: 0.8375 - val_loss: 0.6937 - val_acc: 0.7550
Epoch 6/50
800/800 [==============================] - 4s - loss: 0.3368 - acc: 0.8575 - val_loss: 0.6800 - val_acc: 0.7850
Epoch 7/50
800/800 [==============================] - 4s - loss: 0.3150 - acc: 0.8925 - val_loss: 0.5604 - val_acc: 0.8350
Epoch 8/50
800/800 [==============================] - 4s - loss: 0.2572 - acc: 0.8987 - val_loss: 0.5322 - val_acc: 0.8350
Epoch 9/50
800/800 [==============================] - 4s - loss: 0.2596 - acc: 0.9025 - val_loss: 0.6072 - val_acc: 0.8100
Epoch 10/50
800/800 [==============================] - 4s - loss: 0.1948 - acc: 0.9137 - val_loss: 0.5509 - val_acc: 0.8650
Epoch 11/50
800/800 [==============================] - 4s - loss: 0.1963 - acc: 0.9200 - val_loss: 0.7593 - val_acc: 0.8450
Epoch 12/50
800/800 [==============================] - 4s - loss: 0.1881 - acc: 0.9300 - val_loss: 0.6787 - val_acc: 0.8500
Epoch 13/50
800/800 [==============================] - 4s - loss: 0.1662 - acc: 0.9275 - val_loss: 0.7263 - val_acc: 0.8550
Epoch 14/50
800/800 [==============================] - 4s - loss: 0.1760 - acc: 0.9412 - val_loss: 0.8337 - val_acc: 0.8350
Epoch 15/50
800/800 [==============================] - 4s - loss: 0.1179 - acc: 0.9650 - val_loss: 1.4397 - val_acc: 0.7850
Epoch 16/50
800/800 [==============================] - 4s - loss: 0.1351 - acc: 0.9412 - val_loss: 0.8785 - val_acc: 0.8150
Epoch 17/50
800/800 [==============================] - 4s - loss: 0.1326 - acc: 0.9500 - val_loss: 0.8804 - val_acc: 0.8600
Epoch 18/50
800/800 [==============================] - 4s - loss: 0.0984 - acc: 0.9612 - val_loss: 0.9033 - val_acc: 0.8700
Epoch 19/50
800/800 [==============================] - 4s - loss: 0.1406 - acc: 0.9612 - val_loss: 1.0424 - val_acc: 0.8400
Epoch 20/50
800/800 [==============================] - 4s - loss: 0.1484 - acc: 0.9625 - val_loss: 1.0088 - val_acc: 0.8550
Epoch 21/50
800/800 [==============================] - 4s - loss: 0.1070 - acc: 0.9637 - val_loss: 0.9415 - val_acc: 0.8400
Epoch 22/50
800/800 [==============================] - 4s - loss: 0.1046 - acc: 0.9650 - val_loss: 0.8691 - val_acc: 0.8500
Epoch 23/50
800/800 [==============================] - 4s - loss: 0.1183 - acc: 0.9637 - val_loss: 1.4444 - val_acc: 0.8000
Epoch 24/50
800/800 [==============================] - 4s - loss: 0.0833 - acc: 0.9737 - val_loss: 1.1852 - val_acc: 0.8100
Epoch 25/50
800/800 [==============================] - 4s - loss: 0.1056 - acc: 0.9737 - val_loss: 1.0746 - val_acc: 0.8450
Epoch 26/50
800/800 [==============================] - 4s - loss: 0.0812 - acc: 0.9725 - val_loss: 1.0952 - val_acc: 0.8500
Epoch 27/50
800/800 [==============================] - 4s - loss: 0.0776 - acc: 0.9775 - val_loss: 1.2305 - val_acc: 0.8550
Epoch 28/50
800/800 [==============================] - 4s - loss: 0.0983 - acc: 0.9700 - val_loss: 1.2552 - val_acc: 0.8400
Epoch 29/50
800/800 [==============================] - 4s - loss: 0.0741 - acc: 0.9700 - val_loss: 1.2413 - val_acc: 0.8500
Epoch 30/50
800/800 [==============================] - 4s - loss: 0.0792 - acc: 0.9762 - val_loss: 1.3512 - val_acc: 0.8700
Epoch 31/50
800/800 [==============================] - 4s - loss: 0.0820 - acc: 0.9712 - val_loss: 1.1248 - val_acc: 0.8650
Epoch 32/50
800/800 [==============================] - 4s - loss: 0.0728 - acc: 0.9787 - val_loss: 1.4507 - val_acc: 0.8400
Epoch 33/50
800/800 [==============================] - 4s - loss: 0.0451 - acc: 0.9825 - val_loss: 1.2782 - val_acc: 0.8650
Epoch 34/50
800/800 [==============================] - 4s - loss: 0.0888 - acc: 0.9725 - val_loss: 1.2959 - val_acc: 0.8650
Epoch 35/50
800/800 [==============================] - 4s - loss: 0.0581 - acc: 0.9825 - val_loss: 1.5697 - val_acc: 0.8250
Epoch 36/50
800/800 [==============================] - 4s - loss: 0.0642 - acc: 0.9875 - val_loss: 1.3236 - val_acc: 0.8700
Epoch 37/50
800/800 [==============================] - 3s - loss: 0.0628 - acc: 0.9875 - val_loss: 1.4142 - val_acc: 0.8500
Epoch 38/50
800/800 [==============================] - 4s - loss: 0.0617 - acc: 0.9787 - val_loss: 1.5263 - val_acc: 0.8400
Epoch 39/50
800/800 [==============================] - 4s - loss: 0.0404 - acc: 0.9875 - val_loss: 1.4903 - val_acc: 0.8650
Epoch 40/50
800/800 [==============================] - 3s - loss: 0.0696 - acc: 0.9800 - val_loss: 1.7171 - val_acc: 0.8200
Epoch 41/50
800/800 [==============================] - 3s - loss: 0.0561 - acc: 0.9887 - val_loss: 1.4573 - val_acc: 0.8650
Epoch 42/50
800/800 [==============================] - 4s - loss: 0.0830 - acc: 0.9800 - val_loss: 1.4866 - val_acc: 0.8350
Epoch 43/50
800/800 [==============================] - 3s - loss: 0.0722 - acc: 0.9862 - val_loss: 1.6345 - val_acc: 0.8150
Epoch 44/50
800/800 [==============================] - 3s - loss: 0.0471 - acc: 0.9875 - val_loss: 1.5284 - val_acc: 0.8250
Epoch 45/50
800/800 [==============================] - 3s - loss: 0.0396 - acc: 0.9912 - val_loss: 1.6315 - val_acc: 0.8500
Epoch 46/50
800/800 [==============================] - 3s - loss: 0.0583 - acc: 0.9862 - val_loss: 1.5787 - val_acc: 0.8200
Epoch 47/50
800/800 [==============================] - 4s - loss: 0.0606 - acc: 0.9900 - val_loss: 1.8788 - val_acc: 0.8200
Epoch 48/50
800/800 [==============================] - 3s - loss: 0.0784 - acc: 0.9862 - val_loss: 1.6308 - val_acc: 0.8350
Epoch 49/50
800/800 [==============================] - 3s - loss: 0.0529 - acc: 0.9875 - val_loss: 1.5219 - val_acc: 0.8300
Epoch 50/50
800/800 [==============================] - 4s - loss: 0.0844 - acc: 0.9875 - val_loss: 1.7120 - val_acc: 0.8250

In [195]:
premodel = applications.VGG16(include_top=False, weights='imagenet')

In [196]:
Image.open('data/train/carp/carp-107.jpg')


Out[196]:

In [217]:
Image.open('data/train/walleye/waleye-119.jpg')


Out[217]:

In [216]:
img = image.load_img('data/train/walleye/waleye-119.jpg', target_size=(img_width, img_height))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(premodel.predict(x))
print(preds)


[[ 1.]]

In [126]:
np.shape(train_data)


Out[126]:
(800, 4, 4, 512)

In [187]:
np.shape(validation_data)


Out[187]:
(200, 4, 4, 512)

In [112]:
np.array([0]*5 + [1]*4)


Out[112]:
array([0, 0, 0, 0, 0, 1, 1, 1, 1])

In [91]:
url


Out[91]:
'http://img.21food.com/20110609/product/1305114960265.jpg'

In [85]:
i=1
urlretrieve(url,'carp/carp-' + str(i) + '.' + url.split('.')[-1])


Out[85]:
('carp/carp-1.jpg', <http.client.HTTPMessage at 0x13b5a3978>)

In [ ]:
from urllib.request import urlretrieve
urlretrieve(url,url.split('/')[-1])