简单循环神经网络
import numpy as np
import tensorflow as tf
from tensorflow import keras
print(tf.__version__, np.__version__)
tf.random.set_seed(22)
tf.random.set_seed(22)
gpus = tf.config.experimental.list_physical_devices('gpu')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
total_words = 10000
max_review_len = 80
batch_size = 64
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=total_words)
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len)
x_test = tf.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(batch_size, drop_remainder=True)
db_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
db_test = db_test.batch(batch_size, 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)
embedding_len = 100
class MyRNN(tf.keras.Model):
def __init__(self, units):
super(MyRNN, self).__init__()
self.state0 = [tf.zeros([batch_size, units])]
self.state1 = [tf.zeros([batch_size, units])]
self.embedding = tf.keras.layers.Embedding(total_words,
embedding_len,
input_length=max_review_len)
self.rnn_cell0 = tf.keras.layers.SimpleRNNCell(units=units, dropout=0.5)
self.rnn_cell1 = tf.keras.layers.SimpleRNNCell(units=units, dropout=0.5)
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None, **kwargs):
x = inputs
x = self.embedding(x)
state0 = self.state0
state1 = self.state1
for word in tf.unstack(x, axis=1):
out0, state0 = self.rnn_cell0(word, state0, training)
out1, state1 = self.rnn_cell1(out0, state1, training)
x = self.outlayer(out1)
prob = tf.sigmoid(x)
return prob
def main():
units = 64
epochs = 10
model = MyRNN(units)
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=tf.losses.BinaryCrossentropy(),
metrics=['accuracy'],
experimental_run_tf_function=False)
model.fit(db_train, epochs=epochs, validation_data=db_test)
model.evaluate(db_test)
if __name__ == '__main__':
main()
keras 生成循环神经网络
import numpy as np
import tensorflow as tf
from tensorflow import keras
print(tf.__version__, np.__version__)
tf.random.set_seed(22)
tf.random.set_seed(22)
gpus = tf.config.experimental.list_physical_devices('gpu')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
total_words = 10000
max_review_len = 80
batch_size = 64
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=total_words)
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=max_review_len)
x_test = tf.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(batch_size, drop_remainder=True)
db_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
db_test = db_test.batch(batch_size, 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)
embedding_len = 100
class MyRNN(tf.keras.Model):
def __init__(self, units):
super(MyRNN, self).__init__()
self.embedding = tf.keras.layers.Embedding(total_words,
embedding_len,
input_length=max_review_len)
self.rnn = keras.Sequential([
tf.keras.layers.SimpleRNN(units, dropout=0.5, return_sequences=True, unroll=True),
tf.keras.layers.SimpleRNN(units, dropout=0.5, unroll=True)
])
self.outlayer = tf.keras.layers.Dense(1)
def call(self, inputs, training=None, **kwargs):
x = inputs
x = self.embedding(x)
x = self.rnn(x)
x = self.outlayer(x)
prob = tf.sigmoid(x)
return prob
def main():
units = 64
epochs = 10
model = MyRNN(units)
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=tf.losses.BinaryCrossentropy(),
metrics=['accuracy'],
experimental_run_tf_function=False)
model.fit(db_train, epochs=epochs, validation_data=db_test)
model.evaluate(db_test)
if __name__ == '__main__':
main()