PaddlePaddle tutorial Ⅸ——LSTM for Classification & Regression

LSTM implements classification tasks

Dataset acquisition

The data set used this time is MNISTa data set. For convenience, this time the data set is read using

import the necessary packages

import paddle
import paddle.nn as nn
import numpy as np
import os
from paddle.vision.datasets import MNIST
from paddle.io import Dataset
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

paddle.__version__
'2.0.0-rc1'

data processing

train_dataset = MNIST(mode='train')
val_dataset = MNIST(mode='test')
def plot_num_images(num):
    if num < 1:
        print('INFO:The number of input pictures must be greater than zero!')
    else:
        choose_list = []
        for i in range(num):
            choose_n = np.random.randint(len(train_dataset))
            choose_list.append(choose_n)
        fig = plt.gcf()
        fig.set_size_inches(18, 5)
        for i in range(num):
            ax_img = plt.subplot(2, 8, i + 1)
            plt_img = train_dataset[choose_list[i]][0]
            ax_img.imshow(plt_img, cmap='binary')
            ax_img.set_title(str(train_dataset[choose_list[i]][1].item()),
                             fontsize=10)
        plt.show()
plot_num_images(16)

1

data loading

class MnnistDataset(Dataset):
    def __init__(self, mode='train'):
        super(MnnistDataset, self).__init__()
        if mode == 'train':
            self.data = [[np.array(train_dataset[i][0]).astype('float32'), train_dataset[i][1].astype('int64')] for i in range(len(train_dataset))]
        else:
            self.data = [[np.array(val_dataset[i][0]).astype('float32'), val_dataset[i][1].astype('int64')] for i in range(len(val_dataset))]

    def __getitem__(self, index):
        data = self.data[index][0]
        label = self.data[index][1]

        return data, label

    def __len__(self):
        return len(self.data)
train_loader = paddle.io.DataLoader(MnnistDataset(mode='train'), batch_size=10000, shuffle=True)
val_loader = paddle.io.DataLoader(MnnistDataset(mode='val'), batch_size=10000, shuffle=True)

modeling training

class RNN(nn.Layer):
    def __init__(self):
        super(RNN, self).__init__()

        self.rnn = nn.LSTM(
            input_size=28,
            hidden_size=64,
            num_layers=1,
        )
        self.out = nn.Linear(64, 10)

    def forward(self, x):
        r_out, (h_n, h_c) = self.rnn(x, None)
        out = self.out(r_out[:, -1, :])
        
        return out
epochs = 20
batch_size = 32
paddle.summary(RNN(), (1, 28, 28))
----------------------------------------------------------------------------------------------
 Layer (type)       Input Shape                   Output Shape                   Param #    
==============================================================================================
    LSTM-6      [[1, 28, 28], None]  [[1, 28, 64], [[1, 1, 64], [1, 1, 64]]]     24,064     
   Linear-6          [[1, 64]]                       [1, 10]                       650      
==============================================================================================
Total params: 24,714
Trainable params: 24,714
Non-trainable params: 0
----------------------------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.04
Params size (MB): 0.09
Estimated Total Size (MB): 0.14
----------------------------------------------------------------------------------------------






{'total_params': 24714, 'trainable_params': 24714}
model = paddle.Model(RNN())

model.prepare(optimizer=paddle.optimizer.Adam(learning_rate=0.005, parameters=model.parameters()),
              loss=paddle.nn.CrossEntropyLoss(),
              metrics=paddle.metric.Accuracy())

model.fit(train_loader,
          val_loader,
          epochs=epochs,
          batch_size=batch_size,
          verbose=1)
