**
一句话,tensorflow2.0真是难用啊。
**
实验目的:
我们用600张图片,进行训练,最后区分笑脸和不笑的脸。
多说无益。我们上代码、
1.导入必要的包
import tensorflow as tf
import keras.backend as K
import math
import numpy as np
import h5py
from tensorflow.python.keras import layers, Sequential
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input,Dense, Conv2D, Flatten,MaxPooling2D,ZeroPadding2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
from keras.applications.imagenet_utils import preprocess_input
%matplotlib inline
2.编写加载数据集函数
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
def load_dataset():
train_dataset = h5py.File('datasets/train_happy.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('datasets/test_happy.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
3.载入数据集并预测理
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
# 对数据集中的图像进行规范化 0-1
X_train = X_train_orig/255.
X_test = X_test_orig/255.
# 进行转型 从行向量变为列向量(2维数组表示) 每行代表一个样本
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T
print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
3.1打开数据集中一张图片看看
index = 5
plt.imshow(X_train_orig[index])
4.下面开始编写模型
model = Sequential([
layers.ZeroPadding2D((3,3)), #填充0
layers.Conv2D(32,(7,7),strides=(1,1)),
layers.BatchNormalization(axis=3), #批量标准化
layers.Activation("relu"),
layers.MaxPooling2D((2,2)), #最大次池化层
layers.Flatten(), #铺平
layers.Dense(1,activation="sigmoid")])
#优化算法:Adam
#交叉熵损失值函数:BinaryCrossentropy
#准确率:accuracy
model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(),metrics=["accuracy"])
model.fit(x = X_train,y = Y_train,epochs=40,batch_size=16)
效果不错。
4.1训练好的权重出来了,把测试集扔进去看看效果。
preds = model.evaluate(x = X_test,y=Y_test)
print(——————————————————————————————————————)
print("Loss=" + str(preds[0]))
print("Test Accurcy = " + str(preds[1]))
看着也还行。主要是数据量小。网络层太浅。就不加Dropout,正则,这些辅助了。没意义。
5.2 检验一下算法效果。 0:是不笑,1:是笑
- 图像包里有一张不笑的图片。用他来测试
#图像相对路径
img_path = 'images/my_image.jpg'
#可视化图片
img = image.load_img(img_path, target_size=(64, 64))
imshow(img)
x = image.img_to_array(img)
x = np.expand_dims(x,axis=0)
x = preprocess_input(x)
print(model.predict(x))
还行。吴恩达作业这里就完成。 下一篇开始残差网络。
完整项目:https://pan.baidu.com/s/10D_UAj8756Lnh9P0iTtQnw 提取码:04ip