从0开始的深度学习——【tensorflow】创建一个神经网络

我们用tf.keras来创建神经网络:
什么是tf.keras?,简单地说就是tensorflow中已经帮你封装好的一些包,它的作用是可以帮你快速搭建网络模型。
我们以创建一个能自动识别图片里的数字的神经网络为例子:

大致流程:

其大致步骤如下:

  1. import:
  • import相关模块,将你要用的模块引用到你的网络中来。
    比如
from PIL import Image
import numpy as np
import tensorflow as tf
  1. train,test
  • 告知你要喂入神经网络的数据集和用于测试的数据集
  1. Sequential/Class
  • 搭建网络结构,逐层描述每一层网络,等同于前向传播
  1. model.compile
  • 配置训练方法——选择什么优化器,损失函数,评测指标
  1. model.fit
  • 执行训练过程
  1. model.summary
  • 打印出网络的参数和结构。

认识相关函数

Sequential:

model = tf.keras.models.Sequential([网络结构])
有哪些网络结构呢?

  1. 拉直层:tf.keras.layers.Flatten(),这一层不含计算,只是将你的输入特征拉直为一维数组

  2. 全连接层:tf.keras.layers.Dense(神经元个数,activation='激活函数',kernel_regularizer=哪种正则化)
    神经元个数:本层的节点数
    激活函数:本层节点的输出与下一层节点的输入之间的函数连接方式(relu,softmax,sigmoid,tanh…)
    正则化:为防止过度拟合而加的参数(l1,l2…)

  3. 卷积层:tf.keras.layers.Conv2D(filters = 卷积核个数 ,kernel_size= 卷积核尺寸,strides = 卷积步长, padding = “valid” or "same")

  4. LSTM层:tf.keras.layers.LSTM()
    eg:

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
    #                 神经元个数,   选用的激活函数,              选用的正则方法
])

下面是一个多层的神经网络:

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

它大概长这样:
在这里插入图片描述

compile():配置神经网络的学习方法

model.compile(optimizer=优化器,loss=损失函数,metrics=['准确率'])
eg:

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

optimizer可以选择的有:

  1. 'sgd’或tf.keras.optimizers.SGD(lr=学习率,momentum=动量参数)
  2. 'adagrad’或tf.keras.optimizers.Adagrad(lr=学习率)
  3. 'adadelta’或tf.keras.optimizers.Adadelta(lr=学习率)
  4. 'adam’或tf.keras.optimizers.Adam(lr=学习率,beta_1=0.9,beta_2=0.999)

loss可以选择的有:

  1. ‘mse’
  2. tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),后面的参数是在询问是否是原始输出。

metris可以选择的有:

  1. ‘accuracy’:y_test和y_train都是数值。
  2. ‘categorical_accuracy’:y_test和y_train都是概率分布。
  3. ‘sparse_categorical_accuracy’:y_test是数值,y_train是概率分布

fit:执行训练过程

model.fit(
    训练集的输入特征,训练集的标签
    batch_size= 每次喂入神经网络的样本数, 
    epochs= 迭代数据集的次数,
    validation_data = (测试集的输入特征,测试集的标签) 或者 validation_spilt = 从训练集划分多少给测试集
	#以上两个函数二选一
    validation_freq = 多少次cpoch测试一次
)

summary

可以打印出网络的结构和参数统计

一些其它的常用函数

  • load_weights(路径文件名):加载神经网络模型
  • 保存模型:

callback = tf.keras.callbacks.ModelCheckpoint(
   filepath = 路径文件名
   save_weights_only = True/False,#是否只保留模型参数
   save_best_only = True/False#是否只保留最优模型
)
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                   callbacks=[callback])
#在fit函数中再加入回调函数即可
  • 提取训练的参数:model.trainable_variables返回模型中可训练的参数
  • 提取训练数据:history=model.fit(…)
  1. 训练集loss:[loss]loss = history.history['loss']
  2. 测试集loss:[val_loss]val_loss = history.history['val_loss']
  3. 训练集准确率:acc = history.history['sparse_categorical_accuracy']
  4. 测试集准确率:val_acc = history.history['val_sparse_categorical_accuracy']
  • 预测结果: predict(输入特征,batch_size=整数):向前传播得出预测的结果

搭建模型:

import tensorflow as tf
import numpy as np
from PIL import Image
import os

#导入相关的数据
mnist = tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = x_train /255.0
x_test = x_test / 255.0

