训练程序
import tensorflow as tf
import os
import traceback
def read_image_filenames(data_dir):
cat_dir=data_dir+'cat/'
dog_dir=data_dir+'dog/'
cat_filenames=tf.constant([cat_dir + fn for fn in os.listdir(cat_dir)])
dog_filenames=tf.constant([dog_dir + fn for fn in os.listdir(dog_dir)])
filenames=tf.concat([cat_filenames,dog_filenames],axis=-1)
labels=tf.concat([
tf.zeros(cat_filenames.shape,dtype=tf.int32),
tf.ones(dog_filenames.shape,dtype=tf.int32)],axis=-1)
return filenames,labels
def decode_image_and_resize(filename,label):
image_string=tf.io.read_file(filename)
image_decoded=tf.image.decode_jpeg(image_string)
image_resized=tf.image.resize(image_decoded,[224,224])/255.0
return image_resized,label
def prepare_dataset(data_dir):
filenames,labels=read_image_filenames(data_dir)
dataset=tf.data.Dataset.from_tensor_slices((filenames,labels))
dataset = dataset.map(
map_func=decode_image_and_resize,
num_parallel_calls=tf.data.experimental.AUTOTUNE
)
dataset=dataset.shuffle(buffer_size)
dataset = dataset.batch(batch_size)
dataset=dataset.prefetch(tf.data.experimental.AUTOTUNE)
return dataset
train_data_dir='./dataset/train/'
buffer_size=1300
batch_size=100
dataset_train=prepare_dataset(train_data_dir)
it=iter(dataset_train)
images,labels=next(it)
def vgg19_model(input_shape=(224,224,3)):
vgg19=tf.keras.applications.vgg19.VGG19(include_top=False,
weights='imagenet',
input_shape=input_shape)
for layer in vgg19.layers:
layer.trainable=False
last=vgg19.output
x=tf.keras.layers.Flatten()(last)
x=tf.keras.layers.Dense(128,activation='relu')(x)
x=tf.keras.layers.Dropout(0.3)(x)
x=tf.keras.layers.Dense(64,activation='relu')(x)
x=tf.keras.layers.Dropout(0.3)(x)
x=tf.keras.layers.Dense(128,activation='relu')(x)
x=tf.keras.layers.Dropout(0.3)(x)
x=tf.keras.layers.Dense(2,activation='softmax')(x)
model =tf.keras.models.Model(inputs=vgg19.input,outputs=x)
return model
model=vgg19_model()
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="./keras_log/",
histogram_freq=1,
)
training_epochs=150
model.fit(dataset_train,epochs=training_epochs,verbose=1,callbacks=[tensorboard_callback])
model.summary()
try:
yaml_string=model.to_yaml()
with open('./models/cat_vs_dog.yaml','w') as model_file:
model_file.write(yaml_string)
model.save_weights('./models/cat_vs_dog.h5')
except Exception as e:
pass
测试程序
import os
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing import image
def read_image_files(path,start,finish,image_size=(224,224)):
test_file1 = os.listdir(path)
test_files=[]
for i in range(len(test_file1)):
test_files.append(str(i+1)+'.jpg')
test_image=[]
for fn in test_files[start:finish]:
img_filename=path+fn
img=image.load_img(img_filename,target_size=image_size)
img_array=image.img_to_array(img)
test_image.append(img_array)
test_data=np.array(test_image)
test_data/=255.0
print('You choose the image %d to image %d' %(start,finish))
print("The test_data's shape is",end='')
print(test_data.shape)
return test_data
def test_image_predict(path,start,finish,image_size=(224,224)):
test_data=read_image_files(path,start,finish,image_size)
preds=model.predict(test_data)
for i in range(0,finish-start):
print(i)
if np.argmax(preds[i])==0:
label="cat"+str(preds[i][0])
else:
label="dog"+str(preds[i][1])
plt.title(label)
plt.imshow(test_data[i])
plt.axis('off')
plt.show()
with open('./models/cat_vs_dog.yaml') as yamlfile:
loaded_model_yaml=yamlfile.read()
model=tf.keras.models.model_from_yaml(loaded_model_yaml)
model.load_weights('./models/cat_vs_dog.h5')
test_data_dir='./dataset/test1/'
test_image_predict(test_data_dir,0,1010)