首页 > 其他分享 >TensorFlow11.3 循环神经网络RNN-情感分类实战

TensorFlow11.3 循环神经网络RNN-情感分类实战

时间:2023-06-25 20:57:26浏览次数:41  
标签:None RNN keras TensorFlow11.3 tf 神经网络 train test 80

这个就是好评和差评的一个分类。
这个输入一般\(h_0\)全为0.
image
要想实现这个结构有两种方案:
SimpleRNNCell(这个更接近原理)

  • single layer
  • multi-layers

RNNCell(这个方便使用)

1.加载数据

(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=1000)#
参数(num_words=10000)将数据限定为前10000个最常出现的单词,如果数据集中存在大于10000的单词,则令其为2。
要证明演示num_words=10000的作用,我找到了train_data中第1125条数据的第200个单词的单词编号为10003
print(train_data[1225][195:205])
输出1:[190, 2636, 8, 268, 1648, 10003, 3027, 24, 4, 294]
输出2:[190, 2636, 8, 268, 1648, 2, 3027, 24, 4, 294]

keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len)
这个函数就是把你个句子长度限制到80,如果小于80这补充0,大于这截断。

db_train = db_train.shuffle(1000).batch(batchsz, drop_remainder=True)
这里的drop_remainder=True的话就是最后那个不足128的batch就丢弃掉

import  os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

import  tensorflow as tf
import  numpy as np
from    tensorflow import keras
from    tensorflow.keras import layers


tf.random.set_seed(22)
np.random.seed(22) 
assert tf.__version__.startswith('2.')

batchsz = 128

# the most frequest words
total_words = 10000
max_review_len = 80
embedding_len = 100
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=total_words)#
# x_train:[b, 80]
# x_test: [b, 80]
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len) #这里就是强行将句子变成80长度,小于80的补0,大于的截取
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=max_review_len)

db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
db_train = db_train.shuffle(1000).batch(batchsz, drop_remainder=True)#就是最后那个不足128的batch就丢弃掉
db_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
db_test = db_test.batch(batchsz, drop_remainder=True)
print('x_train shape:', x_train.shape, tf.reduce_max(y_train), tf.reduce_min(y_train))
print('x_test shape:', x_test.shape)

image
我们发现这个地方y=1的时候是好评,y=0的时候是差评。

2 单层RNN-cell的建立

tf.keras.layers.SimpleRNN(
units,#正整数,输出空间的维数
activation='tanh',#激活函数
use_bias=True,
kernel_initializer='glorot_uniform',
recurrent_initializer='orthogonal',
bias_initializer='zeros',
kernel_regularizer=None,
recurrent_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
recurrent_constraint=None,
bias_constraint=None,
dropout=0.0,# dropout层的比例
recurrent_dropout=0.0,
return_sequences=False,#布尔值。是否返回输出序列中的最后一个输出或完整序列。默认值:False.
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,#布尔值(默认 False)。如果为 True,则网络将展开,否则将使用符号循环。展开可以加速 RNN,尽管它往往更需要内存。展开仅适用于短序列。
**kwargs
)

image
这是官网上的参数

然后还有一个全连接层的:

tf.keras.layers.Dense(
units,#正整数,输出空间的维数
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)

image

tf.keras.layers.Embedding(
input_dim,
output_dim,
embeddings_initializer='uniform',
embeddings_regularizer=None,
activity_regularizer=None,
embeddings_constraint=None,
mask_zero=False,
input_length=None,
sparse=False,
**kwargs
)

image

class MyRNN(keras.Model):

    def __init__(self, units):
        super(MyRNN, self).__init__()


        # transform text to embedding representation
        # [b, 80] => [b, 80, 100]
        self.embedding = layers.Embedding(total_words, embedding_len,
                                          input_length=max_review_len)

        # [b, 80, 100] , h_dim: 64
        self.rnn = keras.Sequential([
            layers.SimpleRNN(units, dropout=0.5, return_sequences=True, unroll=True),
            layers.SimpleRNN(units, dropout=0.5, unroll=True)
        ])


        # fc, [b, 80, 100] => [b, 64] => [b, 1]
        self.outlayer = layers.Dense(1)# 全连接层

    def call(self, inputs, training=None):
        """
        net(x) net(x, training=True) :train mode
        net(x, training=False): test
        :param inputs: [b, 80]
        :param training:
        :return:
        """
        # [b, 80]
        x = inputs
        # embedding: [b, 80] => [b, 80, 100]
        x = self.embedding(x)
        # rnn cell compute
        # x: [b, 80, 100] => [b, 64]
        x = self.rnn(x,training=training)

        # out: [b, 64] => [b, 1]
        x = self.outlayer(x)
        # p(y is pos|x)
        prob = tf.sigmoid(x)

        return prob