The loss value printed in the log is the current step, and the metric is the average value of previous step.
Epoch 1/20
step 6/6 [==============================] - loss: 1.9152 - acc: 0.3026 - 400ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 1.8194 - acc: 0.4652 - 381ms/step
Eval samples: 10000
Epoch 2/20
step 6/6 [==============================] - loss: 1.3814 - acc: 0.5162 - 260ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 1.2895 - acc: 0.6251 - 217ms/step
Eval samples: 10000
Epoch 3/20
step 6/6 [==============================] - loss: 0.9554 - acc: 0.6603 - 285ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.8986 - acc: 0.7120 - 223ms/step
Eval samples: 10000
Epoch 4/20
step 6/6 [==============================] - loss: 0.7356 - acc: 0.7341 - 255ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.6983 - acc: 0.7716 - 279ms/step
Eval samples: 10000
Epoch 5/20
step 6/6 [==============================] - loss: 0.5868 - acc: 0.7831 - 266ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.5834 - acc: 0.8003 - 224ms/step
Eval samples: 10000
Epoch 6/20
step 6/6 [==============================] - loss: 0.5230 - acc: 0.8190 - 258ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.5126 - acc: 0.8278 - 240ms/step
Eval samples: 10000
Epoch 7/20
step 6/6 [==============================] - loss: 0.4556 - acc: 0.8410 - 273ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.4599 - acc: 0.8451 - 244ms/step
Eval samples: 10000
Epoch 8/20
step 6/6 [==============================] - loss: 0.4119 - acc: 0.8561 - 258ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.4258 - acc: 0.8578 - 307ms/step
Eval samples: 10000
Epoch 9/20
step 6/6 [==============================] - loss: 0.3860 - acc: 0.8687 - 249ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.4050 - acc: 0.8619 - 228ms/step
Eval samples: 10000
Epoch 10/20
step 6/6 [==============================] - loss: 0.3763 - acc: 0.8751 - 257ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3850 - acc: 0.8689 - 243ms/step
Eval samples: 10000
Epoch 11/20
step 6/6 [==============================] - loss: 0.3569 - acc: 0.8821 - 268ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3643 - acc: 0.8756 - 240ms/step
Eval samples: 10000
Epoch 12/20
step 6/6 [==============================] - loss: 0.3407 - acc: 0.8884 - 258ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3515 - acc: 0.8801 - 247ms/step
Eval samples: 10000
Epoch 13/20
step 6/6 [==============================] - loss: 0.3212 - acc: 0.8932 - 266ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3413 - acc: 0.8839 - 224ms/step
Eval samples: 10000
Epoch 14/20
step 6/6 [==============================] - loss: 0.3172 - acc: 0.8977 - 253ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3309 - acc: 0.8860 - 228ms/step
Eval samples: 10000
Epoch 15/20
step 6/6 [==============================] - loss: 0.2890 - acc: 0.9016 - 254ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3250 - acc: 0.8892 - 303ms/step
Eval samples: 10000
Epoch 16/20
step 6/6 [==============================] - loss: 0.2911 - acc: 0.9046 - 242ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3183 - acc: 0.8921 - 225ms/step
Eval samples: 10000
Epoch 17/20
step 6/6 [==============================] - loss: 0.2639 - acc: 0.9083 - 279ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3128 - acc: 0.8922 - 255ms/step
Eval samples: 10000
Epoch 18/20
step 6/6 [==============================] - loss: 0.2732 - acc: 0.9118 - 277ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3074 - acc: 0.8954 - 567ms/step
Eval samples: 10000
Epoch 19/20
step 6/6 [==============================] - loss: 0.2579 - acc: 0.9142 - 362ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.3046 - acc: 0.8968 - 281ms/step
Eval samples: 10000
Epoch 20/20
step 6/6 [==============================] - loss: 0.2587 - acc: 0.9173 - 354ms/step
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 [==============================] - loss: 0.2984 - acc: 0.8977 - 350ms/step
Eval samples: 10000
model.evaluate(val_loader)
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 1/1 - loss: 0.2984 - acc: 0.8977 - 307ms/step
Eval samples: 10000





{'loss': [0.29836994], 'acc': 0.8977}

