数据加载
import os,math
from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams["font.sans-serif"] = ["SimHei"] # 用来正常显示中文标签
plt.rcParams["axes.unicode_minus"] = False # 用来正常显示负号
data = pd.read_csv("SH600519.csv") # 读取股票文件
设置GPU
# K同学啊深度学习练习
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
if gpus:
tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用
tf.config.set_visible_devices([gpus[0]],"GPU")
# 打印显卡信息,确认GPU可用
print(gpus)
使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset中这三行代码主要是先对片进行预处理,设定片的高度和宽度还有batch_size的大小
batch_size = 8
img_height = 224
img_width = 224
数据查看
前置工作
常见的其他接口有
include_top:是否包括网络顶部的3个全连接层。weights:默认不加载权重文件,"imagenet"加载官方权重文件,或者输入自己的权重文件路径。classes:分类像的类别数
模型评估
acc = history.history["accuracy"]
val_acc = history.history["val_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs_range = range(epochs)
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label="Training Accuracy")
plt.plot(epochs_range, val_acc, label="Validation Accuracy")
plt.legend(loc="lower right")
plt.title("Training and Validation Accuracy")
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label="Training Loss")
plt.plot(epochs_range, val_loss, label="Validation Loss")
plt.legend(loc="upper right")
plt.title("Training and Validation Loss")
plt.show()
Image_batch是形状的张量。这是一批形状224x224x3的8张片。Label_batch是形状的张量,这些标签对应32张片
tf.keras.applications.xception.Xceptiontf.keras.applications.vgg1VGG16tf.keras.applications.vgg1VGG19tf.keras.applications.resnet50.ResNet50tf.keras.applications.inception_vInceptionV3tf.keras.applications.inception_resnet_vInceptionResNetV2tf.keras.applications.mobilenet.MobileNettf.keras.applications.mobilenet_vMobileNetV2tf.keras.applications.densenet.DenseNet121tf.keras.applications.densenet.DenseNet169tf.keras.applications.densenet.DenseNet201tf.keras.applications.nasnet.NASNetMobiletf.keras.applications.nasnet.NASNetLarge
这方面的内容还挺有意思,直接通过调用就可以进行训练
可视化数据
plt.figure(figsize=(20, 10)) # 图形的宽为10高为5
plt.suptitle("数据展示")
for images, labels in train_ds.take(1):
for i in range(8):
ax = plt.subplot(2, 4, i + 1)
ax.patch.set_facecolor("yellow")
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(class_names[labels[i]])
plt.axis("off")
不难看出,这里的运行出来的结果很不理想,说明该方法其实并不适合对于宝可梦角色的预测当中,可能的原因在于模型动态学习率的方法并不适合,毕竟是指数倍的计算,计算量比较大,nasnet本身是一个通过堆叠网络单元的形式将其迁移到任意分类任务,乃至任意类型的任务中,还有就是nasnet本身更加适合用于强化学习?这方面不是很了解,可以后续进行学习
检查数据
for image_batch, labels_batch in train_ds:
print(image_batch.shape)
print(labels_batch.shape)
break
调整数据集所在的位置在这里插入片描述
数据预处理
加载数据
数据集一共分为10个角色,每个角色都会有单独的自带的文件夹保存片
image_count = len(list(data_dir.glob("*/*")))
print("图片总数为:",image_count)
设置动态学习率
模型训练
配置数据集
K同学啊在调用的过程当中使用的Densenet121的方法,我这里尝试使用其他接口,使用tf.keras.applications.nasnet.NASNetMobile进行模型的预测,其他内容不变
model = tf.keras.applications.nasnet.NASNetMobile(weights="imagenet")
model.summary()
这三个参数可以根据需要进行修改
设置动态学习率也就相对于是说每一次模型优化之后,我都会调整我的学习率,这样的好处就在于,使得学习率的调整更加合理,及可以避免学习率过大而导致的结果不收敛,以及避免学习率过小时进入局部最优解,常见的就有RMSProp这里使用的是指数衰减学习率导入到优化器当中
# 设置初始学习率
initial_learning_rate = 1e-4
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps=5, # 敲黑板!!!这里是指 steps,不是指epochs
decay_rate=0.96, # lr经过一次衰减就会变成 decay_rate*lr
staircase=True)
# 将指数衰减学习率送入优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
CPU正在准备数据时,加速器处于空闲状态。相反,当加速器正在训练模型时,CPU处于空闲状态。训练所用的时间是CPU预处理时间和加速器训练时间的总和。prefetch将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第N个训练步时,CPU正在准备第N+1步的数据。这样做不仅可以最大限度地缩短训练的单步用时,而且可以缩短提取和转换数据所需的时间。如果不使用prefetch,CPU和GPU/TPU在大部分时间都处于空闲状态使用该函数的作用就在于尽可能的提高CPU等的使用性能,提高模型训练时候的速度使用该函数可以减少空闲时间
片总数为:219
cache:将数据集缓存到内存当中,加速运行
AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
模型训练
model.compile(optimizer=optimizer,
loss ="sparse_categorical_crossentropy",
metrics =["accuracy"])
epochs = 20
history = model.fit(
train_ds,
validation_data=val_ds,
epochs=epochs
)
官方模型调用
将运行的代码和需要运行的数据集放在同一个文件夹,方便数据的导入
data_dir = "016_Pokemon"
data_dir = pathlib.Path(data_dir)
这三行代码划分数据集,train_ds,val_ds
"""
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=12,
image_size=(img_height, img_width),
batch_size=batch_size)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=12,
image_size=(img_height, img_width),
batch_size=batch_size)
class_names = train_ds.class_names
print(class_names)
调用官方的网络的模型
文章为作者独立观点,不代表股票交易接口观点