基于python3.6+tensorflow2.2的石头剪刀布案例

2024-02-24 18:20

本文主要是介绍基于python3.6+tensorflow2.2的石头剪刀布案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

unzip_save.py

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # 不显示等级2以下的提示信息
import zipfile
import matplotlib.pyplot as plt
import matplotlib.image as mpimg# 解压
local_zip1 = 'E:/Python/pythonProject_1/rps/tmp/rps.zip' # 数据集压缩包路径
zip_ref1 = zipfile.ZipFile(local_zip1, 'r') # 打开压缩包,以读取方式
zip_ref1.extractall('E:/Python/pythonProject_1/rps/tmp/') # 解压到以下路径
zip_ref1.close()local_zip2 = 'E:/Python/pythonProject_1/rps/tmp/rps-test-set.zip' # 数据集压缩包路径
zip_ref2 = zipfile.ZipFile(local_zip2, 'r') # 打开压缩包,以读取方式
zip_ref2.extractall('E:/Python/pythonProject_1/rps/tmp/') # 解压到以下路径
zip_ref2.close()rock_dir = os.path.join('E:/Python/pythonProject_1/rps/tmp/rps/rock')
paper_dir = os.path.join('E:/Python/pythonProject_1/rps/tmp/rps/paper')
scissors_dir = os.path.join('E:/Python/pythonProject_1/rps/tmp/rps/scissors')rock_files = os.listdir(rock_dir)
print(rock_files[:10])paper_files = os.listdir(paper_dir)
print(paper_files[:10])scissors_files = os.listdir(scissors_dir)
print(scissors_files[:10])pic_index = 2
next_rock = [os.path.join(rock_dir, fname)for fname in rock_files[pic_index - 2:pic_index]]
next_paper = [os.path.join(paper_dir, fname)for fname in paper_files[pic_index - 2:pic_index]]
next_scissors = [os.path.join(scissors_dir, fname)for fname in scissors_files[pic_index - 2:pic_index]]for i, img_path in enumerate(next_rock+next_paper+next_scissors):img = mpimg.imread(img_path)plt.imshow(img)plt.axis('Off')plt.show()


model_training_fit.py

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # 不显示等级2以下的提示信息import tensorflow as tf
# from tensorflow import keras
# from tensorflow.keras.optimizers import RMSprop
# from tensorflow.keras.preprocessing import image
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plttraining_datagen = ImageDataGenerator(# 数据增强rescale=1. / 255,rotation_range=40, # 旋转范围width_shift_range=0.2, # 宽平移height_shift_range=0.2,# 高平移shear_range=0.2, # 剪切zoom_range=0.2, # 缩放horizontal_flip=True,fill_mode='nearest'
)validation_datagen = ImageDataGenerator(rescale=1. / 255
)TRAINING_DIR = 'E:/Python/pythonProject_1/rps/tmp/rps/'
training_generator = training_datagen.flow_from_directory(TRAINING_DIR,target_size = (150, 150),class_mode = 'categorical'
)VALIDATION_DIR = 'E:/Python/pythonProject_1/rps/tmp/rps-test-set/'
validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR,target_size = (150, 150),class_mode = 'categorical'
)#======== 模型构建 =========
model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (3, 3), activation = 'relu', input_shape = (150, 150, 3)), # 输入参数:过滤器数量,过滤器尺寸,激活函数:relu, 输入图像尺寸tf.keras.layers.MaxPooling2D(2, 2), # 池化:增强特征tf.keras.layers.Conv2D(64, (3, 3), activation = 'relu'), # 输入参数:过滤器数量、过滤器尺寸、激活函数:relutf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),  # 输入参数:过滤器数量、过滤器尺寸、激活函数:relutf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),  # 输入参数:过滤器数量、过滤器尺寸、激活函数:relutf.keras.layers.MaxPooling2D(2, 2),tf.keras.layers.Flatten(), # 输入层tf.keras.layers.Dense(512, activation = 'relu'), # 全连接隐层 神经元数量:128 ,激活函数:relutf.keras.layers.Dense(3, activation = 'softmax') # 英文字母分类 26 ,阿拉伯数字分类 10  输出用的是softmax 概率化函数 使得所有输出加起来为1 0-1之间
])model.summary()#======== 模型参数编译 =========
model.compile(optimizer = 'rmsprop',loss = 'categorical_crossentropy', # 损失函数: 稀疏的交叉熵 binary_crossentropymetrics = ['accuracy']
)#======== 模型训练 =========
# Note that this may take some time.
history = model.fit_generator(training_generator,epochs = 25,validation_data = validation_generator,verbose = 1
)model.save('E:/Python/pythonProject_1/rps/model.h5') # model 保存#-----------------------------------------------------------
# Retrieve a list of list result on training and test data
# set for each training epoch
#-----------------------------------------------------------
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']epochs = range(len(acc)) # Get number of epochs#-----------------------------------------------------------
# Plot training and validation accuracy per epoch
#-----------------------------------------------------------
plt.plot(epochs, acc, 'r', label = "tra_acc")
plt.plot(epochs ,val_acc, 'b', label = "val_acc")
plt.title("training and validation accuracy")
plt.legend(loc=0)
plt.grid(ls='--')  # 生成网格
plt.show()
# 曲线呈直线是因为epochs/轮次太少
#-----------------------------------------------------------
# Plot training and validation loss per epoch
#-----------------------------------------------------------
plt.plot(epochs, loss, 'r', label = "train_loss")
plt.plot(epochs ,val_loss, 'b', label = "val_loss")
plt.title("training and validation loss")
plt.legend(loc=0)
plt.grid(ls='--')  # 生成网格
plt.show()
# 曲线呈直线是因为epochs/轮次太少


predict.py

import numpy as np
from tensorflow.keras.preprocessing import image
from tensorflow import keras
model = keras.models.load_model('E:/Python/pythonProject_1/rps/model.h5')# predicting images
path = 'E:/Python/pythonProject_1/rps/scissor.png'
img = image.load_img(path, target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)images = np.vstack([x])
classes = model.predict(images, batch_size=10)
print(classes)


model.summary

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 64)      1792      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 64)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 64)        36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 15, 15, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128)         0         
_________________________________________________________________
flatten (Flatten)            (None, 6272)              0         
_________________________________________________________________
dense (Dense)                (None, 512)               3211776   
_________________________________________________________________
dense_1 (Dense)              (None, 3)                 1539      
=================================================================
Total params: 3,473,475
Trainable params: 3,473,475
Non-trainable params: 0
_________________________________________________________________


测试结果:

Epoch 23/25
79/79 [==============================] - 83s 1s/step - loss: 0.0410 - accuracy: 0.9905 - val_loss: 0.0064 - val_accuracy: 1.0000
Epoch 24/25
79/79 [==============================] - 82s 1s/step - loss: 0.0621 - accuracy: 0.9798 - val_loss: 0.1802 - val_accuracy: 0.9382
Epoch 25/25
79/79 [==============================] - 82s 1s/step - loss: 0.0704 - accuracy: 0.9821 - val_loss: 0.0640 - val_accuracy: 0.9704


 预测结果:

scissor.png

>>> print(classes)[[0. 0. 1.]]


数据来源地址: https://laurencemoroney.com/datasets.html

这篇关于基于python3.6+tensorflow2.2的石头剪刀布案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742957

相关文章

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置