初识LSTM——迁移学习小记(四)

一、递归神经网络(RNN)

    传统的神经网络,只是在深度上进行多层连接,层与层之间具有连接,但是在同层的内部节点之间没有任何连接,于是对于处理前后有关的数据显得无能为力。RRN为解决这一问题,在广度上也进行了连接。

  具体的,RNN网络会对前面信息进行记忆,并将其运用在当前输出的计算当中,即隐藏层的输入不仅包含输入层的输出还包含上一时刻隐藏层的输出。下图较为形象的显示了其工作方式:

二、LSTM神经网络

   当遇到预测点与依赖点的相关信息距离比较远的时候就难以学到该相关信息,称为长时依赖问题。为很好解决这一问题,我们想到了LSTM神经网络,它是一种特殊的RNN。

其模块结构图如下:

  处理层各符号的表示的意思为:

LSTM通过一些“门”(输入门、遗忘门、输出门)结构让信息有选择性的影响网络中的每个时刻的状态。这里的所谓门就是sigmoid神经网络和一个按位做乘法的操作。叫做‘门’是因为sigmoid激活函数的全连接神经网络会输出0到1之间的数值,描述当前有多少信息量可以通过这个结构。

遗忘门的作用是让RNN忘记之前没有用的信息。输入们的作用就是根据当前结点输入xt,之前状态c(t-1),上一时刻输出决定当前哪些信息进入到当前的ct。

三、代码样例

# 这里用mnist数据集来简单说明下lstm的搭建
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 首先观察下数据
mnist  = input_data.read_data_sets('MNIST_data/', one_hot=True)
print(mnist.train.images.shape)
# 使用LSTM来实现mnist的分类,将输入28*28的图像每一行看作输入像素序列,行行之间具有时间信息。即step=28
# 设置超参数
#超参数
lr = 0.001
training_inter = 100000
batch_size = 128
# display_step = 10 #

n_input = 28 # w
n_step = 28 # h
n_hidden = 128
n_classes = 10

# placeholder
x = tf.placeholder(tf.float32, [None, n_input, n_step])
y = tf.placeholder(tf.float32, [None, n_classes])

weights = {
    'in': tf.Variable(tf.random_normal([n_input, n_hidden])), # (28, 128)
    'out': tf.Variable(tf.random_normal([n_hidden, n_classes])) # (128, 10)
}
biases = {
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden])),
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes]))
}

def RNN(x, weights, biases):
    # 原始的x是3维,需要将其变为2为的,才能和weight矩阵乘法
    # x=(128, 28, 28) ->> (128*28, 28)
    X = tf.reshape(x, [-1, n_input])
    X_in = tf.matmul(X, weights['in']) + biases['in'] # (128*28, 128)
    X_in = tf.reshape(X_in, [-1, n_step, n_hidden]) # (128, 28, 128)
    # 定义LSTMcell
    lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
    init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
    outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)
    results = tf.matmul(final_state[1], weights['out']) + biases['out']
    return results

pre = RNN(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pre))
train_op = tf.train.AdamOptimizer(lr).minimize(cost)

correct_pred = tf.equal(tf.argmax(pre, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    step = 0
    while step*batch_size < training_inter:
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        batch_xs = batch_xs.reshape([batch_size, n_step, n_input])
        sess.run([train_op], feed_dict={x: batch_xs, y: batch_ys})
        if step % 20 == 0:
            print(sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys}))
        step += 1


结果如下:

 

0.21875
0.6875
0.765625
0.828125
0.875
0.8515625
0.875
0.8671875
0.921875
0.890625
0.8671875
0.921875
0.9296875
0.921875
0.96875
0.9140625
0.96875
0.984375
0.9609375
0.9453125
0.9453125
0.953125
0.9609375
0.9453125
0.96875
0.9453125
0.9609375
0.9609375
0.96875
0.9609375
0.984375
0.9375
0.9609375
0.9609375
0.953125
0.9765625
0.9765625
0.9609375
0.9765625
0.9453125

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中实现LSTM迁移学习的代码示例如下: ```matlab % 加载预训练的LSTM模型 pretrainedModel = 'pretrained_lstm_model.mat'; load(pretrainedModel); % 加载迁移学习数据集 data = load('transfer_learning_data.mat'); XTrain = data.XTrain; YTrain = data.YTrain; XTest = data.XTest; YTest = data.YTest; % 设置迁移学习的参数 numClasses = numel(categories(YTrain)); inputSize = size(XTrain{1}, 1); miniBatchSize = 32; numHiddenUnits = 100; % 创建迁移学习LSTM网络 layers = [ ... sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]; % 设置训练选项 options = trainingOptions('adam', ... 'MaxEpochs', 10, ... 'MiniBatchSize', miniBatchSize, ... 'ValidationData', {XTest, YTest}, ... 'ValidationFrequency', 10, ... 'Verbose', false, ... 'Plots', 'training-progress'); % 进行迁移学习训练 net = trainNetwork(XTrain, YTrain, layers, options); % 评估模型性能 YPred = classify(net, XTest); accuracy = sum(YPred == YTest) / numel(YTest); fprintf('迁移学习模型的准确率: %.2f%%\n', accuracy * 100); ``` 以上代码假设你已经有了预训练的LSTM模型 `pretrained_lstm_model.mat` 和迁移学习的数据集 `transfer_learning_data.mat`。你需要根据自己的实际情况修改数据集的加载代码和训练选项。训练选项中的参数可以根据需要进行调整,例如最大迭代次数、小批量大小等。最后,代码会输出迁移学习模型的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值