加载imdb数据
修改imdb.py
这里我把imdb数据下载下来,放在keras>datasets文件夹下面,并且需要修改一下imdb.py文件
# path = get_file(path,
# origin='https://s3.amazonaws.com/text-datasets/imdb.npz',
# file_hash='599dadb1135973df5b59232a0e9a887c')
path = r'D:\pythonText\venv\Lib\site-packages\keras\datasets\imdb.npz'
这里把原来使用的path路径注释掉,使用我们用来放置imdb.npz的路径
加载imdb数据
from keras.datasets import imdb
from keras import preprocessing
max_feature = 10000
max_len = 100
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=max_feature)
train_data = preprocessing.sequence.pad_sequences(train_data, maxlen=max_len, truncating='post')
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=max_feature)
代码的意思是加载最常用的max_feature=10000个词,这10000词在接下来中会用于Embedding层,这个层的作用是把10000个词嵌入到高维度中
train_data = preprocessing.sequence.pad_sequences(train_data, maxlen=max_len, truncating='post')
代码的意思是会对train_data的数据截断,只会保留前max_len=100个词,注意 truncating='post'
的含义是截断的位置在后面,即从前开始选取100个词,truncating='pre'
的含义是截断位置在前面,即从最后开始选取100个词,感觉这个地方要反着来理解。
模型搭建
import tensorflow as tf
log_dir = os.path.join("data\logDir")
if not os.path.exists(log_dir):
os.mkdir(log_dir)
callbacks = [
tf.keras.callbacks.TensorBoard(
log_dir=log_dir,
histogram_freq=1,
embeddings_freq=1,
)
]
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Embedding(10000, 8, input_length=max_len))
model.add(tf.keras.layers.GRU(32, dropout=0.2, recurrent_dropout=0.2))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
model.summary()
(一)注意事项
log_dir = os.path.join("data\logDir")
使用TensorBoard的时候,win10平台下一定要用上面代码把路径包起来
这个地方"data\logDir",最好可能也许大概这个文件用mkdir创建一下,我在操作的时候自己创建了这个文件,然后就就会报错
tf.keras
所有的keras前面都要用tf,这是应为要是不用tf.keras的话会存在keras和tf.keras混用的情况,会报错,这里我觉得TensorBoard就是Tensorflow里面的,所以这里调用的keras也是Tensorflow里面的才行,强行理解一波哈哈哈
(二)代码说明
tf.keras.callbacks.TensorBoard( log_dir=log_dir, histogram_freq=1, embeddings_freq=1, )
histogram_freq=1的含义是激活函数直方图,从这个图中可以看出来有没有梯度消失之类的问题,embeddings_freq=1的含义是画出Embeding层
梯度消失
下面这张图片是5层神经网络的激活输出值,激活函数用的是sigmoid
从激活函数的输出值我们可以看出,sigmoid的输出是大多是是0和1,在sigmoid函数中,函数值越接近0和1也就意味这,函数在该点的导数趋近于0,所以在后面的反向求导过程中会使得反向传播没有意义
训练模型
history = model.fit(train_data,
train_labels,
batch_size=128,
epochs=3,
validation_split=0.2,
callbacks=callbacks)
利用TensorBoard查看结果
在命令行输入
tensorboard --logdir=data\logDir
准确率和损失函数
激活函数直方图,还不怎么会看哈哈
Embeding层,用了PCA降维