LSTM implements regression tasks

Dataset acquisition

The data set can be downloaded on the AIStudio platform
. The Boston house price data set includes 506 samples. Each sample includes 12 characteristic variables and the average house price in the area. The house price (unit price) is obviously related to multiple characteristic variables, not univariate linear regression ( Univariate linear regression) problem, select multiple characteristic variables to establish a linear equation, this is the problem of multivariate linear regression (multiple linear regression)

variable meaning
CRIM Urban crime rate per capita
ZN Proportion of residential land over 25,000 square feet
INDUS Proportion of urban non-retail land use (i.e. proportion of land used for industry or agriculture, etc.)
CHAS Charles River dummy variable (1 if the boundary is a river; 0 otherwise)
NOX Nitric oxide concentration (parts per million)
RM Average number of rooms per dwelling
AGE Proportion of owner-occupied homes built before 1940
DIS Weighted distance to the five central areas of Boston (distance to the bustling downtown area, distinguishing suburbs from urban areas)
RAD Freeway Capacity Index (Proximity Index of Radial Roads)
TAX Full property tax rate per $10,000
PTRATIO Urban teacher-student ratio by town
B 1000(Bk-0.63)^2 where Bk is the proportion of blacks in the town
LSTAT Percentage of underprivileged population
MEDV Median value of owner-occupied homes (in thousands of dollars)
import pandas as pd
paddle.seed(7)

data_frame = pd.read_csv('./housing.csv', header=None)
all_data = []

for column in range(len(data_frame)):
    column_data = []
    for data in list(data_frame.iloc[column])[0].split(' '):
        if data != '':
            column_data.append(float(data))
    all_data.append(column_data)

all_data = np.array(all_data)
x_data = all_data[:, :13]
y_data = all_data[:, 13]
print('x_data:\n', x_data, '\n x_data shape:', x_data.shape,
      '\ny_data:\n', y_data, '\n y_data shape:', y_data.shape)
x_data:
 [[6.3200e-03 1.8000e+01 2.3100e+00 ... 1.5300e+01 3.9690e+02 4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 ... 1.7800e+01 3.9690e+02 9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 ... 1.7800e+01 3.9283e+02 4.0300e+00]
 ...
 [6.0760e-02 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9690e+02 5.6400e+00]
 [1.0959e-01 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9345e+02 6.4800e+00]
 [4.7410e-02 0.0000e+00 1.1930e+01 ... 2.1000e+01 3.9690e+02 7.8800e+00]] 
 x_data shape: (506, 13) 
