0


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

我们用

  1. tf.keras

来创建神经网络:
什么是

  1. tf.keras

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

大致流程:

其大致步骤如下:

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

认识相关函数

Sequential:

  1. 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:
  1. model = tf.keras.models.Sequential([
  2. tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
  3. # 神经元个数, 选用的激活函数, 选用的正则方法
  4. ])

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

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

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

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

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

eg:

  1. model.compile(optimizer='adam',
  2. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
  3. metrics=['sparse_categorical_accuracy'])
  1. 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)
  1. loss

可以选择的有:

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

可以选择的有:

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

fit:执行训练过程

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

summary

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

一些其它的常用函数

  • load_weights(路径文件名):加载神经网络模型
  • 保存模型:
  1. callback = tf.keras.callbacks.ModelCheckpoint(
  2. filepath = 路径文件名
  3. save_weights_only = True/False,#是否只保留模型参数
  4. save_best_only = True/False#是否只保留最优模型
  5. )
  6. history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
  7. callbacks=[callback])
  8. #在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=整数):向前传播得出预测的结果

搭建模型:

  1. import tensorflow as tf
  2. import numpy as np
  3. from PIL import Image
  4. import os
  5. #导入相关的数据
  6. mnist = tf.keras.datasets.mnist
  7. (x_train,y_train),(x_test,y_test) = mnist.load_data()
  8. x_train = x_train /255.0
  9. x_test = x_test / 255.0
  10. #搭建网络框架
  11. model = tf.keras.models.Sequential([
  12. tf.keras.layers.Flatten(),#拉直层
  13. tf.keras.layers.Dense(784,activation = 'relu'),
  14. tf.keras.layers.Dense(10,activation = 'softmax')
  15. #10个网络节点对应数字0-9
  16. ])
  17. #配置学习方法
  18. model.compile(
  19. optimizer='adam',#采用adam优化
  20. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),#选择损失函数
  21. metrics=['sparse_categorical_accuracy']
  22. #因为前面是softmax输出的独热编码所以这里采用这种检验模式
  23. )
  24. #设置保存路径
  25. checkpoint_save_path='./checkpoint/mnist.ckpt'
  26. #如果之前存在这个网络,则加载以前的参数,再进行优化
  27. if os.path.exists(checkpoint_save_path + '.index'):
  28. print('已有模型数据,正在加载模型')
  29. model.load_weights(checkpoint_save_path)
  30. #设置存储路径
  31. callback = tf.keras.callbacks.ModelCheckpoint(
  32. filepath=checkpoint_save_path,
  33. save_weights_only=True,
  34. save_best_only=True
  35. )
  36. #执行训练
  37. history = model.fit(
  38. x_train,y_train,
  39. batch_size=32,epochs=10,
  40. validation_data=(x_test, y_test),
  41. validation_freq=1,
  42. callbacks=[callback]
  43. )
  44. #输出模型
  45. model.summary()

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

预测结果:

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

  1. import tensorflow as tf
  2. import numpy as np
  3. from PIL import Image
  4. import matplotlib.pyplot as plt
  5. model_save_path = './checkpoint/mnist.ckpt'
  6. #搭建网络框架
  7. model = tf.keras.models.Sequential([
  8. tf.keras.layers.Flatten(),#拉直层
  9. tf.keras.layers.Dense(784,activation = 'relu'),
  10. tf.keras.layers.Dense(10,activation = 'softmax')
  11. #10个网络节点对应数字0-9
  12. ])
  13. model.load_weights(model_save_path)
  14. test_num = int(input("你想进行的实验次数是:"))
  15. for i in range(test_num):
  16. image_path = input("输入照片文件名")
  17. img = Image.open(image_path)
  18. #调整尺寸,灰度
  19. img = img.resize((28, 28), Image.ANTIALIAS)
  20. img_arr = np.array(img.convert('L'))
  21. img_arr = 255.0 - img_arr#颜色反转
  22. img_arr = img_arr / 255.0
  23. x_predict = img_arr[tf.newaxis, ...]
  24. result = model.predict(x_predict)
  25. pred = tf.argmax(result, axis=1)
  26. print('\n')
  27. tf.print(pred)
  28. plt.pause(1)
  29. plt.close()

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

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

标签: tensorflow

本文转载自: https://blog.csdn.net/go_bananas/article/details/123648748
版权归原作者 go_bananas 所有, 如有侵权,请联系我们删除。

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

还没有评论