赞
踩
- from tensorflow.keras.layers import Dense, Flatten, Input
- from keras.layers.embeddings import Embedding
- from tensorflow.keras.models import Model
- from tensorflow.keras.preprocessing.sequence import pad_sequences
- from tensorflow.keras.preprocessing.text import one_hot
- import numpy as np
-
- def pre():
- docs = ['Well done!',
- 'Good work',
- 'Great effort',
- 'nice work',
- 'Excellent!',
- 'Weak',
- 'Poor effort!',
- 'not good',
- 'poor work',
- 'Could have done better.']
- # 1表示正面评价,0表示负面评价
- labels = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
- # one - hot对其进行encode
- vocab_size = 50 # 将词汇表大小设置为50,大大减少了hash函数的冲突概率
- encoded_docs = [one_hot(d, vocab_size) for d in docs] # one-hot编码到[1,n],不包括0
- print('encoded_docs: ', encoded_docs)
- # 我们用padding对编码进行填充,保证它们的长度一致,这里将长度设置为4。
- max_length = 4
- # padding填充到最大的词汇长度(此处为4),用0向后填充(post)
- padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post') #序列预处理和序列填充
- print('padded_docs: ', padded_docs)
-
- return padded_docs,labels
-
- def net():
- vocab_size= 50
- max_length = 4
- input = Input(shape=(4,)) # input为一维数组,里面有4个元素
- # 第一个参数表示input_dim文本数据中词汇的取值可能数
- # 第二个参数表示output_dim嵌入向量空间的大小(为每个单词定义了这个层的输出向量的大小)
- # 第三个参数表示input_length,输入序列的长度(一次输入带有的词汇个数)
- # 嵌入层的输出是4个向量,每个向量8维
- x = Embedding(vocab_size, 8, input_length=max_length)(input) # 这一步参数两为50×8(包含50个词的词汇表、一个8维的向量空间,每个词包含4个词)
- # 将其展平为一个32个元素的向量,以传递给Dense输出层
- x = Flatten()(x) # Embedding层的输出是一个 4×8 矩阵,它被Flatten层压缩为一个 32 元素的向量。
- x = Dense(1, activation='sigmoid')(x)
- model = Model(inputs=input, outputs=x) #使用Keras的另外一种建模方式,不是Sequence
- model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc']) #优化设置
- print(model.summary())
-
- padded_docs,labels=pre()
- # 拟合模型
- model.fit(padded_docs, labels, epochs=100, verbose=0)
- # 评估模型
- loss, accuracy = model.evaluate(padded_docs, labels, verbose=0)
- print('Accuracy: %f %%' % (accuracy * 100))
-
- # test一下经过embedding层之后,模型的拟合能力。
- test = one_hot('good', 50)
- padded_test = pad_sequences([test], maxlen=max_length, padding='post')
- #输入序列test,最大长度是maxlen,padding['pre','post'],post是指后面添加,pre是指前面开始,默认前面,truncating=post从后面开始,truncating=pre表示从头开始
- print(model.predict(padded_test))
这里需要将pad_sqquences这个函数解释一下:
tf.keras.preprocessing.sequence.pad_sequence(
sequences, maxlen=None,dtype='int32', padding='pre'
truncating='pre',value=0.0 )
测试一下:
- from tensorflow.keras.preprocessing.sequence import pad_sequences
-
-
- x = [[3],[5,6],[7,8,9]]
-
- y= pad_sequences(x) #默认输出[3,3] ,不够就补零
- print(y)
-
- y1= pad_sequences(x,maxlen=2) #最大长度是2
- print(y1)
-
-
- y2= pad_sequences(x,padding='post') #从后面向前补零
- print(y2)
-
- y3= pad_sequences(x,padding='pre') #从前向后面补零
- print(y3)
-
- y4= pad_sequences(x,maxlen=2,truncating="post") #从后面向前保留
- print(y4)
-
- y5= pad_sequences(x,maxlen=2,truncating="pre") #从前向后面保留
- print(y5)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。