【神经网络学习篇】tensorflow实现cifar10识别(RNN lstm)

1.Long Short Term Memory networks 简称 LSTMs,是一种特殊的RNN网络。

LSTM被明确地设计为避免长期依赖性问题。长时间记住信息实际上是它们的默认行为,而不是它们努力学习的东西。

标准RNN中的重复模块包含一个单层。

LSTM 也有这种链状结构,但重复模块有不同的结构,它有四个神经网络层,以一种特殊的方式进行交互。LSTM 中的重复模块包含四个交互层。

【神经网络学习篇】tensorflow实现cifar10识别(RNN lstm)_第1张图片

图片来自:https://medium.com/@saurabh.rathor092/simple-rnn-vs-gru-vs-lstm-difference-lies-in-more-flexible-control-5f33e07b1e57

译文版本:(译)理解 LSTM 网络 (Understanding LSTM Networks by colah)_大学之道,在明明德-CSDN博客_colah lstm

2.TensorFlow 

在深入构建网络和训练过程之前,了解TensorFlow 是如何工作的以及有哪些包。

TensorFlow 附带了一堆软件包。可以找到具有相似功能的模块。例如,tf.nn.conv2d 和 tf.layers.conv2d 都是二维卷积操作。

tf.nn: 神经网络的低级别的API
这个包下的每个API都有其唯一的目的,可能需要自己手动设置很多设置。


tf.layer: 神经网络的高级API
这个包下的每个API可能都有简化的流程,以及有很多默认的参数设置
例如,为了在conv2d之后应用激活函数,你不需要两个矛头指向的API调用。因此,这个包下的conv2d API有激活参数。


tf.contrib: 包含不稳定或实验性的API
像文件中解释的那样,这个包提供了实验性的代码,你可能会发现更多方便的API,当你在主包中找不到功能时,可以查找这个包。

3.载入所需库:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.datasets import mnist
from tensorflow.keras.datasets import cifar10
from matplotlib import pyplot
from PIL import  Image
import numpy as np
from keras.layers import LSTM,Dense,Dropout

4.准备照片,校准格式

由于Cifar10 是由Hinton的学生收集的用于普适物体识别的计算机视觉数据集,他由60,000张32*32张彩色RGB照片组成(包含 50,000张训练图像和 10,000 张测试图像),所以需要将照片转成相同尺寸。

【神经网络学习篇】tensorflow实现cifar10识别(RNN lstm)_第2张图片

xx
import cv2 as cv
image=cv.imread('car.jpg')
res=cv.resize(image,(32,32),interpolation=cv.INTER_CUBIC)
cv.imshow('iker',res)
cv.imshow('image',image)
cv.imwrite('test.png', res)  # 写入图片
#cv2.destroyAllWindows()  # 关闭窗口
cv.waitKey(0)

【神经网络学习篇】tensorflow实现cifar10识别(RNN lstm)_第3张图片

 例图 车

5.加载数据

x_train: uint8 NumPy array of grayscale image data with shapes (50000, 32, 32, 3), containing the training data. Pixel values range from 0 to 255.

y_train: uint8 NumPy array of labels (integers in range 0-9) with shape (50000, 1) for the training data.

x_test: uint8 NumPy array of grayscale image data with shapes (10000, 32, 32, 3), containing the test data. Pixel values range from 0 to 255.

y_test: uint8 NumPy array of labels (integers in range 0-9) with shape (10000, 1) for the test data.

(x_train,y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.reshape(-1,1024).astype("float32")/255.0
x_test = x_test.reshape(-1,1024).astype("float32")/255.0
y_train = y_train.reshape(-1,1024).astype("float32")/255.0
y_test = y_test.reshape(-1,1024).astype("float32")/255.0
model = keras.Sequential()
model.add(keras.Input(shape=(1024,3)))
model.add(
    layers.Bidirectional(layers.LSTM(32,return_sequences=True,activation="relu"))
)
model.add(layers.LSTM(32,name = "lstm_layer2"))
model.add(layers.Dense(10))
model.compile(
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer = keras.optimizers.Adam(lr = 0.1),
    metrics=["accuracy"],
)
print(model.summary())

可以看到输出的结果如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bidirectional (Bidirectional (None, 1024, 64)          9216      
_________________________________________________________________
lstm_layer2 (LSTM)           (None, 32)                12416     
_________________________________________________________________
dense (Dense)                (None, 10)                330       
=================================================================
Total params: 21,962
Trainable params: 21,962
Non-trainable params: 0
_________________________________________________________________
None

6.结论

model.fit(x_train, y_train, batch_size=128, epochs=5 ,validation_split=0.05)
model.evaluate(x_test, y_test, batch_size=32)

image = tf.keras.preprocessing.image.load_img('test.png')
input_arr = keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr])
verdicts = model.predict(input_arr)
print("Predicting using train set %s result is %s" % (input_arr.shape, verdicts.shape))
for image_result in verdicts:
    print(image_result)
    print(numpy.argmax(image_result))

你可能感兴趣的:(tensorflow,rnn,lstm)