0922更新
众所周知 同人女学猫狗识别的第一件事情就是拿来看看自己cp到底是猫猫还是狗狗。
以下是代码,准确率只有百分之七十,赛博算着玩。
建模(抄的吴恩达的。一开始我自己的电脑根本跑不了epoch=100,都是改小了还跑着跑着就报错了。后面用了google colab终于能运行了,结果就在这个时候我发现验证集的准确率在28左右就不再上升,所以直接把epoch改小了。
colab比较不好的一点是模型跑完隔几分钟不看又废了,帮朋友算cp的时候多聊一会下又要重新跑)
!wget --no-check-certificate \
https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
-O /tmp/cats_and_dogs_filtered.zip
import os
import zipfile
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
local_zip = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()
base_dir = '/tmp/cats_and_dogs_filtered'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
# Directory with our training cat pictures
train_cats_dir = os.path.join(train_dir, 'cats')
# Directory with our training dog pictures
train_dogs_dir = os.path.join(train_dir, 'dogs')
# Directory with our validation cat pictures
validation_cats_dir = os.path.join(validation_dir, 'cats')
# Directory with our validation dog pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=1e-4),
metrics=['acc'])
# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
# Flow training images in batches of 20 using train_datagen generator
train_generator = train_datagen.flow_from_directory(
train_dir, # This is the source directory for training images
target_size=(150, 150), # All images will be resized to 150x150
batch_size=20,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')
# Flow validation images in batches of 20 using test_datagen generator
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
history = model.fit(
train_generator,
steps_per_epoch=100, # 2000 images = batch_size * steps
epochs=28,
validation_data=validation_generator,
validation_steps=5, # 1000 images = batch_size * steps
verbose=1)
查看准确率(百分之七十)
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
预测
import numpy as np
from google.colab import files
from tensorflow.keras.preprocessing import image
img_path='/content/5.jpg'
img=image.load_img(img_path,target_size=(150,150))
plt.imshow(img)
x=image.img_to_array(img)
x=np.expand_dims(x,axis=0)
classes=model.predict(x)
if classes[0]>0.5:
print ("is a dog")
else:
print("猫猫")
我有两个朋友的照片测出来是猫,朋友家的狗测出来是狗,朋友磕的cp两个人测出来都是狗。
朋友说能不能预测以下别的动物,所以我随便搜了搜,找到了mobilenet_v2_animals这是一个轻量化的卷积神经网络,它在 MobileNet 的基础上,做了 Inverted Residuals 和 Linear bottlenecks 这两大改进。该 PaddleHub Module 是在百度自建动物数据集上训练得到的,可用于图像分类和特征提取,当前已支持7978种动物的分类识别。
首先报错,说没有paddle。试了试!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
,继续报错。又试了试!pip3 install paddlepaddle==2.1.1
,这次可以了。但是图像继续报错,提示说too many indices for array: array is 2-dimensional, but 3 were indexed
搜了半天感觉都不是,大家都在说彩色灰色图片什么的,最后我发现我把别人代码改了,本来图像有[]但我删了,属于是格式问题,加回去就可以了。
因为是已经做好了的模型,实际上在预测的只有区区一句module.classification
主要花时间的是下载paddle和这个模型。但是这个模型很不解风情,不像猫狗测试,结果你要么是猫,要么是狗。它有个专门的分类叫“非动物”,所以如果给人的照片,出来的一定是非动物。我和朋友都很失望。
明明人类也是一种动物呀!人类!你在高贵什么!
import paddlehub as hub
module = hub.Module(name="mobilenet_v2_animals")
from tensorflow.keras.preprocessing import image
image_path='/content/5.jpg'
import cv2
np_images =[cv2.imread(image_path)]
result = module.classification(images=np_images)
print(result)
以下是八月份的分割线========================
import zipfile
local_zip='C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340.zip'
zip_ref=zipfile.ZipFile(local_zip)
zip_ref.extractall('C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340')
zip_ref.close
我的数据集没有区分训练-验证,这该怎么办呢……我灵机一动用cmd来划分了(move c:*.* d:\)虽然不是很规范 但我毕竟不会用python写拆分文件夹的代码(如果只是csv我都努力一下了 图片太麻烦了
import os
base_dir='C:/Users/LENOVO/all/Downloads/kagglecatsanddogs_5340/PetImages'
train_dir = os.path.join(base_dir,'train')
validation_dir = os.path.join(base_dir,'validation')
train_cat_dir =os.path.join(train_dir,'cat')
train_dog_dir =os.path.join(train_dir,'dog')
validation_cat_dir =os.path.join(validation_dir,'cat')
validation_dog_dir =os.path.join(validation_dir,'dog')
train_cat_fnames=os.listdir(train_cat_dir)
print(train_cat_fnames[:10])
train_dog_fnames=os.listdir(train_dog_dir)
print(train_dog_fnames[:10])
print('total training cat images:',len(os.listdir(train_cat_dir)))
print('total training dog images:',len(os.listdir(train_dog_dir)))
print('total validation cat images:',len(os.listdir(validation_cat_dir)))
print('total validation dog images:',len(os.listdir(validation_dog_dir)))
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
nrows=4
ncols=4
pic_index=0
fig=plt.gcf()
fig.set_size_inches(nrows*4,ncols*4)
pic_index+=8
next_cat_pix=[os.path.join(train_cat_dir,fname)
for fname in train_cat_fnames[pic_index-8:pic_index]]
next_dog_pix=[os.path.join(train_dog_dir,fname)
for fname in train_dog_fnames[pic_index-8:pic_index]]
for i,img_path in enumerate(next_cat_pix+next_dog_pix) :
sp=plt.subplot(nrows,ncols,i+1)
sp.axis('Off')
img=mpimg.imread(img_path)
plt.imshow(img)
plt.show()
好啦!展示了十六张猫猫狗狗的图片!