本人在学习TensorFlow机器学习的时候使用的例子和程序。主要是使用tf2.6版本
下面是一个基于TensorFlow 2.6的用于对10类照片进行分类的示例代码,使用的是卷积神经网络(CNN)模型。CIFAR-10分类的经典架构 - 这是处理CIFAR-10数据集的常见CNN架构
import tensorflow as tf
from tensorflow import keras
# 定义模型结构
model = keras.Sequential([
keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(64, 64, 3)),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'),
keras.layers.MaxPooling2D(pool_size=(2, 2)),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 加载数据集
(train_images, train_labels), (test_images, test_labels) = keras.datasets.cifar10.load_data()
# 数据预处理
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0
# 训练模型
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Test accuracy:", test_acc)这个示例代码中,使用了两个卷积层和一个全连接层的结构,其中使用了ReLU激活函数和dropout技术进行过拟合的防治。在训练模型时,使用了CIFAR-10数据集进行训练和验证,并且对数据进行了归一化处理。最后,使用测试数据集对模型进行了评估,并输出了模型的测试准确率。
tensorflow图片分类训练
import tensorflow as tf
import os
import numpy as np
#获取图片,存放到对应的列表中,同时贴上标签,存放到label列表中
def get_files(file_dir):
# 存放图片类别和标签的列表:第0类
list_0 = []
label_0 = []
# 存放图片类别和标签的列表:第1类
list_1 = []
label_1 = []
# 存放图片类别和标签的列表:第2类
list_2 = []
label_2 = []
# 存放图片类别和标签的列表:第3类
list_3 = []
label_3 = []
# 存放图片类别和标签的列表:第4类
list_4 = []
label_4 = []
for file in os.listdir(file_dir):
#print(file)
#拼接出图片文件路径
image_file_path = os.path.join(file_dir,file)
for image_name in os.listdir(image_file_path):
# print('image_name',image_name)
#图片的完整路径
image_name_path = os.path.join(image_file_path,image_name)
# print('image_name_path',image_name_path)
#将图片存放入对应的列表
if image_file_path[-1:] == '狮子':
list_0.append(image_name_path)
label_0.append(0)
elif image_file_path[-1:] == '大象':
list_1.append(image_name_path)
label_1.append(1)
elif image_file_path[-1:] == '猫':
list_2.append(image_name_path)
label_2.append(2)
elif image_file_path[-1:] == '狗':
list_3.append(image_name_path)
label_3.append(3)
elif image_file_path[-1:] == '蛇':
list_4.append(image_name_path)
label_4.append(4)
# 合并数据
image_list = np.hstack((list_0, list_1, list_2, list_3, list_4))
label_list = np.hstack((label_0, label_1, label_2, label_3, label_4))
#利用shuffle打乱数据
temp = np.array([image_list, label_list])
temp = temp.transpose() # 转置
np.random.shuffle(temp)
#将所有的image和label转换成list
image_list = list(temp[:, 0])
image_list = [i for i in image_list]
label_list = list(temp[:, 1])
label_list = [int(float(i)) for i in label_list]
#print(image_list)
#print(label_list)
return image_list, label_list
image_list, label_list = get_files('D:\\机器学习\\动物分类数据集\\动物分类')
train_image = []
for imagePath in image_list:
image = tf.io.read_file(imagePath ) # 读取图片
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [60, 60])
image /= 255.0# 归一化到[0,1]范围
train_image.append(image)
train_images = np.array(train_image)
train_labels = np.array(label_list)
#训练
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential(
[
# 第一层CNN
tf.keras.layers.Conv2D(16, (3,3), activation='relu',input_shape=[60, 60, 3]),
tf.keras.layers.MaxPooling2D(2, 2),
# 第二层CNN
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# 第三层CNN
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(5, activation='softmax')#输出5个神经元,激活方式softmax
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels,epochs=50,steps_per_epoch=5)
# 保存模型
model_save_path = "D:\\机器学习\\代码\\tensorflow2.6\\animal.h5"
model.save(model_save_path)
# 删除当前已存在的模型
del model
预测
import tensorflow as tf
import numpy as np
image = tf.io.read_file('D:/机器学习/动物分类数据集/测试/s0.jpg')# 读取图片
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [60, 60])
image /= 255.0 # 归一化到[0,1]范围
it = np.array(list(image))
itt = it.reshape(1,60,60,3)
# 加载模型
from keras.models import load_model
model = load_model("D:\\机器学习\\代码\\tensorflow2.6\\animal.h5")
# 对图像做预测
y = model.predict(itt)
print('狮子')
print(y[0][0])
print('大象')
print(y[0][1])
print('猫')
print(y[0][2])
print('狗')
print(y[0][3])
print('蛇')
print(y[0][4])
tensorflow训练是人是马
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 1-1、创建两个数据生成器
train_data_gen = ImageDataGenerator(rescale=1/255)
test_data_gen = ImageDataGenerator(rescale=1/255)
# 训练数据生成器(指向训练数据文件夹)
train_generator = train_data_gen.flow_from_directory(
'D:\\python\\horse-or-human',
target_size = (150,150), batch_size = 32, class_mode = 'binary'
# 目标大小 一批的数量 二分类
)
test_generator = test_data_gen.flow_from_directory(
'D:\\python\\validation-horse-or-human',
target_size = (150,150), batch_size = 32, class_mode = 'binary'
)
# 2、构建神经网络
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
# 神经网络模型
model = tf.keras.models.Sequential([
# 第一层CNN
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
# 第二层CNN
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# 第三层CNN
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# 第四层CNN
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# 第五层CNN
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# 输入层
tf.keras.layers.Flatten(),
# 隐层
tf.keras.layers.Dense(512, activation='relu'),
# 输出层:用sigmoid激活函数二分类(只有一个神经元,结果只有0和1,分别对应人和马)
tf.keras.layers.Dense(1, activation='sigmoid')
])
# 可视化
model.summary()
model.compile(loss='binary_crossentropy', optimizer=RMSprop(learning_rate=0.001), metrics=['acc'])
#model.fit(train_generator, epochs=3, validation_data=test_generator)
model.fit(train_generator, epochs=3)
import cv2
import matplotlib.pyplot as plt
import numpy as np
# (1) 读取图像
# img1:马 img2:人
img1 = cv2.imread('D:/python/validation-horse-or-human/horses/horse1-000.png')
img1 = cv2.resize(img1, (150, 150))
img2 = cv2.imread('D:/python/validation-horse-or-human/humans/valhuman01-01.png')
img2 = cv2.resize(img2, (150, 150))
# (2) BGR转RGB
# OpenCV中图片像素按照BGR方式排列;而Matpoltlib中图片按照RGB方式排序
b,g,r = cv2.split(img1) #分离
img1 = cv2.merge([r,g,b]) #合并
b,g,r = cv2.split(img2) #分离
img2 = cv2.merge([r,g,b]) #合并
# (3) 显示图像
f, ax = plt.subplots(1, 2)
ax[0].imshow(img1)
ax[1].imshow(img2)
plt.show()
# 图像转数据(用来做预测)
Img1 = np.expand_dims(img1, axis=0) #转三维数据(二维转三维)
Img2 = np.expand_dims(img2, axis=0) #转三维数据(二维转三维)
# 4、预测(分别对两个图进行预测)
# 对图像1做预测
y = model.predict(Img1, batch_size=10)
print(y[0][0])
# 对图像2做预测
y = model.predict(Img2, batch_size=10)
print(y[0][0])
model_save_path = "D:\\python3.6库\\model_file_path.h5"
# 保存模型
model.save(model_save_path)
# 删除当前已存在的模型
del model
预测人马
import numpy as np
# (1) 读取图像
from keras.preprocessing import image
img = image.load_img("D:\\python\\validation-horse-or-human\\horses\\horse1-204.png", target_size=(150, 150))
img1 = image.img_to_array(img)
img = image.load_img("D:\\python\\validation-horse-or-human\\humans\\valhuman01-14.png", target_size=(150, 150))
img2 = image.img_to_array(img)
# 图像转数据(用来做预测)
Img1 = np.expand_dims(img1, axis=0) #转三维数据(二维转三维)
Img2 = np.expand_dims(img2, axis=0) #转三维数据(二维转三维)
# 加载模型
from keras.models import load_model
model = load_model("D:\\python3.6库\\model_file_path.h5")
# 对图像1做预测
y = model.predict(Img1, batch_size=10)
print(y[0][0])
# 对图像2做预测
y = model.predict(Img2, batch_size=10)
print(y[0][0])