y_data:
 [24.  21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 15.  18.9 21.7 20.4
 18.2 19.9 23.1 17.5 20.2 18.2 13.6 19.6 15.2 14.5 15.6 13.9 16.6 14.8
 18.4 21.  12.7 14.5 13.2 13.1 13.5 18.9 20.  21.  24.7 30.8 34.9 26.6
 25.3 24.7 21.2 19.3 20.  16.6 14.4 19.4 19.7 20.5 25.  23.4 18.9 35.4
 24.7 31.6 23.3 19.6 18.7 16.  22.2 25.  33.  23.5 19.4 22.  17.4 20.9
 24.2 21.7 22.8 23.4 24.1 21.4 20.  20.8 21.2 20.3 28.  23.9 24.8 22.9
 23.9 26.6 22.5 22.2 23.6 28.7 22.6 22.  22.9 25.  20.6 28.4 21.4 38.7
 43.8 33.2 27.5 26.5 18.6 19.3 20.1 19.5 19.5 20.4 19.8 19.4 21.7 22.8
 18.8 18.7 18.5 18.3 21.2 19.2 20.4 19.3 22.  20.3 20.5 17.3 18.8 21.4
 15.7 16.2 18.  14.3 19.2 19.6 23.  18.4 15.6 18.1 17.4 17.1 13.3 17.8
 14.  14.4 13.4 15.6 11.8 13.8 15.6 14.6 17.8 15.4 21.5 19.6 15.3 19.4
 17.  15.6 13.1 41.3 24.3 23.3 27.  50.  50.  50.  22.7 25.  50.  23.8
 23.8 22.3 17.4 19.1 23.1 23.6 22.6 29.4 23.2 24.6 29.9 37.2 39.8 36.2
 37.9 32.5 26.4 29.6 50.  32.  29.8 34.9 37.  30.5 36.4 31.1 29.1 50.
 33.3 30.3 34.6 34.9 32.9 24.1 42.3 48.5 50.  22.6 24.4 22.5 24.4 20.
 21.7 19.3 22.4 28.1 23.7 25.  23.3 28.7 21.5 23.  26.7 21.7 27.5 30.1
 44.8 50.  37.6 31.6 46.7 31.5 24.3 31.7 41.7 48.3 29.  24.  25.1 31.5
 23.7 23.3 22.  20.1 22.2 23.7 17.6 18.5 24.3 20.5 24.5 26.2 24.4 24.8
 29.6 42.8 21.9 20.9 44.  50.  36.  30.1 33.8 43.1 48.8 31.  36.5 22.8
 30.7 50.  43.5 20.7 21.1 25.2 24.4 35.2 32.4 32.  33.2 33.1 29.1 35.1
 45.4 35.4 46.  50.  32.2 22.  20.1 23.2 22.3 24.8 28.5 37.3 27.9 23.9
 21.7 28.6 27.1 20.3 22.5 29.  24.8 22.  26.4 33.1 36.1 28.4 33.4 28.2
 22.8 20.3 16.1 22.1 19.4 21.6 23.8 16.2 17.8 19.8 23.1 21.  23.8 23.1
 20.4 18.5 25.  24.6 23.  22.2 19.3 22.6 19.8 17.1 19.4 22.2 20.7 21.1
 19.5 18.5 20.6 19.  18.7 32.7 16.5 23.9 31.2 17.5 17.2 23.1 24.5 26.6
 22.9 24.1 18.6 30.1 18.2 20.6 17.8 21.7 22.7 22.6 25.  19.9 20.8 16.8
 21.9 27.5 21.9 23.1 50.  50.  50.  50.  50.  13.8 13.8 15.  13.9 13.3
 13.1 10.2 10.4 10.9 11.3 12.3  8.8  7.2 10.5  7.4 10.2 11.5 15.1 23.2
  9.7 13.8 12.7 13.1 12.5  8.5  5.   6.3  5.6  7.2 12.1  8.3  8.5  5.
 11.9 27.9 17.2 27.5 15.  17.2 17.9 16.3  7.   7.2  7.5 10.4  8.8  8.4
 16.7 14.2 20.8 13.4 11.7  8.3 10.2 10.9 11.   9.5 14.5 14.1 16.1 14.3
 11.7 13.4  9.6  8.7  8.4 12.8 10.5 17.1 18.4 15.4 10.8 11.8 14.9 12.6
 14.1 13.  13.4 15.2 16.1 17.8 14.9 14.1 12.7 13.5 14.9 20.  16.4 17.7
 19.5 20.2 21.4 19.9 19.  19.1 19.1 20.1 19.9 19.6 23.2 29.8 13.8 13.3
 16.7 12.  14.6 21.4 23.  23.7 25.  21.8 20.6 21.2 19.1 20.6 15.2  7.
  8.1 13.6 20.1 21.8 24.5 23.1 19.7 18.3 21.2 17.5 16.8 22.4 20.6 23.9
 22.  11.9] 
 y_data shape: (506,)

Dataset loading

class BreastDataset(Dataset):
    def __init__(self, mode='train'):
        super(BreastDataset, self).__init__()
        self.data = [[x_data[i].reshape(-1, 1).astype('float32'), y_data[i].astype('float32')] for i in range(x_data.shape[0])]

    def __getitem__(self, index):
        data = self.data[index][0]
        label = self.data[index][1]

        return data, label

    def __len__(self):
        return len(self.data)
