diff --git a/ShadowEditor.AI/README.md b/ShadowEditor.AI/README.md index 42c26bcf..a246b512 100644 --- a/ShadowEditor.AI/README.md +++ b/ShadowEditor.AI/README.md @@ -35,6 +35,7 @@ pip install tensorflow-gpu==2.0.0-rc0 6. tensorflow/basic_text_classification.py: 评论文本分类,准确度:86.2% 7. tensorflow/feature_columns.py: 对结构化数据进行分类,准确度:72.54% 8. tensorflow/basic_regression.py: 线性回归 +9. tensorflow/overfit_and_underfit.py: 过拟合和欠拟合,准确度:99.99% ## 相关地址 diff --git a/ShadowEditor.AI/tensorflow/overfit_and_underfit.py b/ShadowEditor.AI/tensorflow/overfit_and_underfit.py new file mode 100644 index 00000000..2bdf7fcf --- /dev/null +++ b/ShadowEditor.AI/tensorflow/overfit_and_underfit.py @@ -0,0 +1,151 @@ +from __future__ import absolute_import, division, print_function, unicode_literals + +import tensorflow as tf +from tensorflow import keras + +import numpy as np +import matplotlib.pyplot as plt + +print(tf.__version__) + +NUM_WORDS = 10000 + +(train_data, train_labels), (test_data, + test_labels) = keras.datasets.imdb.load_data(num_words=NUM_WORDS) + + +def multi_hot_sequences(sequences, dimension): + # Create an all-zero matrix of shape (len(sequences), dimension) + results = np.zeros((len(sequences), dimension)) + for i, word_indices in enumerate(sequences): + # set specific indices of results[i] to 1s + results[i, word_indices] = 1.0 + return results + + +train_data = multi_hot_sequences(train_data, dimension=NUM_WORDS) +test_data = multi_hot_sequences(test_data, dimension=NUM_WORDS) + +plt.plot(train_data[0]) + +baseline_model = keras.Sequential([ + # `input_shape` is only required here so that `.summary` works. + keras.layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)), + keras.layers.Dense(16, activation='relu'), + keras.layers.Dense(1, activation='sigmoid') +]) + +baseline_model.compile(optimizer='adam', + loss='binary_crossentropy', + metrics=['accuracy', 'binary_crossentropy']) + +baseline_model.summary() + +baseline_history = baseline_model.fit(train_data, + train_labels, + epochs=20, + batch_size=512, + validation_data=(test_data, test_labels), + verbose=2) + +smaller_model = keras.Sequential([ + keras.layers.Dense(4, activation='relu', input_shape=(NUM_WORDS,)), + keras.layers.Dense(4, activation='relu'), + keras.layers.Dense(1, activation='sigmoid') +]) + +smaller_model.compile(optimizer='adam', + loss='binary_crossentropy', + metrics=['accuracy', 'binary_crossentropy']) + +smaller_model.summary() + +smaller_history = smaller_model.fit(train_data, + train_labels, + epochs=20, + batch_size=512, + validation_data=(test_data, test_labels), + verbose=2) + +bigger_model = keras.models.Sequential([ + keras.layers.Dense(512, activation='relu', input_shape=(NUM_WORDS,)), + keras.layers.Dense(512, activation='relu'), + keras.layers.Dense(1, activation='sigmoid') +]) + +bigger_model.compile(optimizer='adam', + loss='binary_crossentropy', + metrics=['accuracy', 'binary_crossentropy']) + +bigger_model.summary() + +bigger_history = bigger_model.fit(train_data, train_labels, + epochs=20, + batch_size=512, + validation_data=(test_data, test_labels), + verbose=2) + + +def plot_history(histories, key='binary_crossentropy'): + plt.figure(figsize=(16, 10)) + + for name, history in histories: + val = plt.plot(history.epoch, history.history['val_'+key], + '--', label=name.title()+' Val') + plt.plot(history.epoch, history.history[key], color=val[0].get_color(), + label=name.title()+' Train') + + plt.xlabel('Epochs') + plt.ylabel(key.replace('_', ' ').title()) + plt.legend() + + plt.xlim([0, max(history.epoch)]) + + +plot_history([('baseline', baseline_history), + ('smaller', smaller_history), + ('bigger', bigger_history)]) + + +l2_model = keras.models.Sequential([ + keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001), + activation='relu', input_shape=(NUM_WORDS,)), + keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001), + activation='relu'), + keras.layers.Dense(1, activation='sigmoid') +]) + +l2_model.compile(optimizer='adam', + loss='binary_crossentropy', + metrics=['accuracy', 'binary_crossentropy']) + +l2_model_history = l2_model.fit(train_data, train_labels, + epochs=20, + batch_size=512, + validation_data=(test_data, test_labels), + verbose=2) + + +plot_history([('baseline', baseline_history), + ('l2', l2_model_history)]) + +dpt_model = keras.models.Sequential([ + keras.layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)), + keras.layers.Dropout(0.5), + keras.layers.Dense(16, activation='relu'), + keras.layers.Dropout(0.5), + keras.layers.Dense(1, activation='sigmoid') +]) + +dpt_model.compile(optimizer='adam', + loss='binary_crossentropy', + metrics=['accuracy', 'binary_crossentropy']) + +dpt_model_history = dpt_model.fit(train_data, train_labels, + epochs=20, + batch_size=512, + validation_data=(test_data, test_labels), + verbose=2) + +plot_history([('baseline', baseline_history), + ('dropout', dpt_model_history)])