#搭建网络框架
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),#拉直层
    tf.keras.layers.Dense(784,activation = 'relu'),
    tf.keras.layers.Dense(10,activation = 'softmax')
    #10个网络节点对应数字0-9
])

#配置学习方法

model.compile(
    optimizer='adam',#采用adam优化
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),#选择损失函数
    metrics=['sparse_categorical_accuracy']
    #因为前面是softmax输出的独热编码所以这里采用这种检验模式
)

#设置保存路径
checkpoint_save_path='./checkpoint/mnist.ckpt'

#如果之前存在这个网络,则加载以前的参数,再进行优化
if os.path.exists(checkpoint_save_path + '.index'):
    print('已有模型数据,正在加载模型')
    model.load_weights(checkpoint_save_path)

#设置存储路径
callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_save_path,
    save_weights_only=True,
    save_best_only=True
)

#执行训练
history = model.fit(
    x_train,y_train,
    batch_size=32,epochs=10,
    validation_data=(x_test, y_test),
    validation_freq=1,
    callbacks=[callback]
)
#输出模型
model.summary()

我们观察第一次运行后的效果:
在这里插入图片描述
我们再把这个网络多跑几遍:
在这里插入图片描述
就会得到一个拟合效果很不错的网络了。

预测结果:

有了构建好的神经网络,我们只需要把数据喂神经网络,最后得到结果就可以啦
我们搭建好网络:

import tensorflow as tf
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

model_save_path = './checkpoint/mnist.ckpt'

#搭建网络框架
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),#拉直层
    tf.keras.layers.Dense(784,activation = 'relu'),
    tf.keras.layers.Dense(10,activation = 'softmax')
    #10个网络节点对应数字0-9
])

model.load_weights(model_save_path)

test_num = int(input("你想进行的实验次数是:"))

for i in range(test_num):
    image_path = input("输入照片文件名")
    img = Image.open(image_path)

    #调整尺寸,灰度
    img = img.resize((28, 28), Image.ANTIALIAS)
    img_arr = np.array(img.convert('L'))

    img_arr = 255.0 - img_arr#颜色反转

    img_arr = img_arr / 255.0
    x_predict = img_arr[tf.newaxis, ...]
    result = model.predict(x_predict)
    pred = tf.argmax(result, axis=1)

    print('\n')
    tf.print(pred)

    plt.pause(1)
    plt.close()

当我向神经网络输入这样一张图片:(5555.png)
在这里插入图片描述
即:在这里插入图片描述

神经网络识别的结果为5.
这样一个简单的神经网络就搭建好了。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
深度学习——基于Tensorflow 深度学习(Deep Learning,简称DL)是机器学习(Machine Learning,简称ML)领域中一个新的研究方向,其目标是让机器能够像人一样具有分析学习能力,识别文字、图像和声音等数据。深度学习通过学习样本数据的内在规律和表示层次,使机器能够模仿视听和思考等人类活动,从而解决复杂的模式识别难题。 深度学习的核心是神经网络,它由若干个层次构成,每个层次包含若干个神经元。神经元接收上一层次神经元的输出作为输入,通过加权和转换后输出到下一层次神经元,最终生成模型的输出结果。神经网络之间的权值和偏置是神经网络的参数,决定了输入值和输出值之间的关系。 深度学习的训练过程通常涉及反向传播算法,该算法用于优化网络参数,使神经网络能够更好地适应数据。训练数据被输入到神经网络中,通过前向传播算法将数据从输入层传递到输出层,然后计算网络输出结果与实际标签之间的差异,即损失函数。通过反向传播算法,网络参数会被调整以减小损失函数值,直到误差达到一定的阈值为止。 深度学习中还包含两种主要的神经网络类型:卷积神经网络(Convolutional Neural Networks,简称CNN)和循环神经网络(Recurrent Neural Networks,简称RNN)。卷积神经网络特别擅长处理图像数据,通过逐层卷积和池化操作,逐步提取图像中的高级特征。循环神经网络则适用于处理序列数据,如文本或时间序列数据,通过捕捉序列中的依赖关系来生成模型输出。 深度学习在许多领域都取得了显著的成果,包括计算机视觉及图像识别、自然语言处理、语音识别及生成、推荐系统、游戏开发、医学影像识别、金融风控、智能制造、购物领域、基因组学等。随着技术的不断发展,深度学习将在更多领域展现出其潜力。 在未来,深度学习可能会面临一些研究热点和挑战,如自监督学习、小样本学习、联邦学习、自动机器学习、多模态学习、自适应学习、量子机器学习等。这些研究方向将推动深度学习技术的进一步发展和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go_bananas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值