train_loader = paddle.io.DataLoader(BreastDataset(mode='train'), batch_size=100, shuffle=True)

modeling training

class BreastRNN(nn.Layer):
    def __init__(self):
        super(BreastRNN, self).__init__()

        self.rnn = nn.LSTM(
            input_size=1,
            hidden_size=64,
            num_layers=1,
        )
        self.out = nn.Linear(64, 1)

    def forward(self, x):
        r_out, (h_n, h_c) = self.rnn(x, None)
        out = self.out(r_out[:, -1, :])
        
        return out
paddle.summary(BreastRNN(), (1, 13, 1))
----------------------------------------------------------------------------------------------
 Layer (type)       Input Shape                   Output Shape                   Param #    
==============================================================================================
    LSTM-1       [[1, 13, 1], None]  [[1, 13, 64], [[1, 1, 64], [1, 1, 64]]]     17,152     
   Linear-1          [[1, 64]]                       [1, 1]                        65       
==============================================================================================
Total params: 17,217
Trainable params: 17,217
Non-trainable params: 0
----------------------------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.04
Params size (MB): 0.07
Estimated Total Size (MB): 0.10
----------------------------------------------------------------------------------------------






{'total_params': 17217, 'trainable_params': 17217}
epochs = 20
batch_size = 32
model = paddle.Model(BreastRNN())

model.prepare(optimizer=paddle.optimizer.Adam(learning_rate=0.005, parameters=model.parameters()),
              loss=paddle.nn.MSELoss())

model.fit(train_loader,
          epochs=epochs,
          batch_size=batch_size,
          verbose=1)
The loss value printed in the log is the current step, and the metric is the average value of previous step.
Epoch 1/20
step 6/6 [==============================] - loss: 846.5749 - 12ms/step
Epoch 2/20
step 6/6 [==============================] - loss: 464.9476 - 8ms/step
Epoch 3/20
step 6/6 [==============================] - loss: 152.8017 - 9ms/step
Epoch 4/20
step 6/6 [==============================] - loss: 322.6063 - 8ms/step
Epoch 5/20
step 6/6 [==============================] - loss: 77.3828 - 8ms/step
Epoch 6/20
step 6/6 [==============================] - loss: 51.7485 - 9ms/step
Epoch 7/20
step 6/6 [==============================] - loss: 247.1716 - 9ms/step
Epoch 8/20
step 6/6 [==============================] - loss: 66.1677 - 12ms/step
Epoch 9/20
step 6/6 [==============================] - loss: 19.2254 - 8ms/step
Epoch 10/20
step 6/6 [==============================] - loss: 55.7542 - 10ms/step
Epoch 11/20
step 6/6 [==============================] - loss: 103.3308 - 10ms/step
Epoch 12/20
step 6/6 [==============================] - loss: 166.6900 - 17ms/step
Epoch 13/20
step 6/6 [==============================] - loss: 62.8693 - 13ms/step
Epoch 14/20
step 6/6 [==============================] - loss: 141.1141 - 12ms/step
Epoch 15/20
step 6/6 [==============================] - loss: 58.6999 - 8ms/step
Epoch 16/20
step 6/6 [==============================] - loss: 109.8835 - 7ms/step
Epoch 17/20
step 6/6 [==============================] - loss: 50.1934 - 8ms/step
Epoch 18/20
step 6/6 [==============================] - loss: 47.7691 - 10ms/step
Epoch 19/20
step 6/6 [==============================] - loss: 56.6143 - 8ms/step
Epoch 20/20
step 6/6 [==============================] - loss: 51.1868 - 9ms/step

Guess you like

Origin blog.csdn.net/qq_39567427/article/details/112919737