def main():
    units = 64
    epochs = 4

    model = MyRNN(units)
    # model.build(input_shape=(4,80))
    # model.summary()
    model.compile(optimizer = keras.optimizers.Adam(0.001),
                  loss = tf.losses.BinaryCrossentropy(),
                  metrics=['accuracy'])
    model.fit(db_train, epochs=epochs, validation_data=db_test)

    model.evaluate(db_test)


if __name__ == '__main__':
    main()

标签:None,RNN,keras,TensorFlow11.3,tf,神经网络,train,test,80
From: https://www.cnblogs.com/lipu123/p/17503057.html

相关文章

  • 深入理解神经网络之逻辑回归
    本文摘自《深入理解神经网络:从逻辑回归到CNN》......
  • TensorFlow11.2 循环神经网络RNN-循环神经网络、RNN-layer实现
    循环神经网络SentimentAnalysis(情感分析)类似于淘宝的好评还是差评,我们比较直观的一个方法就是:这里不好的是:Downsides:1.Longsentence100+wordstoomuchparameters[w,b]。就是比如说我们有100个单词,会产生很多个w,b,参数太多了。2.Nocontextinformation(没有语......
  • TensorFlow11.1 循环神经网络RNN01-序列表达方法
    在自然界中除了位置相关的信息(图片)以外,还用一种存在非常广泛的类型,就是时间轴上的数据,比如说序列信号,语音信号,聊天文字。就是有先后顺序。对于下面这个:不如说我们输入有10个句子,每个句子都有4个单词,然后我们怎么把这些句子转化为具体的数值呢。如果一个表示方法能够很好的表示这......
  • TensorFlow10.4 卷积神经网络-ResNet与DenseNet及ResNet实战
    1ResNet我们是实验发现在我们堆叠更多的网络结构的时候,我们并不能又一个很好的结果,就是它网络层次变多了之后他会产生一个多层的loss的堆叠,使得梯度爆炸,或者梯度弥散。然后我们想了一个办法,就是我们比如说设置了一个30层的神经网络,我们在差也不能比22层的差。就是我们设置了一......
  • 深度卷积神经网络(AlexNet)
    1.AlexNet\(2012\)年,\(AlexNet\)横空出世。使用\(8\)层卷积神经网络,赢得\(ImageNet\2012\)图像识别挑战赛。\(AlexNet\) 网络结构:1.1第一个卷积层卷积运算:原始数据为\(227\times227\times3\)的图像。卷积核尺寸\(11\times11\times3\),步长\(4\),每次......
  • U-Net: 专注生物医学分割的卷积神经网络(翻译)
    原文链接:https://arxiv.org/pdf/1505.04597.pdf摘要:普遍认为,优秀的深度神经网络离不开数千个标注训练样本。在本文中,我们提出了一种网络和训练策略:该策略通过使用大量数据增强,从而充分利用带标注的训练样本;该网络结构包括了用于捕获上下文的收缩路径和用于实现精确定位的对称扩......
  • TensorFlow10.4 卷积神经网络-batchnorm
    我们发现这个sigmoid函数在小于-4或者大于4的时候他的导数趋近于0。然后我们送进去的input的值在[-100,100]之间,这样很容易引起梯度弥散的现象。所以我们一般情况下使用ReLU函数,但是我们有时候又不得不使用sigmoid函数。这个时候我们在送到下一层的时候我们应该先经过Normalizatio......
  • TensorFlow10.3 卷积神经网络-经典卷积网络(VGG,GoogLeNet)
    LeNet-5这个是5层的,3个c+s,然后有两个全连接层。AlexNet这里有8(5+3)层。就是之前的技术没有现在的好,所以它用了两块GTX580,然后让你它的模型分成两块,然后在两块显卡中跑。很好的把显存给分开来了。VGG之前都是用\(11*11\)的窗口,然后它用了\(3*3\)的窗口,这个\(3*3\)的窗......
  • 【tensorflow】连续输入+离散输入的神经网络模型训练代码
    【tensorflow】连续输入+离散输入的神经网络模型训练代码离散输入的转化问题构造词典创建离散数据、转化字典索引、创建连续数据创建离散输入+连续输入模型训练输出全部代码-复制即用  查看本系列三种模型写法:  【tensorflow】连续输入的线性回归模型训练代码 ......
  • TensorFlow10.2 卷积神经网络-CIFAR100 实战
    ▪Loaddatasets▪BuildNetwork▪Train▪Test这里先是进行卷积然后再进行全连接Loaddatasetsdefpreprocess(x,y):#[0~1]x=tf.cast(x,dtype=tf.float32)/255.y=tf.cast(y,dtype=tf.int32)returnx,y(x,y),(x_test,y_test)=dat......