Tensorflow技术点整理
我们用tensorflow2来看一个服饰数据集的识别。
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers if __name__ == "__main__": fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] print(x_valid.shape, y_valid.shape) print(x_train.shape, y_train.shape) print(x_test.shape, y_test.shape) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() show_single_image(x_train[1])
运行结果
(5000, 28, 28) (5000,) (55000, 28, 28) (55000,) (10000, 28, 28) (10000,)
这里我们可以看到,这些图像数据集都是28*28的单通道图片。我们将这些数据集分成了55000个训练数据集,5000个验证数据集以及10000个测试数据集。现在我们再来看一下这些数据集的分类类型
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers if __name__ == "__main__": fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] show_imgs(3, 5, x_train, y_train, class_names)
运行结果
这里我们可以看到这些服饰总共有10种类型。现在我们就使用神经网络来对这些数据进行训练和验证
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # show_imgs(3, 5, x_train, y_train, class_names) model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation='relu'), keras.layers.Dense(100, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) # 使用交叉熵损失函数,随机梯度下降法进行训练 # 这里需要说明的是如果是categorical_crossentropy # 则需要将标签数据集进行one_hot处理,如果是sparse_categorical_crossentropy, # 则不需要 model.compile(loss=tf.losses.sparse_categorical_crossentropy, optimizer=optimizers.SGD(learning_rate=0.001), metrics=['accuracy']) history = model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid)) print(model.summary()) print(history.history) def plot_learning_curves(history): pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Train on 55000 samples, validate on 5000 samples Epoch 1/10 55000/55000 [==============================] - 6s 107us/sample - loss: 2.2443 - accuracy: 0.7192 - val_loss: 0.6124 - val_accuracy: 0.7928 Epoch 2/10 55000/55000 [==============================] - 5s 95us/sample - loss: 0.5678 - accuracy: 0.7980 - val_loss: 0.5467 - val_accuracy: 0.8018 Epoch 3/10 55000/55000 [==============================] - 5s 92us/sample - loss: 0.4991 - accuracy: 0.8188 - val_loss: 0.4968 - val_accuracy: 0.8358 Epoch 4/10 55000/55000 [==============================] - 5s 97us/sample - loss: 0.4646 - accuracy: 0.8316 - val_loss: 0.4910 - val_accuracy: 0.8332 Epoch 5/10 55000/55000 [==============================] - 7s 119us/sample - loss: 0.4371 - accuracy: 0.8393 - val_loss: 0.4768 - val_accuracy: 0.8374 Epoch 6/10 55000/55000 [==============================] - 7s 123us/sample - loss: 0.4211 - accuracy: 0.8455 - val_loss: 0.4608 - val_accuracy: 0.8444 Epoch 7/10 55000/55000 [==============================] - 6s 103us/sample - loss: 0.4046 - accuracy: 0.8504 - val_loss: 0.4506 - val_accuracy: 0.8464 Epoch 8/10 55000/55000 [==============================] - 5s 97us/sample - loss: 0.3902 - accuracy: 0.8550 - val_loss: 0.4427 - val_accuracy: 0.8480 Epoch 9/10 55000/55000 [==============================] - 5s 97us/sample - loss: 0.3796 - accuracy: 0.8581 - val_loss: 0.4814 - val_accuracy: 0.8312 Epoch 10/10 55000/55000 [==============================] - 5s 99us/sample - loss: 0.3714 - accuracy: 0.8608 - val_loss: 0.4665 - val_accuracy: 0.8440 Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 300) 235500 _________________________________________________________________ dense_1 (Dense) (None, 100) 30100 _________________________________________________________________ dense_2 (Dense) (None, 10) 1010 ================================================================= Total params: 266,610 Trainable params: 266,610 Non-trainable params: 0 _________________________________________________________________ None {'loss': [2.2442730520161716, 0.5677844335772775, 0.49907195046598263, 0.46455069565122775, 0.43706936968456617, 0.4210625493981621, 0.4045901944290508, 0.3901773897236044, 0.3795636681730097, 0.37135513420971955], 'accuracy': [0.71916366, 0.7979818, 0.8187636, 0.83156365, 0.8393091, 0.84549093, 0.8503636, 0.8550182, 0.8580545, 0.8608364], 'val_loss': [0.6123501856803895, 0.5466709545612335, 0.4968059474229813, 0.49100303683280944, 0.4768493502855301, 0.46080493590831756, 0.4505628205776215, 0.44266556935310364, 0.4814212405562401, 0.4664571787118912], 'val_accuracy': [0.7928, 0.8018, 0.8358, 0.8332, 0.8374, 0.8444, 0.8464, 0.848, 0.8312, 0.844]}
这里我们使用了三个全连接层来构建神经网络,对验证数据集的准确率达到了85.92%。这里我们使用的是随机梯度下降法,关于随机梯度下降法的内容请参考机器学习算法整理 中的随机梯度下降法。下面这个报告是告诉我们在神经网络中每一个全连接层的维度以及参数量。由于我们的图像是28*28,所以扁平化处理后是28*28=784个维度。经过全连接层之后,我们要把第一个全连接层的输出变成样本数*300个维度的矩阵,我们需要将矩阵[样本数,784]•[784, 300]的矩阵W(有关矩阵乘法的内容请参考线性代数整理 中矩阵和矩阵的乘法),一般我们会加上一个b,就是一个长度为300的向量。这样就得到了一个[样本数, 300]的输出矩阵。而参数量就等于784*300+300=235500。同理,第二个全连接层的输出为样本数*100的矩阵,我们需要将第一层的输出矩阵[样本数, 300]•[300, 100]+b,就得到[样本数, 100]的输出,参数量即为300*100+100=30100。而图中也显示出损失函数值是在稳固下降的,而识别准确率是在稳固上升的。现在我们来给训练数据加上归一化处理。我们先来看一下归一化前后训练数据集的最大值和最小值
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os from sklearn.preprocessing import StandardScaler if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) print(np.max(x_train), np.min(x_train)) scaler = StandardScaler() # 归一化过程中,需要将三维图片数据转成二维数据[None, 28, 28] -> [None, 784] # 归一化结束之后再转回三维图片数据,这里fit_transform会记录训练数据集的均值和方差 x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # 这里验证数据集会采用训练数据集的均值和方差 x_valid = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) x_test = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) print(np.max(x_train), np.min(x_train))
运行结果
255 0 2.0231433 -0.8105136
这里我们可以看到,训练数据集归一化前后它们的最大值最小值是不同的。
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os from sklearn.preprocessing import StandardScaler if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) # print(np.max(x_train), np.min(x_train)) scaler = StandardScaler() # 归一化过程中,需要将三维图片数据转成二维数据[None, 28, 28] -> [None, 784] # 归一化结束之后再转回三维图片数据,这里fit_transform会记录训练数据集的均值和方差 x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # 这里验证数据集会采用训练数据集的均值和方差 x_valid = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) x_test = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # print(np.max(x_train), np.min(x_train)) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # show_imgs(3, 5, x_train, y_train, class_names) model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation='relu'), keras.layers.Dense(100, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) # 使用交叉熵损失函数,随机梯度下降法进行训练 # 这里需要说明的是如果是categorical_crossentropy # 则需要将标签数据集进行one_hot处理,如果是sparse_categorical_crossentropy, # 则不需要 model.compile(loss=tf.losses.sparse_categorical_crossentropy, optimizer=optimizers.SGD(learning_rate=0.001), metrics=['accuracy']) history = model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid)) print(model.evaluate(x_test, y_test)) print(model.summary()) print(history.history) def plot_learning_curves(history): pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Train on 55000 samples, validate on 5000 samples Epoch 1/10 55000/55000 [==============================] - 5s 95us/sample - loss: 0.9122 - accuracy: 0.7003 - val_loss: 0.6157 - val_accuracy: 0.7920 Epoch 2/10 55000/55000 [==============================] - 5s 83us/sample - loss: 0.5771 - accuracy: 0.8010 - val_loss: 0.5165 - val_accuracy: 0.8182 Epoch 3/10 55000/55000 [==============================] - 6s 104us/sample - loss: 0.5075 - accuracy: 0.8235 - val_loss: 0.4732 - val_accuracy: 0.8378 Epoch 4/10 55000/55000 [==============================] - 7s 127us/sample - loss: 0.4716 - accuracy: 0.8343 - val_loss: 0.4473 - val_accuracy: 0.8480 Epoch 5/10 55000/55000 [==============================] - 6s 117us/sample - loss: 0.4477 - accuracy: 0.8421 - val_loss: 0.4323 - val_accuracy: 0.8530 Epoch 6/10 55000/55000 [==============================] - 6s 110us/sample - loss: 0.4306 - accuracy: 0.8483 - val_loss: 0.4175 - val_accuracy: 0.8580 Epoch 7/10 55000/55000 [==============================] - 5s 90us/sample - loss: 0.4167 - accuracy: 0.8521 - val_loss: 0.4101 - val_accuracy: 0.8564 Epoch 8/10 55000/55000 [==============================] - 5s 90us/sample - loss: 0.4059 - accuracy: 0.8562 - val_loss: 0.4022 - val_accuracy: 0.8626 Epoch 9/10 55000/55000 [==============================] - 5s 92us/sample - loss: 0.3964 - accuracy: 0.8599 - val_loss: 0.3944 - val_accuracy: 0.8634 Epoch 10/10 55000/55000 [==============================] - 5s 93us/sample - loss: 0.3880 - accuracy: 0.8630 - val_loss: 0.3889 - val_accuracy: 0.8606 10000/1 ==============================================] - 1s 51us/sample - loss: 0.2991 - accuracy: 0.8472 [0.43079993045330045, 0.8472] Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 300) 235500 _________________________________________________________________ dense_1 (Dense) (None, 100) 30100 _________________________________________________________________ dense_2 (Dense) (None, 10) 1010 ================================================================= Total params: 266,610 Trainable params: 266,610 Non-trainable params: 0 _________________________________________________________________ None {'loss': [0.912204550890489, 0.5771390253067017, 0.507524390927228, 0.4716112705404108, 0.4477458443338221, 0.4306134765581651, 0.416733508162065, 0.4059152506828308, 0.3963754140810533, 0.38801397878473454], 'accuracy': [0.70034546, 0.801, 0.82345456, 0.8343091, 0.84214544, 0.84827274, 0.85214543, 0.85623634, 0.8598727, 0.8629818], 'val_loss': [0.615698953294754, 0.516535887670517, 0.47322214045524597, 0.4472690547943115, 0.43233813087940215, 0.41751169788837433, 0.41005783474445345, 0.40220267939567567, 0.3943846334218979, 0.38885269825458524], 'val_accuracy': [0.792, 0.8182, 0.8378, 0.848, 0.853, 0.858, 0.8564, 0.8626, 0.8634, 0.8606]}
这里我们对测试数据集进行了测试,它的分类准确率达到了84.72%。
回调函数
回调函数是当我们在训练模型的时候,中间可能要做一些事情。比如说模型训练中,当损失函数值loss不再下降的时候,我们可以提前停止训练。又比如在训练的过程中,每隔段时间把模型参数给保存下来。又或者在模型训练过程中,就对一些模型指标进行图形化输出等等。
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os from sklearn.preprocessing import StandardScaler if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) # print(np.max(x_train), np.min(x_train)) scaler = StandardScaler() # 归一化过程中,需要将三维图片数据转成二维数据[None, 28, 28] -> [None, 784] # 归一化结束之后再转回三维图片数据,这里fit_transform会记录训练数据集的均值和方差 x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # 这里验证数据集会采用训练数据集的均值和方差 x_valid = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) x_test = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # print(np.max(x_train), np.min(x_train)) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # show_imgs(3, 5, x_train, y_train, class_names) model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation='relu'), keras.layers.Dense(100, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) # 使用交叉熵损失函数,随机梯度下降法进行训练 # 这里需要说明的是如果是categorical_crossentropy # 则需要将标签数据集进行one_hot处理,如果是sparse_categorical_crossentropy, # 则不需要 model.compile(loss=tf.losses.sparse_categorical_crossentropy, optimizer=optimizers.SGD(learning_rate=0.001), metrics=['accuracy']) # 我们这里使用三个回调函数Tensorboard, earlystopping, ModelCheckpoint logdir = "./callbacks" if not os.path.exists(logdir): os.mkdir(logdir) output_model_file = os.path.join(logdir, "fashion_mnist_model.h5") callbacks = [ # TensorBoard可以保存我们在训练中的指标,比如损失函数值以及识别准确率 keras.callbacks.TensorBoard(logdir), # ModelCheckpoint是保存模型参数 keras.callbacks.ModelCheckpoint(output_model_file, save_best_only=True), # EarlyStopping是提前终止训练 keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3) ] history = model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid), callbacks=callbacks) print(model.evaluate(x_test, y_test)) print(model.summary()) # print(history.history) # def plot_learning_curves(history): # pd.DataFrame(history.history).plot(figsize=(8, 5)) # plt.grid(True) # plt.gca().set_ylim(0, 1) # plt.show() # # plot_learning_curves(history)
当我们训练完成之后,可以到callbacks上一层文件夹中,展开callbacks文件夹,我们可以看到这样一些文件
在callbacks上一层文件夹中输入命令
(base) -bash-3.2$ tensorboard --logdir=callbacks
会得到这样一些输出
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all TensorBoard 2.0.0 at http://localhost:6006/ (Press CTRL+C to quit)
此时打开浏览器访问http://localhost:6006,会看到我们训练中的指标数据图
以及神经网络的层级图
而EarlyStopping的参数意义如下:
- min_delta:增大或减小的阈值,只有大于这个部分才算作improvement(改善)。这个值的大小取决于monitor,也反映了你的容忍程度。例如monitor(监控)是’acc’,同时其变化范围在70%-90%之间,所以对于小于0.01%的变化不关心。加上观察到训练过程中存在抖动的情况(即先下降后上升),所以适当增大容忍程度,最终设为0.001%。
- patience:能够容忍多少个epoch内都没有improvement。这个设置其实是在抖动和真正的准确率下降之间做tradeoff(权衡)。如果patience设的大,那么最终得到的准确率要略低于模型可以达到的最高准确率。如果patience设的小,那么模型很可能在前期抖动,还在全图搜索的阶段就停止了,准确率一般很差。patience的大小和learning rate直接相关。在learning rate设定的情况下,前期先训练几次观察抖动的epoch number,比其稍大些设置patience。在learning rate变化的情况下,建议要略小于最大的抖动epoch number。笔者在引入EarlyStopping之前就已经得到可以接受的结果了,EarlyStopping算是锦上添花,所以patience设的比较高,设为抖动epoch number的最大值。
- min_delta和patience都和“避免模型停止在抖动过程中”有关系,所以调节的时候需要互相协调。通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦然。
归一化与批归一化
- 归一化
- Min-max归一化:x*=(x-min)/(max-min)
- Z-score归一化:x*=(x-μ)/δ,这里μ表示均值,δ表示方差,是我们经常使用的归一化
- 批归一化
批归一化是指把归一化这种思路从输入数据上给扩展到网络的每层的激活值上,每层的激活值都做归一化。我们知道对于神经网络来说是一种层级结构,每一层的输出就是下一层的输入,我们在每一层的输入上都去做归一化,那么就会使得整个的网络的效果会更好。
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os from sklearn.preprocessing import StandardScaler if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) # print(np.max(x_train), np.min(x_train)) scaler = StandardScaler() # 归一化过程中,需要将三维图片数据转成二维数据[None, 28, 28] -> [None, 784] # 归一化结束之后再转回三维图片数据,这里fit_transform会记录训练数据集的均值和方差 x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # 这里验证数据集会采用训练数据集的均值和方差 x_valid = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) x_test = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # print(np.max(x_train), np.min(x_train)) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # show_imgs(3, 5, x_train, y_train, class_names) model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation='relu'), # 批归一化 keras.layers.BatchNormalization(), keras.layers.Dense(100, activation='relu'), keras.layers.BatchNormalization(), keras.layers.Dense(10, activation='softmax') # 上面是将批归一化放在激活函数之后,也可以放在激活函数之前 # keras.layers.Dense(300), # keras.layers.BatchNormalization(), # keras.layers.Activation('relu'), ]) # 使用交叉熵损失函数,随机梯度下降法进行训练 # 这里需要说明的是如果是categorical_crossentropy # 则需要将标签数据集进行one_hot处理,如果是sparse_categorical_crossentropy, # 则不需要 model.compile(loss=tf.losses.sparse_categorical_crossentropy, optimizer=optimizers.SGD(learning_rate=0.001), metrics=['accuracy']) # 我们这里使用三个回调函数Tensorboard, earlystopping, ModelCheckpoint logdir = "./callbacks" if not os.path.exists(logdir): os.mkdir(logdir) output_model_file = os.path.join(logdir, "fashion_mnist_model.h5") callbacks = [ # TensorBoard可以保存我们在训练中的指标,比如损失函数值以及识别准确率 keras.callbacks.TensorBoard(logdir), # ModelCheckpoint是保存模型参数 keras.callbacks.ModelCheckpoint(output_model_file, save_best_only=True), # EarlyStopping是提前终止训练 keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3) ] history = model.fit(x_train, y_train, epochs=10, validation_data=(x_valid, y_valid), callbacks=callbacks) print(model.evaluate(x_test, y_test)) print(model.summary()) # print(history.history) # def plot_learning_curves(history): # pd.DataFrame(history.history).plot(figsize=(8, 5)) # plt.grid(True) # plt.gca().set_ylim(0, 1) # plt.show() # # plot_learning_curves(history)
运行结果
Train on 55000 samples, validate on 5000 samples Epoch 1/10 32/55000 [..............................] - ETA: 44:06 - loss: 3.0657 - accuracy: 0.06252021-10-20 23:21:46.915226: I tensorflow/core/profiler/lib/profiler_session.cc:184] Profiler session started. 55000/55000 [==============================] - 12s 223us/sample - loss: 0.8149 - accuracy: 0.7291 - val_loss: 0.5425 - val_accuracy: 0.8172 Epoch 2/10 55000/55000 [==============================] - 11s 195us/sample - loss: 0.5600 - accuracy: 0.8085 - val_loss: 0.4776 - val_accuracy: 0.8398 Epoch 3/10 55000/55000 [==============================] - 13s 229us/sample - loss: 0.5023 - accuracy: 0.8254 - val_loss: 0.4405 - val_accuracy: 0.8514 Epoch 4/10 55000/55000 [==============================] - 12s 216us/sample - loss: 0.4684 - accuracy: 0.8367 - val_loss: 0.4181 - val_accuracy: 0.8600 Epoch 5/10 55000/55000 [==============================] - 11s 200us/sample - loss: 0.4447 - accuracy: 0.8459 - val_loss: 0.4045 - val_accuracy: 0.8634 Epoch 6/10 55000/55000 [==============================] - 11s 200us/sample - loss: 0.4250 - accuracy: 0.8526 - val_loss: 0.3916 - val_accuracy: 0.8688 Epoch 7/10 55000/55000 [==============================] - 11s 204us/sample - loss: 0.4093 - accuracy: 0.8561 - val_loss: 0.3838 - val_accuracy: 0.8692 Epoch 8/10 55000/55000 [==============================] - 11s 207us/sample - loss: 0.3983 - accuracy: 0.8600 - val_loss: 0.3772 - val_accuracy: 0.8718 Epoch 9/10 55000/55000 [==============================] - 11s 207us/sample - loss: 0.3886 - accuracy: 0.8645 - val_loss: 0.3687 - val_accuracy: 0.8732 Epoch 10/10 55000/55000 [==============================] - 12s 212us/sample - loss: 0.3777 - accuracy: 0.8681 - val_loss: 0.3646 - val_accuracy: 0.8742 10000/1 [==================================================] - 1s 99us/sample - loss: 0.3293 - accuracy: 0.8609 [0.39349488220214845, 0.8609] Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 300) 235500 _________________________________________________________________ batch_normalization (BatchNo (None, 300) 1200 _________________________________________________________________ dense_1 (Dense) (None, 100) 30100 _________________________________________________________________ batch_normalization_1 (Batch (None, 100) 400 _________________________________________________________________ dense_2 (Dense) (None, 10) 1010 ================================================================= Total params: 268,210 Trainable params: 267,410 Non-trainable params: 800 _________________________________________________________________ None
通过批过一化后,我们可以看到它的识别准确率比之前都得到了提升。
dropout
有关dropout的详细内容请参考Tensorflow深度学习算法整理
import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers import pandas as pd import os from sklearn.preprocessing import StandardScaler if __name__ == "__main__": os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' fashion_mnist = keras.datasets.fashion_mnist (x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data() x_valid, x_train = x_train_all[:5000], x_train_all[5000:] y_valid, y_train = y_train_all[:5000], y_train_all[5000:] # print(x_valid.shape, y_valid.shape) # print(x_train.shape, y_train.shape) # print(x_test.shape, y_test.shape) # print(np.max(x_train), np.min(x_train)) scaler = StandardScaler() # 归一化过程中,需要将三维图片数据转成二维数据[None, 28, 28] -> [None, 784] # 归一化结束之后再转回三维图片数据,这里fit_transform会记录训练数据集的均值和方差 x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # 这里验证数据集会采用训练数据集的均值和方差 x_valid = scaler.transform(x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) x_test = scaler.transform(x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28) # print(np.max(x_train), np.min(x_train)) def show_single_image(img_arr): plt.imshow(img_arr, cmap='binary') plt.show() # show_single_image(x_train[1]) def show_imgs(n_rows, n_cols, x, y, class_names): assert len(x) == len(y) assert n_rows * n_cols < len(x) plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(x[index], cmap='binary', interpolation='nearest') plt.axis('off') plt.title(class_names[y[index]]) plt.show() # class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # show_imgs(3, 5, x_train, y_train, class_names) model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation='relu'), # 批归一化 keras.layers.BatchNormalization(), keras.layers.Dense(100, activation='relu'), keras.layers.BatchNormalization(), # AlphaDropout,1均值和方差不变,2激活值归一化性质不变 keras.layers.AlphaDropout(rate=0.5), # keras.layers.Dropout(rate=0.5), keras.layers.Dense(10, activation='softmax') # 上面是将批归一化放在激活函数之后,也可以放在激活函数之前 # keras.layers.Dense(300), # keras.layers.BatchNormalization(), # keras.layers.Activation('relu'), ]) # 使用交叉熵损失函数,随机梯度下降法进行训练 # 这里需要说明的是如果是categorical_crossentropy # 则需要将标签数据集进行one_hot处理,如果是sparse_categorical_crossentropy, # 则不需要 model.compile(loss=tf.losses.sparse_categorical_crossentropy, optimizer=optimizers.SGD(learning_rate=0.001), metrics=['accuracy']) # 我们这里使用三个回调函数Tensorboard, earlystopping, ModelCheckpoint logdir = "./callbacks" if not os.path.exists(logdir): os.mkdir(logdir) output_model_file = os.path.join(logdir, "fashion_mnist_model.h5") callbacks = [ # TensorBoard可以保存我们在训练中的指标,比如损失函数值以及识别准确率 keras.callbacks.TensorBoard(logdir), # ModelCheckpoint是保存模型参数 keras.callbacks.ModelCheckpoint(output_model_file, save_best_only=True), # EarlyStopping是提前终止训练 keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3) ] history = model.fit(x_train, y_train, epochs=20, validation_data=(x_valid, y_valid), callbacks=callbacks) print(model.evaluate(x_test, y_test)) print(model.summary()) # print(history.history) # def plot_learning_curves(history): # pd.DataFrame(history.history).plot(figsize=(8, 5)) # plt.grid(True) # plt.gca().set_ylim(0, 1) # plt.show() # # plot_learning_curves(history)
运行结果
Train on 55000 samples, validate on 5000 samples Epoch 1/20 32/55000 [..............................] - ETA: 32:30 - loss: 2.7970 - accuracy: 0.18752021-10-20 23:56:36.685505: I tensorflow/core/profiler/lib/profiler_session.cc:184] Profiler session started. 55000/55000 [==============================] - 14s 252us/sample - loss: 1.6393 - accuracy: 0.4541 - val_loss: 0.7376 - val_accuracy: 0.7648 Epoch 2/20 55000/55000 [==============================] - 12s 222us/sample - loss: 1.1364 - accuracy: 0.6211 - val_loss: 0.6595 - val_accuracy: 0.7934 Epoch 3/20 55000/55000 [==============================] - 15s 275us/sample - loss: 0.9986 - accuracy: 0.6656 - val_loss: 0.6102 - val_accuracy: 0.8088 Epoch 4/20 55000/55000 [==============================] - 14s 257us/sample - loss: 0.9116 - accuracy: 0.6943 - val_loss: 0.5842 - val_accuracy: 0.8180 Epoch 5/20 55000/55000 [==============================] - 13s 232us/sample - loss: 0.8560 - accuracy: 0.7124 - val_loss: 0.5690 - val_accuracy: 0.8248 Epoch 6/20 55000/55000 [==============================] - 12s 227us/sample - loss: 0.8100 - accuracy: 0.7288 - val_loss: 0.5518 - val_accuracy: 0.8328 Epoch 7/20 55000/55000 [==============================] - 13s 230us/sample - loss: 0.7779 - accuracy: 0.7401 - val_loss: 0.5428 - val_accuracy: 0.8372 Epoch 8/20 55000/55000 [==============================] - 13s 229us/sample - loss: 0.7481 - accuracy: 0.7501 - val_loss: 0.5353 - val_accuracy: 0.8414 Epoch 9/20 55000/55000 [==============================] - 12s 225us/sample - loss: 0.7238 - accuracy: 0.7579 - val_loss: 0.5326 - val_accuracy: 0.8420 Epoch 10/20 55000/55000 [==============================] - 12s 222us/sample - loss: 0.6993 - accuracy: 0.7648 - val_loss: 0.5207 - val_accuracy: 0.8458 Epoch 11/20 55000/55000 [==============================] - 12s 222us/sample - loss: 0.6878 - accuracy: 0.7677 - val_loss: 0.5111 - val_accuracy: 0.8478 Epoch 12/20 55000/55000 [==============================] - 13s 230us/sample - loss: 0.6640 - accuracy: 0.7769 - val_loss: 0.5103 - val_accuracy: 0.8474 Epoch 13/20 55000/55000 [==============================] - 13s 243us/sample - loss: 0.6516 - accuracy: 0.7794 - val_loss: 0.5073 - val_accuracy: 0.8494 Epoch 14/20 55000/55000 [==============================] - 13s 237us/sample - loss: 0.6374 - accuracy: 0.7845 - val_loss: 0.5106 - val_accuracy: 0.8528 Epoch 15/20 55000/55000 [==============================] - 13s 234us/sample - loss: 0.6228 - accuracy: 0.7924 - val_loss: 0.5013 - val_accuracy: 0.8534 Epoch 16/20 55000/55000 [==============================] - 13s 231us/sample - loss: 0.6058 - accuracy: 0.7943 - val_loss: 0.4987 - val_accuracy: 0.8558 Epoch 17/20 55000/55000 [==============================] - 13s 237us/sample - loss: 0.5989 - accuracy: 0.7980 - val_loss: 0.4985 - val_accuracy: 0.8556 Epoch 18/20 55000/55000 [==============================] - 13s 232us/sample - loss: 0.5835 - accuracy: 0.8036 - val_loss: 0.4997 - val_accuracy: 0.8566 Epoch 19/20 55000/55000 [==============================] - 13s 237us/sample - loss: 0.5795 - accuracy: 0.8058 - val_loss: 0.4907 - val_accuracy: 0.8596 Epoch 20/20 55000/55000 [==============================] - 13s 230us/sample - loss: 0.5730 - accuracy: 0.8054 - val_loss: 0.4887 - val_accuracy: 0.8606 10000/1 [================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================] - 1s 81us/sample - loss: 0.4401 - accuracy: 0.8478 [0.564703483581543, 0.8478] Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 300) 235500 _________________________________________________________________ batch_normalization (BatchNo (None, 300) 1200 _________________________________________________________________ dense_1 (Dense) (None, 100) 30100 _________________________________________________________________ batch_normalization_1 (Batch (None, 100) 400 _________________________________________________________________ alpha_dropout (AlphaDropout) (None, 100) 0 _________________________________________________________________ dense_2 (Dense) (None, 10) 1010 ================================================================= Total params: 268,210 Trainable params: 267,410 Non-trainable params: 800 _________________________________________________________________ None
通过对dropout的使用,我们发现这个数据集的过拟合现象并不严重,它的识别准确率比之前反而有所降低。
wide_deep模型
google16年发布,可用于分类和回归
稀疏特征
- 离散值特征,比如说一个人的性别信息,只能从两个值里面去进行选择。即类别类型的特征。
- 可以使用One-hot表示。
比如:专业={计算机,人文,其他}。人文=[0, 1, 0]
比如: 词表={人工智能,你,他,网络,...},他=[0, 0, 1, 0, ...]
叉乘={(计算机,人工智能),(计算机,你),...},这里表示"专业"中的每个词跟"词表"中的每个词进行组合。叉乘是可以用来刻画一个样本的。
比如说一个物体的所有特征,我们都把它表示成离散特征,我们就可以用叉乘来精确的刻画一个样本,叉乘可以精确的刻画到所有样本的所有可能性。
- 叉乘之后
- 稀疏特征做叉乘获取共现信息
- 实现记忆的效果
如果一个物体可以用离散特征去表达它的全部信息,那么这个物体的总量也是确定的,那么叉乘之后的总的集合包含了所有物体的所有可能性。设想我们有一种非常大的模型,这个模型可以把所有样本都记住。当我们遇到新的样本的时候,那么这个样本肯定也是这个大集合中的一个。所以如果我们的模型能够记住大集合中的每一个样本,那么对于任何新的样本它都可以100%的去进行正确的预测。
稀疏特征——优缺点
- 优点
- 有效,广泛用于工业界
- 缺点
- 需要人工设计
- 可能过拟合,所有特征都叉乘,相当于记住每一个样本
- 泛化能力差,没出现过就不会起效果
密集特征
- 向量表达
比如:词表={人工智能,你,他,网络,...},他=[0.3, 0.2, 0.6, (n维向量)],我们可以用向量之间的距离来表示这两个词对应的距离。
- Word2vec工具
可以参考Tensorflow深度学习算法整理(二) 中的内容
密集特征的优缺点
- 优点
- 带有语义信息,不同向量之间有相关性
- 兼容没有出现过的特征组合
- 更少人工参与
- 缺点
- 过度泛化,推荐不怎么相关的产品
Wide & Deep模型结构
Wide & Deep Vs Wide
在左边的Wide模型中,我们可以看到它只有一层,输入就是稀疏特征,也就是一个One-hot表达。One-hot表达的每个分量都直接连接到输出单元上去。在右边的Wide & Deep模型,它的左半部分也就是一个Wide模型,它的右半部分是一个Deep模型,这个Deep模型就是有多层的神经网络,在这里,我们将输入的数据表现为一个密集的向量表达,在密集表达之上有一个多层的神经网络,在经过多层神经网络之后再连接到输出的神经单元上去。
Wide & Deep Vs Deep
在这里,右图是一个Deep模型,它跟Wide & Deep模型的区别就在于它没有连接稀疏特征的那一块。
这是google商店中一个推荐算法的模型图,它就是一个典型的Wide & Deep模型,它有很多的特征,其中用户已经安装的软件和展示的软件做了叉乘,作为Wide模型的输入。而其他的特征,有些做了Embedding,有些没有做Embedding,把它们拼接起来,作为一个总的特征(密集表示),再经过多层的神经网络,形成一个Deep的部分,然后再使用一个逻辑回归的损失函数把Wide和Deep给组合起来。现在我们先来看一个加利福尼亚的一个房价的回归问题
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split if __name__ == "__main__": housing = fetch_california_housing() print(housing.DESCR) print(housing.data.shape) print(housing.target.shape) pprint.pprint(housing.data[0:5]) pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) print(X_train.shape, y_train.shape) print(X_valid.shape, y_valid.shape) print(X_test.shape, y_test.shape)
运行结果
.. _california_housing_dataset: California Housing dataset -------------------------- **Data Set Characteristics:** :Number of Instances: 20640 :Number of Attributes: 8 numeric, predictive attributes and the target :Attribute Information: - MedInc median income in block - HouseAge median house age in block - AveRooms average number of rooms - AveBedrms average number of bedrooms - Population block population - AveOccup average house occupancy - Latitude house block latitude - Longitude house block longitude :Missing Attribute Values: None This dataset was obtained from the StatLib repository. http://lib.stat.cmu.edu/datasets/ The target variable is the median house value for California districts. This dataset was derived from the 1990 U.S. census, using one row per census block group. A block group is the smallest geographical unit for which the U.S. Census Bureau publishes sample data (a block group typically has a population of 600 to 3,000 people). It can be downloaded/loaded using the :func:`sklearn.datasets.fetch_california_housing` function. .. topic:: References - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions, Statistics and Probability Letters, 33 (1997) 291-297 (20640, 8) (20640,) array([[ 8.32520000e+00, 4.10000000e+01, 6.98412698e+00, 1.02380952e+00, 3.22000000e+02, 2.55555556e+00, 3.78800000e+01, -1.22230000e+02], [ 8.30140000e+00, 2.10000000e+01, 6.23813708e+00, 9.71880492e-01, 2.40100000e+03, 2.10984183e+00, 3.78600000e+01, -1.22220000e+02], [ 7.25740000e+00, 5.20000000e+01, 8.28813559e+00, 1.07344633e+00, 4.96000000e+02, 2.80225989e+00, 3.78500000e+01, -1.22240000e+02], [ 5.64310000e+00, 5.20000000e+01, 5.81735160e+00, 1.07305936e+00, 5.58000000e+02, 2.54794521e+00, 3.78500000e+01, -1.22250000e+02], [ 3.84620000e+00, 5.20000000e+01, 6.28185328e+00, 1.08108108e+00, 5.65000000e+02, 2.18146718e+00, 3.78500000e+01, -1.22250000e+02]]) array([4.526, 3.585, 3.521, 3.413, 3.422]) (11610, 8) (11610,) (3870, 8) (3870,) (5160, 8) (5160,)
我们可以看到这里有20640条样本数据,维度为8,说明影响房价的有8个特征。其中,我们打印了5条样本数据和标签数据。并将其拆分为训练数据集,验证数据集和测试数据集。现在我们来进行模型训练和打印学习曲线
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) model = keras.models.Sequential([ layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), layers.Dense(1) ]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(learning_rate=0.01)) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] history = model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=100, callbacks=callbacks) print(model.evaluate(X_test, y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 30) 270 _________________________________________________________________ dense_1 (Dense) (None, 1) 31 ================================================================= Total params: 301 Trainable params: 301 Non-trainable params: 0 _________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 1s 88us/sample - loss: 1.3027 - val_loss: 2.2434 Epoch 2/100 11610/11610 [==============================] - 1s 45us/sample - loss: 4.6891 - val_loss: 0.4434 Epoch 3/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.4092 - val_loss: 0.3887 Epoch 4/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3811 - val_loss: 0.3797 Epoch 5/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3718 - val_loss: 0.3839 Epoch 6/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3652 - val_loss: 0.3714 Epoch 7/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3620 - val_loss: 0.3662 Epoch 8/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3587 - val_loss: 0.3715 Epoch 9/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3555 - val_loss: 0.3632 Epoch 10/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3525 - val_loss: 0.3620 Epoch 11/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3518 - val_loss: 0.3566 Epoch 12/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.3486 - val_loss: 0.3544 Epoch 13/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3466 - val_loss: 0.3494 Epoch 14/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.3468 - val_loss: 0.3458 Epoch 15/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3417 - val_loss: 0.3487 Epoch 16/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3412 - val_loss: 0.3449 Epoch 17/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3386 - val_loss: 0.3592 Epoch 18/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3372 - val_loss: 0.3412 Epoch 19/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3364 - val_loss: 0.3426 Epoch 20/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3336 - val_loss: 0.3462 Epoch 21/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3317 - val_loss: 0.3388 Epoch 22/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.3300 - val_loss: 0.3461 Epoch 23/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3292 - val_loss: 0.3355 Epoch 24/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3281 - val_loss: 0.3344 Epoch 25/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3266 - val_loss: 0.3374 Epoch 26/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3283 - val_loss: 0.3348 Epoch 27/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3242 - val_loss: 0.3395 Epoch 28/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3247 - val_loss: 0.3322 Epoch 29/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3233 - val_loss: 0.3288 Epoch 30/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3216 - val_loss: 0.3353 Epoch 31/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3216 - val_loss: 0.3293 Epoch 32/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3214 - val_loss: 0.3312 Epoch 33/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3201 - val_loss: 0.3290 Epoch 34/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3189 - val_loss: 0.3319 5160/1 [==================================================] - 0s 19us/sample - loss: 0.4063 0.342487285580746
这里我们发现,我们设置了100次的迭代,但是只到了34次并没有到100次就停止了,再根据学习曲线的情况,我们发现是EarlyStopping的回调函数起到了作用,是梯度下降已经到了瓶颈,趋于平缓。而测试数据集的损失函数值为0.342。
现在我们来将这个简单的回归模型改成Wide & Deep模型
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers, models from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) # model = keras.models.Sequential([ # layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), # layers.Dense(1) # ]) # 函数式API Deep模型 input = layers.Input(shape=X_train.shape[1:]) hidden1 = layers.Dense(30, activation='relu')(input) hidden2 = layers.Dense(30, activation='relu')(hidden1) # input是Wide模型的输入,hidden2是Deep模型的输出 concat = layers.concatenate([input, hidden2]) output = layers.Dense(1)(concat) model = models.Model(inputs=[input], outputs=[output]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(learning_rate=0.001)) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] history = model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=100, callbacks=callbacks) print(model.evaluate(X_test, y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "model" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 8)] 0 __________________________________________________________________________________________________ dense (Dense) (None, 30) 270 input_1[0][0] __________________________________________________________________________________________________ dense_1 (Dense) (None, 30) 930 dense[0][0] __________________________________________________________________________________________________ concatenate (Concatenate) (None, 38) 0 input_1[0][0] dense_1[0][0] __________________________________________________________________________________________________ dense_2 (Dense) (None, 1) 39 concatenate[0][0] ================================================================================================== Total params: 1,239 Trainable params: 1,239 Non-trainable params: 0 __________________________________________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 1s 107us/sample - loss: 1.7756 - val_loss: 0.8341 Epoch 2/100 11610/11610 [==============================] - 1s 56us/sample - loss: 0.7057 - val_loss: 0.7208 Epoch 3/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.6495 - val_loss: 0.6740 Epoch 4/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.6138 - val_loss: 0.6451 Epoch 5/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.5884 - val_loss: 0.6189 Epoch 6/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.5682 - val_loss: 0.6013 Epoch 7/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.5515 - val_loss: 0.5818 Epoch 8/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.5387 - val_loss: 0.5675 Epoch 9/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5272 - val_loss: 0.5547 Epoch 10/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.5180 - val_loss: 0.5441 Epoch 11/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.5085 - val_loss: 0.5336 Epoch 12/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.5012 - val_loss: 0.5285 Epoch 13/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4931 - val_loss: 0.5167 Epoch 14/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4881 - val_loss: 0.5128 Epoch 15/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4813 - val_loss: 0.5043 Epoch 16/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4760 - val_loss: 0.4983 Epoch 17/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4710 - val_loss: 0.4928 Epoch 18/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4655 - val_loss: 0.4917 Epoch 19/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4621 - val_loss: 0.4818 Epoch 20/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4571 - val_loss: 0.4776 Epoch 21/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4531 - val_loss: 0.4779 Epoch 22/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4501 - val_loss: 0.4696 Epoch 23/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4455 - val_loss: 0.4650 Epoch 24/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4425 - val_loss: 0.4612 Epoch 25/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4404 - val_loss: 0.4592 Epoch 26/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4367 - val_loss: 0.4542 Epoch 27/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4336 - val_loss: 0.4507 Epoch 28/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4310 - val_loss: 0.4492 Epoch 29/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4278 - val_loss: 0.4470 Epoch 30/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4257 - val_loss: 0.4429 Epoch 31/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4227 - val_loss: 0.4398 Epoch 32/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4208 - val_loss: 0.4375 Epoch 33/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4183 - val_loss: 0.4346 Epoch 34/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4162 - val_loss: 0.4327 Epoch 35/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4136 - val_loss: 0.4306 Epoch 36/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4116 - val_loss: 0.4275 Epoch 37/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4096 - val_loss: 0.4258 Epoch 38/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4075 - val_loss: 0.4236 Epoch 39/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4053 - val_loss: 0.4213 Epoch 40/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4037 - val_loss: 0.4191 Epoch 41/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4016 - val_loss: 0.4180 Epoch 42/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.4003 - val_loss: 0.4157 Epoch 43/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3981 - val_loss: 0.4129 Epoch 44/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3962 - val_loss: 0.4130 Epoch 45/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3949 - val_loss: 0.4094 Epoch 46/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3929 - val_loss: 0.4080 Epoch 47/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3915 - val_loss: 0.4067 Epoch 48/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3898 - val_loss: 0.4044 Epoch 49/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3885 - val_loss: 0.4032 Epoch 50/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3868 - val_loss: 0.4019 Epoch 51/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3850 - val_loss: 0.3995 Epoch 52/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3839 - val_loss: 0.3993 Epoch 53/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3825 - val_loss: 0.3971 Epoch 54/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3809 - val_loss: 0.3951 Epoch 55/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3798 - val_loss: 0.3940 Epoch 56/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3788 - val_loss: 0.3929 Epoch 57/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3775 - val_loss: 0.3916 Epoch 58/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3760 - val_loss: 0.3906 Epoch 59/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3749 - val_loss: 0.3900 Epoch 60/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3742 - val_loss: 0.3880 Epoch 61/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3726 - val_loss: 0.3866 Epoch 62/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3718 - val_loss: 0.3863 Epoch 63/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3706 - val_loss: 0.3853 Epoch 64/100 11610/11610 [==============================] - 1s 54us/sample - loss: 0.3698 - val_loss: 0.3834 Epoch 65/100 11610/11610 [==============================] - 1s 71us/sample - loss: 0.3687 - val_loss: 0.3834 Epoch 66/100 11610/11610 [==============================] - 1s 69us/sample - loss: 0.3679 - val_loss: 0.3818 Epoch 67/100 11610/11610 [==============================] - 1s 70us/sample - loss: 0.3668 - val_loss: 0.3811 Epoch 68/100 11610/11610 [==============================] - 1s 78us/sample - loss: 0.3658 - val_loss: 0.3801 Epoch 69/100 11610/11610 [==============================] - 1s 76us/sample - loss: 0.3649 - val_loss: 0.3787 Epoch 70/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.3639 - val_loss: 0.3781 Epoch 71/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.3634 - val_loss: 0.3769 Epoch 72/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.3621 - val_loss: 0.3762 Epoch 73/100 11610/11610 [==============================] - 1s 66us/sample - loss: 0.3615 - val_loss: 0.3762 Epoch 74/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3606 - val_loss: 0.3746 Epoch 75/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3596 - val_loss: 0.3749 Epoch 76/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3590 - val_loss: 0.3736 Epoch 77/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3580 - val_loss: 0.3740 Epoch 78/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3576 - val_loss: 0.3721 Epoch 79/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3562 - val_loss: 0.3712 Epoch 80/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3558 - val_loss: 0.3710 Epoch 81/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3549 - val_loss: 0.3710 Epoch 82/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3541 - val_loss: 0.3707 Epoch 83/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3537 - val_loss: 0.3690 Epoch 84/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3530 - val_loss: 0.3691 Epoch 85/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3520 - val_loss: 0.3679 Epoch 86/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3514 - val_loss: 0.3673 Epoch 87/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3508 - val_loss: 0.3671 Epoch 88/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3500 - val_loss: 0.3662 Epoch 89/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3496 - val_loss: 0.3655 Epoch 90/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3487 - val_loss: 0.3661 Epoch 91/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3484 - val_loss: 0.3658 Epoch 92/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3479 - val_loss: 0.3641 Epoch 93/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3468 - val_loss: 0.3637 Epoch 94/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3462 - val_loss: 0.3640 Epoch 95/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3456 - val_loss: 0.3629 Epoch 96/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3449 - val_loss: 0.3621 Epoch 97/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3444 - val_loss: 0.3621 Epoch 98/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3431 - val_loss: 0.3622 Epoch 99/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3434 - val_loss: 0.3606 Epoch 100/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3430 - val_loss: 0.3604 5160/1 [========================================================] - 0s 24us/sample - loss: 0.4557 0.36289026386053985
在这里,我们使用的是函数式编程来实现的Wide & Deep模型,下面我们来使用子类API来实现这个模型
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers, models from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) # model = keras.models.Sequential([ # layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), # layers.Dense(1) # ]) # 函数式API Deep模型 # input = layers.Input(shape=X_train.shape[1:]) # hidden1 = layers.Dense(30, activation='relu')(input) # hidden2 = layers.Dense(30, activation='relu')(hidden1) # # input是Wide模型的输入,hidden2是Deep模型的输出 # concat = layers.concatenate([input, hidden2]) # output = layers.Dense(1)(concat) # model = models.Model(inputs=[input], outputs=[output]) # 子类API,父类为keras.models.Model class WideDeepModel(models.Model): def __init__(self): super(WideDeepModel, self).__init__() # 定义模型的层次 self.hidden1_layer = layers.Dense(30, activation='relu') self.hidden2_layer = layers.Dense(30, activation='relu') self.output_layer = layers.Dense(1) def call(self, input): # 完成模型的正向计算 hidden1 = self.hidden1_layer(input) hidden2 = self.hidden2_layer(hidden1) concat = layers.concatenate([input, hidden2]) output = self.output_layer(concat) return output model = WideDeepModel() # 也可以使用层堆叠 # model = models.Sequential([ # WideDeepModel() # ]) model.build(input_shape=(None, 8)) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(learning_rate=0.001)) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] history = model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=100, callbacks=callbacks) print(model.evaluate(X_test, y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "wide_deep_model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) multiple 270 _________________________________________________________________ dense_1 (Dense) multiple 930 _________________________________________________________________ dense_2 (Dense) multiple 39 ================================================================= Total params: 1,239 Trainable params: 1,239 Non-trainable params: 0 _________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 1s 107us/sample - loss: 2.0999 - val_loss: 0.8217 Epoch 2/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.6996 - val_loss: 0.7236 Epoch 3/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.6376 - val_loss: 0.6704 Epoch 4/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.6003 - val_loss: 0.6322 Epoch 5/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.5720 - val_loss: 0.6104 Epoch 6/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.5499 - val_loss: 0.5869 Epoch 7/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.5324 - val_loss: 0.5653 Epoch 8/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.5188 - val_loss: 0.5499 Epoch 9/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.5075 - val_loss: 0.5401 Epoch 10/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4970 - val_loss: 0.5268 Epoch 11/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4902 - val_loss: 0.5204 Epoch 12/100 11610/11610 [==============================] - 1s 56us/sample - loss: 0.4819 - val_loss: 0.5103 Epoch 13/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.4759 - val_loss: 0.5056 Epoch 14/100 11610/11610 [==============================] - 1s 82us/sample - loss: 0.4697 - val_loss: 0.4977 Epoch 15/100 11610/11610 [==============================] - 1s 68us/sample - loss: 0.4654 - val_loss: 0.4931 Epoch 16/100 11610/11610 [==============================] - 1s 83us/sample - loss: 0.4597 - val_loss: 0.4928 Epoch 17/100 11610/11610 [==============================] - 1s 78us/sample - loss: 0.4538 - val_loss: 0.4821 Epoch 18/100 11610/11610 [==============================] - 1s 75us/sample - loss: 0.4506 - val_loss: 0.4765 Epoch 19/100 11610/11610 [==============================] - 1s 70us/sample - loss: 0.4465 - val_loss: 0.4744 Epoch 20/100 11610/11610 [==============================] - 1s 58us/sample - loss: 0.4430 - val_loss: 0.4762 Epoch 21/100 11610/11610 [==============================] - 1s 99us/sample - loss: 0.4391 - val_loss: 0.4668 Epoch 22/100 11610/11610 [==============================] - 1s 81us/sample - loss: 0.4361 - val_loss: 0.4641 Epoch 23/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.4328 - val_loss: 0.4587 Epoch 24/100 11610/11610 [==============================] - 1s 66us/sample - loss: 0.4293 - val_loss: 0.4565 Epoch 25/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4266 - val_loss: 0.4525 Epoch 26/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4237 - val_loss: 0.4481 Epoch 27/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4210 - val_loss: 0.4452 Epoch 28/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4178 - val_loss: 0.4426 Epoch 29/100 11610/11610 [==============================] - 1s 75us/sample - loss: 0.4163 - val_loss: 0.4410 Epoch 30/100 11610/11610 [==============================] - 1s 57us/sample - loss: 0.4135 - val_loss: 0.4372 Epoch 31/100 11610/11610 [==============================] - 1s 56us/sample - loss: 0.4111 - val_loss: 0.4350 Epoch 32/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.4096 - val_loss: 0.4329 Epoch 33/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4075 - val_loss: 0.4298 Epoch 34/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4053 - val_loss: 0.4293 Epoch 35/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.4035 - val_loss: 0.4263 Epoch 36/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.4018 - val_loss: 0.4236 Epoch 37/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3997 - val_loss: 0.4221 Epoch 38/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3977 - val_loss: 0.4207 Epoch 39/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3962 - val_loss: 0.4175 Epoch 40/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3947 - val_loss: 0.4152 Epoch 41/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3927 - val_loss: 0.4140 Epoch 42/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3914 - val_loss: 0.4131 Epoch 43/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3897 - val_loss: 0.4102 Epoch 44/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3883 - val_loss: 0.4088 Epoch 45/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3869 - val_loss: 0.4063 Epoch 46/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3858 - val_loss: 0.4053 Epoch 47/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3841 - val_loss: 0.4041 Epoch 48/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3832 - val_loss: 0.4029 Epoch 49/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3818 - val_loss: 0.4002 Epoch 50/100 11610/11610 [==============================] - 1s 57us/sample - loss: 0.3807 - val_loss: 0.3987 Epoch 51/100 11610/11610 [==============================] - 1s 77us/sample - loss: 0.3791 - val_loss: 0.3970 Epoch 52/100 11610/11610 [==============================] - 1s 73us/sample - loss: 0.3779 - val_loss: 0.3970 Epoch 53/100 11610/11610 [==============================] - 1s 98us/sample - loss: 0.3768 - val_loss: 0.3964 Epoch 54/100 11610/11610 [==============================] - 1s 92us/sample - loss: 0.3756 - val_loss: 0.3941 Epoch 55/100 11610/11610 [==============================] - 1s 55us/sample - loss: 0.3746 - val_loss: 0.3926 Epoch 56/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.3739 - val_loss: 0.3914 Epoch 57/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3727 - val_loss: 0.3896 Epoch 58/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3718 - val_loss: 0.3879 Epoch 59/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3701 - val_loss: 0.3900 Epoch 60/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3696 - val_loss: 0.3865 Epoch 61/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3683 - val_loss: 0.3855 Epoch 62/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3674 - val_loss: 0.3860 Epoch 63/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3669 - val_loss: 0.3831 Epoch 64/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3652 - val_loss: 0.3820 Epoch 65/100 11610/11610 [==============================] - 1s 76us/sample - loss: 0.3645 - val_loss: 0.3818 Epoch 66/100 11610/11610 [==============================] - 1s 95us/sample - loss: 0.3641 - val_loss: 0.3794 Epoch 67/100 11610/11610 [==============================] - 1s 82us/sample - loss: 0.3623 - val_loss: 0.3799 Epoch 68/100 11610/11610 [==============================] - 1s 57us/sample - loss: 0.3623 - val_loss: 0.3782 Epoch 69/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.3606 - val_loss: 0.3766 Epoch 70/100 11610/11610 [==============================] - 1s 68us/sample - loss: 0.3599 - val_loss: 0.3766 Epoch 71/100 11610/11610 [==============================] - 1s 87us/sample - loss: 0.3589 - val_loss: 0.3748 Epoch 72/100 11610/11610 [==============================] - 1s 100us/sample - loss: 0.3582 - val_loss: 0.3743 Epoch 73/100 11610/11610 [==============================] - 1s 60us/sample - loss: 0.3573 - val_loss: 0.3728 Epoch 74/100 11610/11610 [==============================] - 1s 74us/sample - loss: 0.3564 - val_loss: 0.3735 Epoch 75/100 11610/11610 [==============================] - 1s 81us/sample - loss: 0.3562 - val_loss: 0.3718 Epoch 76/100 11610/11610 [==============================] - 1s 75us/sample - loss: 0.3557 - val_loss: 0.3714 Epoch 77/100 11610/11610 [==============================] - 1s 85us/sample - loss: 0.3548 - val_loss: 0.3703 Epoch 78/100 11610/11610 [==============================] - 1s 93us/sample - loss: 0.3540 - val_loss: 0.3700 Epoch 79/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3528 - val_loss: 0.3685 Epoch 80/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3526 - val_loss: 0.3678 Epoch 81/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3512 - val_loss: 0.3678 Epoch 82/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3506 - val_loss: 0.3672 Epoch 83/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3508 - val_loss: 0.3657 Epoch 84/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3495 - val_loss: 0.3669 Epoch 85/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3491 - val_loss: 0.3670 Epoch 86/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3490 - val_loss: 0.3642 Epoch 87/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3486 - val_loss: 0.3642 Epoch 88/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3478 - val_loss: 0.3643 Epoch 89/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3474 - val_loss: 0.3631 Epoch 90/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3467 - val_loss: 0.3614 Epoch 91/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3451 - val_loss: 0.3604 Epoch 92/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3444 - val_loss: 0.3606 Epoch 93/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3436 - val_loss: 0.3592 Epoch 94/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3435 - val_loss: 0.3588 Epoch 95/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3424 - val_loss: 0.3585 Epoch 96/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3424 - val_loss: 0.3576 Epoch 97/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3424 - val_loss: 0.3578 Epoch 98/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3419 - val_loss: 0.3569 Epoch 99/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3412 - val_loss: 0.3572 Epoch 100/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3404 - val_loss: 0.3551 5160/1 [===========================================================] - 0s 45us/sample - loss: 0.4603 0.36134041002554484
由于Wide & Deep模型可以分别挑选特征来进行输入,现在我们来改成多输入的模式
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers, models from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) # model = keras.models.Sequential([ # layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), # layers.Dense(1) # ]) # 函数式API Deep模型 # input = layers.Input(shape=X_train.shape[1:]) # hidden1 = layers.Dense(30, activation='relu')(input) # hidden2 = layers.Dense(30, activation='relu')(hidden1) # # input是Wide模型的输入,hidden2是Deep模型的输出 # concat = layers.concatenate([input, hidden2]) # output = layers.Dense(1)(concat) # model = models.Model(inputs=[input], outputs=[output]) # 子类API,父类为keras.models.Model # class WideDeepModel(models.Model): # # def __init__(self): # super(WideDeepModel, self).__init__() # # 定义模型的层次 # self.hidden1_layer = layers.Dense(30, activation='relu') # self.hidden2_layer = layers.Dense(30, activation='relu') # self.output_layer = layers.Dense(1) # # # def call(self, input): # # 完成模型的正向计算 # hidden1 = self.hidden1_layer(input) # hidden2 = self.hidden2_layer(hidden1) # concat = layers.concatenate([input, hidden2]) # output = self.output_layer(concat) # return output # # model = WideDeepModel() # # 也可以使用层堆叠 # # model = models.Sequential([ # # WideDeepModel() # # ]) # model.build(input_shape=(None, 8)) # 多输入 wide模型输入前5个特征,deep模型输入后6个特征 input_wide = layers.Input(shape=[5]) input_deep = layers.Input(shape=[6]) hidden1 = layers.Dense(30, activation='relu')(input_deep) hidden2 = layers.Dense(30, activation='relu')(hidden1) concat = layers.concatenate([input_wide, hidden2]) output = layers.Dense(1)(concat) model = models.Model(inputs=[input_wide, input_deep], outputs=[output]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(learning_rate=0.001)) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] X_train_wide = X_train[:, :5] X_train_deep = X_train[:, 2:] X_valid_wide = X_valid[:, :5] X_valid_deep = X_valid[:, 2:] X_test_wide = X_test[:, :5] X_test_deep = X_test[:, 2:] history = model.fit([X_train_wide, X_train_deep], y_train, validation_data=([X_valid_wide, X_valid_deep], y_valid), epochs=100, callbacks=callbacks) print(model.evaluate([X_test_wide, X_test_deep], y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "model" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_2 (InputLayer) [(None, 6)] 0 __________________________________________________________________________________________________ dense (Dense) (None, 30) 210 input_2[0][0] __________________________________________________________________________________________________ input_1 (InputLayer) [(None, 5)] 0 __________________________________________________________________________________________________ dense_1 (Dense) (None, 30) 930 dense[0][0] __________________________________________________________________________________________________ concatenate (Concatenate) (None, 35) 0 input_1[0][0] dense_1[0][0] __________________________________________________________________________________________________ dense_2 (Dense) (None, 1) 36 concatenate[0][0] ================================================================================================== Total params: 1,176 Trainable params: 1,176 Non-trainable params: 0 __________________________________________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 2s 138us/sample - loss: 1.9978 - val_loss: 0.9837 Epoch 2/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.8110 - val_loss: 0.7862 Epoch 3/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.7007 - val_loss: 0.7168 Epoch 4/100 11610/11610 [==============================] - 1s 54us/sample - loss: 0.6489 - val_loss: 0.6742 Epoch 5/100 11610/11610 [==============================] - 1s 54us/sample - loss: 0.6118 - val_loss: 0.6378 Epoch 6/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5831 - val_loss: 0.6127 Epoch 7/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5607 - val_loss: 0.5910 Epoch 8/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5427 - val_loss: 0.5736 Epoch 9/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.5275 - val_loss: 0.5589 Epoch 10/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5144 - val_loss: 0.5455 Epoch 11/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.5033 - val_loss: 0.5353 Epoch 12/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4939 - val_loss: 0.5258 Epoch 13/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4853 - val_loss: 0.5156 Epoch 14/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4784 - val_loss: 0.5084 Epoch 15/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4718 - val_loss: 0.5035 Epoch 16/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4657 - val_loss: 0.4952 Epoch 17/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4606 - val_loss: 0.4887 Epoch 18/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4560 - val_loss: 0.4840 Epoch 19/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4517 - val_loss: 0.4805 Epoch 20/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4477 - val_loss: 0.4773 Epoch 21/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4451 - val_loss: 0.4727 Epoch 22/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.4423 - val_loss: 0.4697 Epoch 23/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.4397 - val_loss: 0.4708 Epoch 24/100 11610/11610 [==============================] - 1s 72us/sample - loss: 0.4375 - val_loss: 0.4650 Epoch 25/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.4350 - val_loss: 0.4633 Epoch 26/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.4329 - val_loss: 0.4593 Epoch 27/100 11610/11610 [==============================] - 1s 88us/sample - loss: 0.4310 - val_loss: 0.4569 Epoch 28/100 11610/11610 [==============================] - 1s 99us/sample - loss: 0.4294 - val_loss: 0.4558 Epoch 29/100 11610/11610 [==============================] - 1s 97us/sample - loss: 0.4276 - val_loss: 0.4521 Epoch 30/100 11610/11610 [==============================] - 1s 120us/sample - loss: 0.4254 - val_loss: 0.4494 Epoch 31/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4239 - val_loss: 0.4484 Epoch 32/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.4219 - val_loss: 0.4470 Epoch 33/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4209 - val_loss: 0.4456 Epoch 34/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4194 - val_loss: 0.4433 Epoch 35/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4179 - val_loss: 0.4427 Epoch 36/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4163 - val_loss: 0.4399 Epoch 37/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4150 - val_loss: 0.4399 Epoch 38/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4137 - val_loss: 0.4370 Epoch 39/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4122 - val_loss: 0.4364 Epoch 40/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4112 - val_loss: 0.4369 Epoch 41/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4098 - val_loss: 0.4329 Epoch 42/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4088 - val_loss: 0.4326 Epoch 43/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.4077 - val_loss: 0.4299 Epoch 44/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4066 - val_loss: 0.4304 Epoch 45/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.4054 - val_loss: 0.4284 Epoch 46/100 11610/11610 [==============================] - 1s 84us/sample - loss: 0.4043 - val_loss: 0.4286 Epoch 47/100 11610/11610 [==============================] - 1s 95us/sample - loss: 0.4036 - val_loss: 0.4263 Epoch 48/100 11610/11610 [==============================] - 1s 88us/sample - loss: 0.4026 - val_loss: 0.4251 Epoch 49/100 11610/11610 [==============================] - 1s 82us/sample - loss: 0.4014 - val_loss: 0.4240 Epoch 50/100 11610/11610 [==============================] - 1s 96us/sample - loss: 0.4007 - val_loss: 0.4231 Epoch 51/100 11610/11610 [==============================] - 1s 56us/sample - loss: 0.3998 - val_loss: 0.4216 Epoch 52/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.3990 - val_loss: 0.4235 Epoch 53/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3981 - val_loss: 0.4211 Epoch 54/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3976 - val_loss: 0.4210 Epoch 55/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3965 - val_loss: 0.4217 Epoch 56/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3959 - val_loss: 0.4174 Epoch 57/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3953 - val_loss: 0.4175 Epoch 58/100 11610/11610 [==============================] - 1s 82us/sample - loss: 0.3943 - val_loss: 0.4163 Epoch 59/100 11610/11610 [==============================] - 1s 74us/sample - loss: 0.3935 - val_loss: 0.4156 Epoch 60/100 11610/11610 [==============================] - 1s 77us/sample - loss: 0.3928 - val_loss: 0.4150 Epoch 61/100 11610/11610 [==============================] - 1s 70us/sample - loss: 0.3922 - val_loss: 0.4147 Epoch 62/100 11610/11610 [==============================] - 1s 55us/sample - loss: 0.3913 - val_loss: 0.4137 Epoch 63/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.3906 - val_loss: 0.4128 Epoch 64/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3898 - val_loss: 0.4113 Epoch 65/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3894 - val_loss: 0.4121 Epoch 66/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3884 - val_loss: 0.4110 Epoch 67/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3878 - val_loss: 0.4129 Epoch 68/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3873 - val_loss: 0.4109 Epoch 69/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3864 - val_loss: 0.4101 Epoch 70/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3858 - val_loss: 0.4092 Epoch 71/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3853 - val_loss: 0.4073 Epoch 72/100 11610/11610 [==============================] - 1s 94us/sample - loss: 0.3847 - val_loss: 0.4076 Epoch 73/100 11610/11610 [==============================] - 1s 98us/sample - loss: 0.3842 - val_loss: 0.4059 Epoch 74/100 11610/11610 [==============================] - 1s 80us/sample - loss: 0.3834 - val_loss: 0.4047 Epoch 75/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3826 - val_loss: 0.4056 Epoch 76/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.3822 - val_loss: 0.4031 Epoch 77/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.3814 - val_loss: 0.4049 Epoch 78/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3812 - val_loss: 0.4029 Epoch 79/100 11610/11610 [==============================] - 1s 59us/sample - loss: 0.3800 - val_loss: 0.4022 Epoch 80/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3794 - val_loss: 0.4004 Epoch 81/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3793 - val_loss: 0.4004 Epoch 82/100 11610/11610 [==============================] - 1s 79us/sample - loss: 0.3784 - val_loss: 0.3998 Epoch 83/100 11610/11610 [==============================] - 1s 77us/sample - loss: 0.3778 - val_loss: 0.3988 Epoch 84/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3770 - val_loss: 0.3981 Epoch 85/100 11610/11610 [==============================] - 1s 69us/sample - loss: 0.3764 - val_loss: 0.3987 Epoch 86/100 11610/11610 [==============================] - 1s 83us/sample - loss: 0.3756 - val_loss: 0.3970 Epoch 87/100 11610/11610 [==============================] - 1s 89us/sample - loss: 0.3751 - val_loss: 0.3969 Epoch 88/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.3747 - val_loss: 0.3950 Epoch 89/100 11610/11610 [==============================] - 1s 90us/sample - loss: 0.3740 - val_loss: 0.3951 Epoch 90/100 11610/11610 [==============================] - 1s 68us/sample - loss: 0.3733 - val_loss: 0.3945 Epoch 91/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3727 - val_loss: 0.3937 Epoch 92/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3721 - val_loss: 0.3937 Epoch 93/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3717 - val_loss: 0.3932 Epoch 94/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3709 - val_loss: 0.3930 Epoch 95/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3703 - val_loss: 0.3919 Epoch 96/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3695 - val_loss: 0.3921 Epoch 97/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3692 - val_loss: 0.3909 Epoch 98/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3687 - val_loss: 0.3892 Epoch 99/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3676 - val_loss: 0.3902 Epoch 100/100 11610/11610 [==============================] - 1s 53us/sample - loss: 0.3677 - val_loss: 0.3888 5160/1 [=======================================================] - 0s 24us/sample - loss: 0.4975 0.3788368522658829
有了多输入就会有多输出
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers, models from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) # model = keras.models.Sequential([ # layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), # layers.Dense(1) # ]) # 函数式API Deep模型 # input = layers.Input(shape=X_train.shape[1:]) # hidden1 = layers.Dense(30, activation='relu')(input) # hidden2 = layers.Dense(30, activation='relu')(hidden1) # # input是Wide模型的输入,hidden2是Deep模型的输出 # concat = layers.concatenate([input, hidden2]) # output = layers.Dense(1)(concat) # model = models.Model(inputs=[input], outputs=[output]) # 子类API,父类为keras.models.Model # class WideDeepModel(models.Model): # # def __init__(self): # super(WideDeepModel, self).__init__() # # 定义模型的层次 # self.hidden1_layer = layers.Dense(30, activation='relu') # self.hidden2_layer = layers.Dense(30, activation='relu') # self.output_layer = layers.Dense(1) # # # def call(self, input): # # 完成模型的正向计算 # hidden1 = self.hidden1_layer(input) # hidden2 = self.hidden2_layer(hidden1) # concat = layers.concatenate([input, hidden2]) # output = self.output_layer(concat) # return output # # model = WideDeepModel() # # 也可以使用层堆叠 # # model = models.Sequential([ # # WideDeepModel() # # ]) # model.build(input_shape=(None, 8)) # 多输入 wide模型输入前5个特征,deep模型输入后6个特征 input_wide = layers.Input(shape=[5]) input_deep = layers.Input(shape=[6]) hidden1 = layers.Dense(30, activation='relu')(input_deep) hidden2 = layers.Dense(30, activation='relu')(hidden1) concat = layers.concatenate([input_wide, hidden2]) # 多输出 output1 = layers.Dense(1)(concat) output2 = layers.Dense(1)(hidden2) model = models.Model(inputs=[input_wide, input_deep], outputs=[output1, output2]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(learning_rate=0.001)) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] X_train_wide = X_train[:, :5] X_train_deep = X_train[:, 2:] X_valid_wide = X_valid[:, :5] X_valid_deep = X_valid[:, 2:] X_test_wide = X_test[:, :5] X_test_deep = X_test[:, 2:] history = model.fit([X_train_wide, X_train_deep], [y_train, y_train], validation_data=([X_valid_wide, X_valid_deep], [y_valid, y_valid]), epochs=100, callbacks=callbacks) print(model.evaluate([X_test_wide, X_test_deep], [y_test, y_test])) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "model" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_2 (InputLayer) [(None, 6)] 0 __________________________________________________________________________________________________ dense (Dense) (None, 30) 210 input_2[0][0] __________________________________________________________________________________________________ input_1 (InputLayer) [(None, 5)] 0 __________________________________________________________________________________________________ dense_1 (Dense) (None, 30) 930 dense[0][0] __________________________________________________________________________________________________ concatenate (Concatenate) (None, 35) 0 input_1[0][0] dense_1[0][0] __________________________________________________________________________________________________ dense_2 (Dense) (None, 1) 36 concatenate[0][0] __________________________________________________________________________________________________ dense_3 (Dense) (None, 1) 31 dense_1[0][0] ================================================================================================== Total params: 1,207 Trainable params: 1,207 Non-trainable params: 0 __________________________________________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 2s 151us/sample - loss: 4.6904 - dense_2_loss: 2.2887 - dense_3_loss: 2.4007 - val_loss: 2.2365 - val_dense_2_loss: 0.8763 - val_dense_3_loss: 1.3602 Epoch 2/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.8804 - dense_2_loss: 0.7132 - dense_3_loss: 1.1668 - val_loss: 1.8578 - val_dense_2_loss: 0.6893 - val_dense_3_loss: 1.1685 Epoch 3/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.6375 - dense_2_loss: 0.6051 - dense_3_loss: 1.0320 - val_loss: 1.6503 - val_dense_2_loss: 0.6125 - val_dense_3_loss: 1.0377 Epoch 4/100 11610/11610 [==============================] - 1s 63us/sample - loss: 1.4545 - dense_2_loss: 0.5502 - dense_3_loss: 0.9039 - val_loss: 1.4679 - val_dense_2_loss: 0.5670 - val_dense_3_loss: 0.9009 Epoch 5/100 11610/11610 [==============================] - 1s 61us/sample - loss: 1.3185 - dense_2_loss: 0.5166 - dense_3_loss: 0.8021 - val_loss: 1.3543 - val_dense_2_loss: 0.5365 - val_dense_3_loss: 0.8177 Epoch 6/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.2300 - dense_2_loss: 0.4951 - dense_3_loss: 0.7349 - val_loss: 1.2700 - val_dense_2_loss: 0.5162 - val_dense_3_loss: 0.7536 Epoch 7/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.1740 - dense_2_loss: 0.4805 - dense_3_loss: 0.6936 - val_loss: 1.2194 - val_dense_2_loss: 0.5032 - val_dense_3_loss: 0.7161 Epoch 8/100 11610/11610 [==============================] - 1s 61us/sample - loss: 1.1349 - dense_2_loss: 0.4695 - dense_3_loss: 0.6651 - val_loss: 1.1812 - val_dense_2_loss: 0.4888 - val_dense_3_loss: 0.6923 Epoch 9/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.1066 - dense_2_loss: 0.4612 - dense_3_loss: 0.6452 - val_loss: 1.1580 - val_dense_2_loss: 0.4876 - val_dense_3_loss: 0.6703 Epoch 10/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0847 - dense_2_loss: 0.4549 - dense_3_loss: 0.6300 - val_loss: 1.1370 - val_dense_2_loss: 0.4784 - val_dense_3_loss: 0.6585 Epoch 11/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0667 - dense_2_loss: 0.4483 - dense_3_loss: 0.6183 - val_loss: 1.1159 - val_dense_2_loss: 0.4717 - val_dense_3_loss: 0.6441 Epoch 12/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0524 - dense_2_loss: 0.4440 - dense_3_loss: 0.6086 - val_loss: 1.1014 - val_dense_2_loss: 0.4640 - val_dense_3_loss: 0.6373 Epoch 13/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0388 - dense_2_loss: 0.4397 - dense_3_loss: 0.5995 - val_loss: 1.0919 - val_dense_2_loss: 0.4677 - val_dense_3_loss: 0.6241 Epoch 14/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0277 - dense_2_loss: 0.4357 - dense_3_loss: 0.5921 - val_loss: 1.0758 - val_dense_2_loss: 0.4573 - val_dense_3_loss: 0.6184 Epoch 15/100 11610/11610 [==============================] - 1s 61us/sample - loss: 1.0185 - dense_2_loss: 0.4323 - dense_3_loss: 0.5861 - val_loss: 1.0668 - val_dense_2_loss: 0.4580 - val_dense_3_loss: 0.6087 Epoch 16/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0102 - dense_2_loss: 0.4295 - dense_3_loss: 0.5807 - val_loss: 1.0546 - val_dense_2_loss: 0.4518 - val_dense_3_loss: 0.6027 Epoch 17/100 11610/11610 [==============================] - 1s 62us/sample - loss: 1.0019 - dense_2_loss: 0.4267 - dense_3_loss: 0.5751 - val_loss: 1.0487 - val_dense_2_loss: 0.4512 - val_dense_3_loss: 0.5974 Epoch 18/100 11610/11610 [==============================] - 1s 84us/sample - loss: 0.9950 - dense_2_loss: 0.4239 - dense_3_loss: 0.5714 - val_loss: 1.0379 - val_dense_2_loss: 0.4465 - val_dense_3_loss: 0.5913 Epoch 19/100 11610/11610 [==============================] - 1s 109us/sample - loss: 0.9884 - dense_2_loss: 0.4213 - dense_3_loss: 0.5668 - val_loss: 1.0312 - val_dense_2_loss: 0.4447 - val_dense_3_loss: 0.5864 Epoch 20/100 11610/11610 [==============================] - 1s 82us/sample - loss: 0.9820 - dense_2_loss: 0.4188 - dense_3_loss: 0.5630 - val_loss: 1.0274 - val_dense_2_loss: 0.4428 - val_dense_3_loss: 0.5844 Epoch 21/100 11610/11610 [==============================] - 1s 68us/sample - loss: 0.9757 - dense_2_loss: 0.4165 - dense_3_loss: 0.5590 - val_loss: 1.0197 - val_dense_2_loss: 0.4413 - val_dense_3_loss: 0.5783 Epoch 22/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.9690 - dense_2_loss: 0.4140 - dense_3_loss: 0.5547 - val_loss: 1.0125 - val_dense_2_loss: 0.4372 - val_dense_3_loss: 0.5752 Epoch 23/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9633 - dense_2_loss: 0.4119 - dense_3_loss: 0.5514 - val_loss: 1.0073 - val_dense_2_loss: 0.4348 - val_dense_3_loss: 0.5723 Epoch 24/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9581 - dense_2_loss: 0.4105 - dense_3_loss: 0.5483 - val_loss: 1.0053 - val_dense_2_loss: 0.4386 - val_dense_3_loss: 0.5666 Epoch 25/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9543 - dense_2_loss: 0.4085 - dense_3_loss: 0.5457 - val_loss: 0.9971 - val_dense_2_loss: 0.4320 - val_dense_3_loss: 0.5650 Epoch 26/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9473 - dense_2_loss: 0.4054 - dense_3_loss: 0.5417 - val_loss: 0.9948 - val_dense_2_loss: 0.4335 - val_dense_3_loss: 0.5612 Epoch 27/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9427 - dense_2_loss: 0.4044 - dense_3_loss: 0.5383 - val_loss: 0.9884 - val_dense_2_loss: 0.4279 - val_dense_3_loss: 0.5604 Epoch 28/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9392 - dense_2_loss: 0.4028 - dense_3_loss: 0.5362 - val_loss: 0.9836 - val_dense_2_loss: 0.4280 - val_dense_3_loss: 0.5555 Epoch 29/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9333 - dense_2_loss: 0.4003 - dense_3_loss: 0.5329 - val_loss: 0.9803 - val_dense_2_loss: 0.4257 - val_dense_3_loss: 0.5544 Epoch 30/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9297 - dense_2_loss: 0.3990 - dense_3_loss: 0.5304 - val_loss: 0.9735 - val_dense_2_loss: 0.4229 - val_dense_3_loss: 0.5505 Epoch 31/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.9257 - dense_2_loss: 0.3978 - dense_3_loss: 0.5278 - val_loss: 0.9735 - val_dense_2_loss: 0.4216 - val_dense_3_loss: 0.5518 Epoch 32/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9202 - dense_2_loss: 0.3956 - dense_3_loss: 0.5247 - val_loss: 0.9665 - val_dense_2_loss: 0.4209 - val_dense_3_loss: 0.5455 Epoch 33/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9178 - dense_2_loss: 0.3946 - dense_3_loss: 0.5229 - val_loss: 0.9594 - val_dense_2_loss: 0.4180 - val_dense_3_loss: 0.5413 Epoch 34/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9121 - dense_2_loss: 0.3925 - dense_3_loss: 0.5197 - val_loss: 0.9559 - val_dense_2_loss: 0.4147 - val_dense_3_loss: 0.5411 Epoch 35/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9080 - dense_2_loss: 0.3910 - dense_3_loss: 0.5168 - val_loss: 0.9536 - val_dense_2_loss: 0.4119 - val_dense_3_loss: 0.5415 Epoch 36/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9046 - dense_2_loss: 0.3900 - dense_3_loss: 0.5146 - val_loss: 0.9511 - val_dense_2_loss: 0.4139 - val_dense_3_loss: 0.5371 Epoch 37/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.9000 - dense_2_loss: 0.3882 - dense_3_loss: 0.5118 - val_loss: 0.9507 - val_dense_2_loss: 0.4199 - val_dense_3_loss: 0.5307 Epoch 38/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8990 - dense_2_loss: 0.3884 - dense_3_loss: 0.5110 - val_loss: 0.9416 - val_dense_2_loss: 0.4145 - val_dense_3_loss: 0.5270 Epoch 39/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8928 - dense_2_loss: 0.3859 - dense_3_loss: 0.5071 - val_loss: 0.9357 - val_dense_2_loss: 0.4092 - val_dense_3_loss: 0.5264 Epoch 40/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8882 - dense_2_loss: 0.3838 - dense_3_loss: 0.5044 - val_loss: 0.9325 - val_dense_2_loss: 0.4092 - val_dense_3_loss: 0.5233 Epoch 41/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8846 - dense_2_loss: 0.3831 - dense_3_loss: 0.5016 - val_loss: 0.9277 - val_dense_2_loss: 0.4055 - val_dense_3_loss: 0.5221 Epoch 42/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8831 - dense_2_loss: 0.3827 - dense_3_loss: 0.5002 - val_loss: 0.9259 - val_dense_2_loss: 0.4053 - val_dense_3_loss: 0.5205 Epoch 43/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8804 - dense_2_loss: 0.3817 - dense_3_loss: 0.4987 - val_loss: 0.9199 - val_dense_2_loss: 0.4035 - val_dense_3_loss: 0.5163 Epoch 44/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8737 - dense_2_loss: 0.3792 - dense_3_loss: 0.4946 - val_loss: 0.9165 - val_dense_2_loss: 0.4009 - val_dense_3_loss: 0.5154 Epoch 45/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8698 - dense_2_loss: 0.3776 - dense_3_loss: 0.4920 - val_loss: 0.9099 - val_dense_2_loss: 0.3978 - val_dense_3_loss: 0.5120 Epoch 46/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8689 - dense_2_loss: 0.3779 - dense_3_loss: 0.4910 - val_loss: 0.9068 - val_dense_2_loss: 0.3983 - val_dense_3_loss: 0.5084 Epoch 47/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8622 - dense_2_loss: 0.3751 - dense_3_loss: 0.4870 - val_loss: 0.9008 - val_dense_2_loss: 0.3938 - val_dense_3_loss: 0.5069 Epoch 48/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8588 - dense_2_loss: 0.3739 - dense_3_loss: 0.4848 - val_loss: 0.8974 - val_dense_2_loss: 0.3932 - val_dense_3_loss: 0.5041 Epoch 49/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8582 - dense_2_loss: 0.3740 - dense_3_loss: 0.4840 - val_loss: 0.8923 - val_dense_2_loss: 0.3919 - val_dense_3_loss: 0.5003 Epoch 50/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8522 - dense_2_loss: 0.3718 - dense_3_loss: 0.4803 - val_loss: 0.8924 - val_dense_2_loss: 0.3922 - val_dense_3_loss: 0.5000 Epoch 51/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.8503 - dense_2_loss: 0.3715 - dense_3_loss: 0.4789 - val_loss: 0.8888 - val_dense_2_loss: 0.3900 - val_dense_3_loss: 0.4986 Epoch 52/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.8487 - dense_2_loss: 0.3714 - dense_3_loss: 0.4772 - val_loss: 0.8834 - val_dense_2_loss: 0.3910 - val_dense_3_loss: 0.4923 Epoch 53/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8443 - dense_2_loss: 0.3696 - dense_3_loss: 0.4746 - val_loss: 0.8799 - val_dense_2_loss: 0.3882 - val_dense_3_loss: 0.4915 Epoch 54/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8423 - dense_2_loss: 0.3691 - dense_3_loss: 0.4731 - val_loss: 0.8745 - val_dense_2_loss: 0.3870 - val_dense_3_loss: 0.4874 Epoch 55/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8385 - dense_2_loss: 0.3679 - dense_3_loss: 0.4705 - val_loss: 0.8729 - val_dense_2_loss: 0.3859 - val_dense_3_loss: 0.4870 Epoch 56/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8307 - dense_2_loss: 0.3647 - dense_3_loss: 0.4659 - val_loss: 0.8685 - val_dense_2_loss: 0.3823 - val_dense_3_loss: 0.4861 Epoch 57/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.8316 - dense_2_loss: 0.3654 - dense_3_loss: 0.4663 - val_loss: 0.8642 - val_dense_2_loss: 0.3818 - val_dense_3_loss: 0.4823 Epoch 58/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8277 - dense_2_loss: 0.3640 - dense_3_loss: 0.4636 - val_loss: 0.8592 - val_dense_2_loss: 0.3810 - val_dense_3_loss: 0.4781 Epoch 59/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8323 - dense_2_loss: 0.3661 - dense_3_loss: 0.4661 - val_loss: 0.8578 - val_dense_2_loss: 0.3809 - val_dense_3_loss: 0.4768 Epoch 60/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8185 - dense_2_loss: 0.3608 - dense_3_loss: 0.4580 - val_loss: 0.8512 - val_dense_2_loss: 0.3777 - val_dense_3_loss: 0.4734 Epoch 61/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8188 - dense_2_loss: 0.3609 - dense_3_loss: 0.4577 - val_loss: 0.8514 - val_dense_2_loss: 0.3779 - val_dense_3_loss: 0.4734 Epoch 62/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8165 - dense_2_loss: 0.3608 - dense_3_loss: 0.4556 - val_loss: 0.8442 - val_dense_2_loss: 0.3746 - val_dense_3_loss: 0.4695 Epoch 63/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.8118 - dense_2_loss: 0.3589 - dense_3_loss: 0.4530 - val_loss: 0.8407 - val_dense_2_loss: 0.3724 - val_dense_3_loss: 0.4682 Epoch 64/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8097 - dense_2_loss: 0.3587 - dense_3_loss: 0.4512 - val_loss: 0.8400 - val_dense_2_loss: 0.3758 - val_dense_3_loss: 0.4640 Epoch 65/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8025 - dense_2_loss: 0.3552 - dense_3_loss: 0.4471 - val_loss: 0.8353 - val_dense_2_loss: 0.3721 - val_dense_3_loss: 0.4631 Epoch 66/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7997 - dense_2_loss: 0.3542 - dense_3_loss: 0.4456 - val_loss: 0.8299 - val_dense_2_loss: 0.3707 - val_dense_3_loss: 0.4591 Epoch 67/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.8013 - dense_2_loss: 0.3553 - dense_3_loss: 0.4458 - val_loss: 0.8289 - val_dense_2_loss: 0.3691 - val_dense_3_loss: 0.4597 Epoch 68/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7985 - dense_2_loss: 0.3548 - dense_3_loss: 0.4436 - val_loss: 0.8209 - val_dense_2_loss: 0.3677 - val_dense_3_loss: 0.4532 Epoch 69/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7968 - dense_2_loss: 0.3538 - dense_3_loss: 0.4428 - val_loss: 0.8211 - val_dense_2_loss: 0.3682 - val_dense_3_loss: 0.4527 Epoch 70/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7889 - dense_2_loss: 0.3510 - dense_3_loss: 0.4378 - val_loss: 0.8174 - val_dense_2_loss: 0.3667 - val_dense_3_loss: 0.4506 Epoch 71/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7877 - dense_2_loss: 0.3506 - dense_3_loss: 0.4373 - val_loss: 0.8115 - val_dense_2_loss: 0.3632 - val_dense_3_loss: 0.4482 Epoch 72/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7845 - dense_2_loss: 0.3496 - dense_3_loss: 0.4354 - val_loss: 0.8157 - val_dense_2_loss: 0.3665 - val_dense_3_loss: 0.4490 Epoch 73/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7818 - dense_2_loss: 0.3487 - dense_3_loss: 0.4332 - val_loss: 0.8084 - val_dense_2_loss: 0.3622 - val_dense_3_loss: 0.4461 Epoch 74/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.7843 - dense_2_loss: 0.3501 - dense_3_loss: 0.4348 - val_loss: 0.8084 - val_dense_2_loss: 0.3620 - val_dense_3_loss: 0.4463 Epoch 75/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7785 - dense_2_loss: 0.3474 - dense_3_loss: 0.4311 - val_loss: 0.8079 - val_dense_2_loss: 0.3622 - val_dense_3_loss: 0.4457 Epoch 76/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.7765 - dense_2_loss: 0.3470 - dense_3_loss: 0.4295 - val_loss: 0.8049 - val_dense_2_loss: 0.3639 - val_dense_3_loss: 0.4409 Epoch 77/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7735 - dense_2_loss: 0.3460 - dense_3_loss: 0.4276 - val_loss: 0.8012 - val_dense_2_loss: 0.3612 - val_dense_3_loss: 0.4399 Epoch 78/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7730 - dense_2_loss: 0.3459 - dense_3_loss: 0.4273 - val_loss: 0.8023 - val_dense_2_loss: 0.3603 - val_dense_3_loss: 0.4419 Epoch 79/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7756 - dense_2_loss: 0.3472 - dense_3_loss: 0.4284 - val_loss: 0.7986 - val_dense_2_loss: 0.3576 - val_dense_3_loss: 0.4409 Epoch 80/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7761 - dense_2_loss: 0.3475 - dense_3_loss: 0.4286 - val_loss: 0.7979 - val_dense_2_loss: 0.3598 - val_dense_3_loss: 0.4380 Epoch 81/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7733 - dense_2_loss: 0.3466 - dense_3_loss: 0.4267 - val_loss: 0.7936 - val_dense_2_loss: 0.3593 - val_dense_3_loss: 0.4341 Epoch 82/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7655 - dense_2_loss: 0.3430 - dense_3_loss: 0.4224 - val_loss: 0.7945 - val_dense_2_loss: 0.3580 - val_dense_3_loss: 0.4363 Epoch 83/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7669 - dense_2_loss: 0.3442 - dense_3_loss: 0.4224 - val_loss: 0.7913 - val_dense_2_loss: 0.3572 - val_dense_3_loss: 0.4340 Epoch 84/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7617 - dense_2_loss: 0.3424 - dense_3_loss: 0.4194 - val_loss: 0.7889 - val_dense_2_loss: 0.3561 - val_dense_3_loss: 0.4326 Epoch 85/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7601 - dense_2_loss: 0.3414 - dense_3_loss: 0.4186 - val_loss: 0.7866 - val_dense_2_loss: 0.3560 - val_dense_3_loss: 0.4304 Epoch 86/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7578 - dense_2_loss: 0.3408 - dense_3_loss: 0.4169 - val_loss: 0.7873 - val_dense_2_loss: 0.3562 - val_dense_3_loss: 0.4309 Epoch 87/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.7631 - dense_2_loss: 0.3432 - dense_3_loss: 0.4198 - val_loss: 0.7842 - val_dense_2_loss: 0.3540 - val_dense_3_loss: 0.4302 Epoch 88/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7603 - dense_2_loss: 0.3422 - dense_3_loss: 0.4181 - val_loss: 0.7832 - val_dense_2_loss: 0.3549 - val_dense_3_loss: 0.4282 Epoch 89/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7542 - dense_2_loss: 0.3391 - dense_3_loss: 0.4148 - val_loss: 0.7893 - val_dense_2_loss: 0.3571 - val_dense_3_loss: 0.4320 Epoch 90/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7528 - dense_2_loss: 0.3391 - dense_3_loss: 0.4139 - val_loss: 0.7808 - val_dense_2_loss: 0.3533 - val_dense_3_loss: 0.4274 Epoch 91/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7523 - dense_2_loss: 0.3385 - dense_3_loss: 0.4137 - val_loss: 0.7778 - val_dense_2_loss: 0.3532 - val_dense_3_loss: 0.4245 Epoch 92/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7514 - dense_2_loss: 0.3390 - dense_3_loss: 0.4130 - val_loss: 0.7748 - val_dense_2_loss: 0.3507 - val_dense_3_loss: 0.4241 Epoch 93/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.7479 - dense_2_loss: 0.3371 - dense_3_loss: 0.4106 - val_loss: 0.7771 - val_dense_2_loss: 0.3529 - val_dense_3_loss: 0.4241 Epoch 94/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7477 - dense_2_loss: 0.3371 - dense_3_loss: 0.4105 - val_loss: 0.7711 - val_dense_2_loss: 0.3500 - val_dense_3_loss: 0.4210 Epoch 95/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7519 - dense_2_loss: 0.3391 - dense_3_loss: 0.4126 - val_loss: 0.7720 - val_dense_2_loss: 0.3507 - val_dense_3_loss: 0.4212 Epoch 96/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.7544 - dense_2_loss: 0.3404 - dense_3_loss: 0.4140 - val_loss: 0.7853 - val_dense_2_loss: 0.3559 - val_dense_3_loss: 0.4293 Epoch 97/100 11610/11610 [==============================] - 1s 81us/sample - loss: 0.7543 - dense_2_loss: 0.3404 - dense_3_loss: 0.4140 - val_loss: 0.7712 - val_dense_2_loss: 0.3506 - val_dense_3_loss: 0.4205 Epoch 98/100 11610/11610 [==============================] - 1s 95us/sample - loss: 0.7540 - dense_2_loss: 0.3405 - dense_3_loss: 0.4140 - val_loss: 0.7728 - val_dense_2_loss: 0.3520 - val_dense_3_loss: 0.4207 Epoch 99/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.7424 - dense_2_loss: 0.3352 - dense_3_loss: 0.4070 - val_loss: 0.7710 - val_dense_2_loss: 0.3507 - val_dense_3_loss: 0.4203 5160/1 [====================================================] - 0s 29us/sample - loss: 0.8831 - dense_2_loss: 0.3513 - dense_3_loss: 0.4160 [0.7661929805149403, 0.35130394, 0.41597202]
这里会有三组线,一个是总的,一个是第一个输出,一个是第二个输出。
基础API
我们现在来看一下tensorflow中最基本的常量操作
import tensorflow as tf import numpy as np if __name__ == "__main__": # 定义矩阵常量 t = tf.constant([[1., 2., 3.], [4., 5., 6.]]) print(t) print(t[:, 1:]) print(t[:, 1]) # 算子 print(t + 10) # 计算平方 print(tf.square(t)) # 计算它本身和它转置的点乘 print(t @ tf.transpose(t)) # 获取numpy的值 print(t.numpy()) # 作为numpy的输入 print(np.square(t)) # 将numpy对象转成tensorflow对象 np_t = np.array([[1., 2., 3.], [4., 5., 6.]]) print(tf.constant(np_t)) # 标量 num = tf.constant(2.718) print(num) print(num.numpy()) print(num.shape) # 字符串 t = tf.constant("coffee") print(t) print(tf.strings.length(t)) print(tf.strings.length(t, unit='UTF8_CHAR')) # 解码成utf8编码 print(tf.strings.unicode_decode(t, 'UTF8')) # 字符串数组 t = tf.constant(['cafe', 'coffee', '咖啡']) print(t) print(tf.strings.length(t, unit='UTF8_CHAR')) print(tf.strings.unicode_decode(t, 'UTF8')) # ragged tensor不等长的数组 r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]]) print(r) print(r[1]) print(r[1:3]) # ragged tensor算子 r2 = tf.ragged.constant([[51, 52], [], [71], [42, 43]]) # 在第0个维度上进行拼接 print(tf.concat([r, r2], axis=0)) # 在第1个维度上进行拼接,如果第一个维度的数量不相等,会报错 print(tf.concat([r, r2], axis=1)) # 将ragged tensor转化为普通tensor,空缺位置补0 print(r.to_tensor()) # sparse tensor 大部分位置的值为0,只有少部分不为0 # indices必须排序放置,否则转普通tensor会报错 s = tf.SparseTensor(indices=[[0, 1], [1, 0], [2, 3]], values=[1., 2., 3], dense_shape=[3, 4]) print(s) # 将sparse tensor转化为普通的tensor print(tf.sparse.to_dense(s)) # sparse tensor算子 s2 = s * 2.0 print(s2) try: s3 = s + 1. except TypeError as ex: print(ex) s4 = tf.constant([[10., 20.], [30., 40.], [50., 60.], [70., 80.]]) # 矩阵乘法 print(tf.sparse.sparse_dense_matmul(s, s4)) s5 = tf.SparseTensor(indices=[[0, 2], [0, 1], [2, 3]], values=[1., 2., 3], dense_shape=[3, 4]) print(s5) try: print(tf.sparse.to_dense(s5)) except Exception as ex: print(ex) s6 = tf.sparse.reorder(s5) print(tf.sparse.to_dense(s6))
运行结果
tf.Tensor( [[1. 2. 3.] [4. 5. 6.]], shape=(2, 3), dtype=float32) tf.Tensor( [[2. 3.] [5. 6.]], shape=(2, 2), dtype=float32) tf.Tensor([2. 5.], shape=(2,), dtype=float32) tf.Tensor( [[11. 12. 13.] [14. 15. 16.]], shape=(2, 3), dtype=float32) tf.Tensor( [[ 1. 4. 9.] [16. 25. 36.]], shape=(2, 3), dtype=float32) tf.Tensor( [[14. 32.] [32. 77.]], shape=(2, 2), dtype=float32) [[1. 2. 3.] [4. 5. 6.]] [[ 1. 4. 9.] [16. 25. 36.]] tf.Tensor( [[1. 2. 3.] [4. 5. 6.]], shape=(2, 3), dtype=float64) tf.Tensor(2.718, shape=(), dtype=float32) 2.718 () tf.Tensor(b'coffee', shape=(), dtype=string) tf.Tensor(6, shape=(), dtype=int32) tf.Tensor(6, shape=(), dtype=int32) tf.Tensor([ 99 111 102 102 101 101], shape=(6,), dtype=int32) tf.Tensor([b'cafe' b'coffee' b'\xe5\x92\x96\xe5\x95\xa1'], shape=(3,), dtype=string) tf.Tensor([4 6 2], shape=(3,), dtype=int32) <tf.RaggedTensor [[99, 97, 102, 101], [99, 111, 102, 102, 101, 101], [21654, 21857]]> <tf.RaggedTensor [[11, 12], [21, 22, 23], [], [41]]> tf.Tensor([21 22 23], shape=(3,), dtype=int32) <tf.RaggedTensor [[21, 22, 23], []]> <tf.RaggedTensor [[11, 12], [21, 22, 23], [], [41], [51, 52], [], [71], [42, 43]]> <tf.RaggedTensor [[11, 12, 51, 52], [21, 22, 23], [71], [41, 42, 43]]> tf.Tensor( [[11 12 0] [21 22 23] [ 0 0 0] [41 0 0]], shape=(4, 3), dtype=int32) SparseTensor(indices=tf.Tensor( [[0 1] [1 0] [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) tf.Tensor( [[0. 1. 0. 0.] [2. 0. 0. 0.] [0. 0. 0. 3.]], shape=(3, 4), dtype=float32) SparseTensor(indices=tf.Tensor( [[0 1] [1 0] [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([2. 4. 6.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) unsupported operand type(s) for +: 'SparseTensor' and 'float' tf.Tensor( [[ 30. 40.] [ 20. 40.] [210. 240.]], shape=(3, 2), dtype=float32) SparseTensor(indices=tf.Tensor( [[0 2] [0 1] [2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) indices[1] = [0,1] is out of order [Op:SparseToDense] tf.Tensor( [[0. 2. 1. 0.] [0. 0. 0. 0.] [0. 0. 0. 3.]], shape=(3, 4), dtype=float32)
现在我们来看一下它的变量操作
import tensorflow as tf import numpy as np if __name__ == "__main__": v = tf.Variable([[1., 2., 3.], [4., 5., 6.]]) print(v) # 转化为常量 print(v.value()) print(v.numpy()) # 重新赋值 v.assign(2 * v) print(v) # 给变量的某个位置重新赋值 v[0, 1].assign(42) print(v) # 给变量的某一行重新赋值 v[1].assign([7., 8., 9.]) print(v) # 不能直接使用=赋值 try: v[0] = [10., 20., 30.] except TypeError as ex: print(ex)
运行结果
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy= array([[1., 2., 3.], [4., 5., 6.]], dtype=float32)> tf.Tensor( [[1. 2. 3.] [4. 5. 6.]], shape=(2, 3), dtype=float32) [[1. 2. 3.] [4. 5. 6.]] <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy= array([[ 2., 4., 6.], [ 8., 10., 12.]], dtype=float32)> <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy= array([[ 2., 42., 6.], [ 8., 10., 12.]], dtype=float32)> <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy= array([[ 2., 42., 6.], [ 7., 8., 9.]], dtype=float32)> 'ResourceVariable' object does not support item assignment
自定义损失函数
这里我们还是以加利福尼亚的房价回归问题来说明
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) def customized_mse(y_true, y_pred): # 自定义损失函数 return tf.reduce_mean(tf.square(y_pred - y_true)) model = keras.models.Sequential([ layers.Dense(30, activation='relu', input_shape=X_train.shape[1:]), layers.Dense(1) ]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss=customized_mse, optimizer=optimizers.SGD(learning_rate=0.01), metrics=['mean_squared_error']) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] history = model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=100, callbacks=callbacks) print(model.evaluate(X_test, y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 30) 270 _________________________________________________________________ dense_1 (Dense) (None, 1) 31 ================================================================= Total params: 301 Trainable params: 301 Non-trainable params: 0 _________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 1s 119us/sample - loss: 1.5018 - mean_squared_error: 1.5018 - val_loss: 0.8721 - val_mean_squared_error: 0.8721 Epoch 2/100 11610/11610 [==============================] - 0s 43us/sample - loss: 1.8099 - mean_squared_error: 1.8099 - val_loss: 0.5967 - val_mean_squared_error: 0.5967 Epoch 3/100 11610/11610 [==============================] - 1s 43us/sample - loss: 0.4971 - mean_squared_error: 0.4971 - val_loss: 0.4621 - val_mean_squared_error: 0.4621 Epoch 4/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.4396 - mean_squared_error: 0.4396 - val_loss: 0.4405 - val_mean_squared_error: 0.4405 Epoch 5/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.4121 - mean_squared_error: 0.4121 - val_loss: 0.4133 - val_mean_squared_error: 0.4133 Epoch 6/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.4043 - mean_squared_error: 0.4043 - val_loss: 0.4039 - val_mean_squared_error: 0.4039 Epoch 7/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3896 - mean_squared_error: 0.3896 - val_loss: 0.4000 - val_mean_squared_error: 0.4000 Epoch 8/100 11610/11610 [==============================] - 1s 70us/sample - loss: 0.3796 - mean_squared_error: 0.3796 - val_loss: 0.3936 - val_mean_squared_error: 0.3936 Epoch 9/100 11610/11610 [==============================] - 0s 43us/sample - loss: 0.3771 - mean_squared_error: 0.3771 - val_loss: 0.5541 - val_mean_squared_error: 0.5541 Epoch 10/100 11610/11610 [==============================] - 1s 46us/sample - loss: 0.3820 - mean_squared_error: 0.3820 - val_loss: 0.3874 - val_mean_squared_error: 0.3874 Epoch 11/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3686 - mean_squared_error: 0.3686 - val_loss: 0.3758 - val_mean_squared_error: 0.3758 Epoch 12/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3666 - mean_squared_error: 0.3666 - val_loss: 0.3867 - val_mean_squared_error: 0.3867 Epoch 13/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3632 - mean_squared_error: 0.3632 - val_loss: 0.3711 - val_mean_squared_error: 0.3711 Epoch 14/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3592 - mean_squared_error: 0.3592 - val_loss: 0.3790 - val_mean_squared_error: 0.3790 Epoch 15/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3578 - mean_squared_error: 0.3578 - val_loss: 0.3687 - val_mean_squared_error: 0.3687 Epoch 16/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3547 - mean_squared_error: 0.3547 - val_loss: 0.3691 - val_mean_squared_error: 0.3691 Epoch 17/100 11610/11610 [==============================] - 1s 52us/sample - loss: 0.3530 - mean_squared_error: 0.3530 - val_loss: 0.3690 - val_mean_squared_error: 0.3690 Epoch 18/100 11610/11610 [==============================] - 1s 54us/sample - loss: 0.3549 - mean_squared_error: 0.3549 - val_loss: 0.3625 - val_mean_squared_error: 0.3625 Epoch 19/100 11610/11610 [==============================] - 1s 54us/sample - loss: 0.3506 - mean_squared_error: 0.3506 - val_loss: 0.3605 - val_mean_squared_error: 0.3605 Epoch 20/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3481 - mean_squared_error: 0.3481 - val_loss: 0.3610 - val_mean_squared_error: 0.3610 Epoch 21/100 11610/11610 [==============================] - 1s 72us/sample - loss: 0.3479 - mean_squared_error: 0.3479 - val_loss: 0.3601 - val_mean_squared_error: 0.3601 Epoch 22/100 11610/11610 [==============================] - 1s 63us/sample - loss: 0.3448 - mean_squared_error: 0.3448 - val_loss: 0.3578 - val_mean_squared_error: 0.3578 Epoch 23/100 11610/11610 [==============================] - 1s 73us/sample - loss: 0.3457 - mean_squared_error: 0.3457 - val_loss: 0.3611 - val_mean_squared_error: 0.3611 Epoch 24/100 11610/11610 [==============================] - 0s 42us/sample - loss: 0.3447 - mean_squared_error: 0.3447 - val_loss: 0.3539 - val_mean_squared_error: 0.3539 Epoch 25/100 11610/11610 [==============================] - 1s 55us/sample - loss: 0.3432 - mean_squared_error: 0.3432 - val_loss: 0.3515 - val_mean_squared_error: 0.3515 Epoch 26/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3404 - mean_squared_error: 0.3404 - val_loss: 0.3544 - val_mean_squared_error: 0.3544 Epoch 27/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3406 - mean_squared_error: 0.3406 - val_loss: 0.3504 - val_mean_squared_error: 0.3504 Epoch 28/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3389 - mean_squared_error: 0.3389 - val_loss: 0.3514 - val_mean_squared_error: 0.3514 Epoch 29/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3385 - mean_squared_error: 0.3385 - val_loss: 0.3470 - val_mean_squared_error: 0.3470 Epoch 30/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3375 - mean_squared_error: 0.3375 - val_loss: 0.3513 - val_mean_squared_error: 0.3513 Epoch 31/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3362 - mean_squared_error: 0.3362 - val_loss: 0.3474 - val_mean_squared_error: 0.3474 Epoch 32/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3351 - mean_squared_error: 0.3351 - val_loss: 0.3493 - val_mean_squared_error: 0.3493 Epoch 33/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3349 - mean_squared_error: 0.3349 - val_loss: 0.3461 - val_mean_squared_error: 0.3461 Epoch 34/100 11610/11610 [==============================] - 0s 41us/sample - loss: 0.3326 - mean_squared_error: 0.3326 - val_loss: 0.3464 - val_mean_squared_error: 0.3464 5160/1 [=====================================================] - 0s 20us/sample - loss: 0.5104 - mean_squared_error: 0.3525 [0.3524518048116403, 0.3524517]
这里我们可以看到我们自己实现的均方误差损失函数和系统自带的均方误差损失函数是一样,他们损失函数值曲线是重合的。
自定义Layers
我们先来看一下Layers的一些特性
import tensorflow as tf from tensorflow.keras import layers if __name__ == "__main__": # 我们一般会在全连接层的第一层的时候输入input_shape # 不使用input_shape也没关系,它会在第一次运行的时候推导出来 layer = layers.Dense(100, input_shape=(None, 5)) # 这里会点乘一个[5, 100]的矩阵转成[None, 100]的输出 print(layer(tf.zeros([10, 5]))) # 打印该层所有的参数 print(layer.variables) # 打印该层所有可训练的参数 print(layer.trainable_variables)
运行结果
tf.Tensor( [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(10, 100), dtype=float32) [<tf.Variable 'dense/kernel:0' shape=(5, 100) dtype=float32, numpy= array([[ 0.17777802, -0.0925342 , 0.22044905, -0.1196067 , -0.15553904, -0.19373423, -0.13884991, -0.23252396, -0.01252402, -0.09044193, -0.06529157, 0.22907178, -0.1411261 , 0.20145597, 0.11501376, -0.15268266, -0.17305377, -0.01125969, -0.10907765, 0.0403709 , 0.06923743, -0.00155647, -0.18127626, 0.11550726, 0.03372289, 0.13893865, -0.0092984 , -0.20496821, -0.02627921, 0.01125975, -0.04647307, 0.15463649, 0.17841218, 0.17077957, -0.0842554 , 0.0047874 , -0.12141771, 0.22519882, 0.23548423, 0.06460319, -0.03109986, -0.12173892, -0.02452356, -0.04257253, 0.2064407 , -0.06991957, 0.06425266, -0.1007075 , 0.19131865, -0.1955776 , 0.21193884, -0.2004574 , -0.07692617, -0.08107474, 0.1934263 , 0.05712549, 0.01886164, -0.12672797, -0.17843167, -0.05964956, -0.238883 , -0.21325174, 0.11310308, -0.00318795, -0.12962502, -0.16521364, 0.12938736, -0.23181748, 0.21444045, -0.12927116, -0.18740693, 0.05530755, 0.0146782 , 0.21035798, -0.15627733, -0.01847358, -0.08605188, -0.0206164 , 0.20378043, -0.03834918, 0.0639727 , -0.06449054, 0.17925756, -0.14535832, 0.22247057, 0.08074225, 0.19761471, -0.20858642, 0.17465816, -0.12256925, -0.07192959, -0.01034951, -0.2167171 , 0.02262951, -0.2061531 , 0.19094323, -0.0974756 , 0.21508281, -0.01393197, 0.19384028], [-0.02444541, -0.21043453, 0.06121971, -0.18661837, -0.1679871 , 0.17915292, 0.0956945 , -0.03815825, -0.10663904, -0.04658341, -0.18815587, -0.04888278, 0.19361894, -0.13932027, -0.2013808 , -0.2031331 , -0.12357853, 0.15468134, -0.16377276, -0.15836287, -0.03290932, 0.09049819, -0.10049133, -0.1802709 , 0.11397789, -0.22433408, -0.01369557, -0.21804577, 0.13998653, -0.0452639 , -0.10171422, -0.15374628, -0.07929 , 0.08984323, 0.11814152, 0.13589476, 0.05618854, 0.1663635 , -0.01764336, 0.09068643, -0.1157929 , -0.1266903 , -0.07107972, 0.15617536, -0.1517889 , -0.21622056, -0.17632967, 0.14407007, 0.10903122, -0.00500569, 0.05290176, -0.03641239, -0.2377142 , -0.12242448, -0.07954802, 0.09190597, -0.09879458, -0.18804912, -0.14522013, 0.07479332, 0.17024298, 0.0161783 , -0.0524762 , 0.0176069 , -0.08270177, 0.16904478, 0.17900594, 0.15703659, 0.19818316, -0.1625318 , -0.12794688, -0.1563586 , -0.09517953, 0.09158082, 0.23767962, 0.20551957, 0.14481695, 0.2045602 , -0.06479037, 0.05358954, 0.1212578 , -0.02165481, -0.1284295 , -0.08271579, -0.05446866, 0.05413379, 0.00234202, 0.22771172, -0.2224471 , -0.03084002, -0.19375737, 0.0798779 , -0.09207922, 0.13679741, -0.1429534 , 0.0209298 , -0.0841022 , -0.16638935, 0.0903822 , -0.19967408], [ 0.11377819, -0.03955515, 0.02814175, 0.04407446, 0.02015819, -0.01894131, 0.14453827, 0.07663743, -0.2206468 , -0.23865755, -0.23881991, 0.01236854, -0.09480104, 0.20786951, -0.02678156, -0.0305012 , -0.05566147, -0.21860714, -0.1938608 , 0.053019 , -0.05170445, -0.1206295 , -0.22782467, 0.06737016, 0.05737154, 0.01793937, -0.2030854 , -0.14422959, -0.17374498, -0.02698712, -0.13331282, 0.12249409, -0.19247851, 0.14200823, -0.16609323, 0.14399786, 0.21913432, -0.21645993, -0.191912 , 0.0571617 , 0.19024946, 0.08669983, 0.08364411, -0.1892563 , -0.02523425, 0.11180784, 0.00898317, 0.03620596, -0.08056329, 0.19991381, 0.11432077, 0.1168678 , -0.1644195 , 0.00769468, 0.22227935, -0.20849067, 0.15359052, 0.1345963 , -0.21721914, 0.0614645 , 0.12685539, 0.11890687, -0.20878732, -0.15853551, 0.0458544 , -0.15758611, -0.16187118, -0.09367229, -0.16155185, -0.18485507, -0.13647649, -0.12254263, -0.05565156, -0.18738703, -0.06917199, -0.03574945, 0.17475249, -0.17476122, -0.10158296, 0.12375195, 0.18355547, 0.03811152, 0.07888819, 0.09909324, -0.15394625, 0.11169995, -0.09254411, -0.10357954, 0.19252472, 0.02573626, -0.01318276, -0.09475978, -0.1874548 , -0.19183636, -0.18057513, -0.15745679, 0.18442439, 0.08096658, -0.01627833, 0.05583473], [-0.04097484, 0.23634328, -0.1889084 , 0.08590437, 0.17894466, -0.11124423, 0.18041344, -0.21274638, 0.11614217, 0.10249467, 0.21891718, 0.19230996, 0.15266438, -0.10032661, -0.22356763, 0.11601089, -0.08055103, 0.00928256, 0.16465248, -0.04512097, -0.17905587, -0.23013544, -0.00562099, -0.09802979, -0.22574061, 0.02589588, 0.19565006, 0.09272386, -0.13209037, -0.21364078, -0.15901634, 0.21333267, -0.22375406, -0.17148429, 0.15592472, -0.1618546 , 0.20303024, 0.04697676, 0.20634227, -0.1878765 , 0.22583528, -0.12808219, 0.18875875, -0.19559893, 0.15292238, 0.08833222, 0.1192212 , 0.12659721, 0.12049772, -0.21185097, 0.16098978, -0.11107406, -0.13046448, 0.21239029, 0.00350848, 0.15068768, -0.0189786 , 0.1369033 , -0.10414104, 0.16339312, -0.09338254, -0.14816928, -0.2035834 , 0.16379024, 0.01705651, 0.11921181, 0.23129468, 0.18642814, -0.17961605, 0.22902219, 0.2109852 , -0.19536257, 0.06335585, 0.05963777, 0.0976281 , 0.00718886, 0.02180146, 0.16579719, -0.23447831, -0.22135682, -0.15220946, -0.03425349, -0.16059369, -0.17343065, 0.12119611, 0.07790975, -0.07582501, -0.03742242, 0.18471824, 0.20959799, -0.22154935, -0.2013107 , -0.12604958, 0.12774341, -0.01246983, -0.18907636, 0.03709231, -0.02248657, 0.03133444, -0.1615734 ], [-0.16601531, 0.21792419, -0.1103511 , 0.0025705 , -0.05631484, 0.07372896, 0.18572135, -0.07337801, -0.01120584, -0.13398278, -0.04314138, 0.17321984, 0.11909981, -0.15493754, 0.07232957, 0.13085563, -0.2287109 , -0.21197955, 0.1428767 , 0.1137528 , -0.14559013, 0.13985835, 0.12416814, -0.05637537, -0.0046737 , 0.00876671, 0.05863507, -0.03590567, 0.10624601, -0.1412015 , 0.15561827, 0.10837926, -0.1810194 , -0.05347614, 0.03898682, -0.10682511, -0.16920623, -0.18795235, -0.08359696, 0.18185644, -0.19991723, -0.05360089, 0.13864844, 0.1414309 , -0.23352294, 0.21933769, -0.2087497 , 0.02414815, -0.20864718, -0.01974651, -0.12589416, -0.04501775, 0.09451391, 0.01687138, 0.13819186, -0.21920864, 0.22943564, 0.22025959, 0.07460229, -0.11851113, 0.04449643, -0.11150999, 0.18484862, 0.18422444, -0.19684097, 0.125441 , 0.16443445, 0.174614 , 0.21528427, -0.02458197, 0.2311335 , -0.20051023, 0.16148575, 0.03468569, 0.08386306, 0.18408652, -0.09470819, -0.22607385, -0.04776055, 0.17687435, 0.01153742, 0.15740515, 0.22579281, 0.2256033 , 0.23760812, -0.08624862, -0.04818098, -0.09573658, 0.00707476, -0.174594 , 0.17612858, -0.02651523, -0.03352439, -0.0982894 , 0.12405153, 0.1423658 , 0.12438641, -0.22709328, 0.18641399, -0.0159114 ]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(100,) dtype=float32, numpy= array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>] [<tf.Variable 'dense/kernel:0' shape=(5, 100) dtype=float32, numpy= array([[ 0.17777802, -0.0925342 , 0.22044905, -0.1196067 , -0.15553904, -0.19373423, -0.13884991, -0.23252396, -0.01252402, -0.09044193, -0.06529157, 0.22907178, -0.1411261 , 0.20145597, 0.11501376, -0.15268266, -0.17305377, -0.01125969, -0.10907765, 0.0403709 , 0.06923743, -0.00155647, -0.18127626, 0.11550726, 0.03372289, 0.13893865, -0.0092984 , -0.20496821, -0.02627921, 0.01125975, -0.04647307, 0.15463649, 0.17841218, 0.17077957, -0.0842554 , 0.0047874 , -0.12141771, 0.22519882, 0.23548423, 0.06460319, -0.03109986, -0.12173892, -0.02452356, -0.04257253, 0.2064407 , -0.06991957, 0.06425266, -0.1007075 , 0.19131865, -0.1955776 , 0.21193884, -0.2004574 , -0.07692617, -0.08107474, 0.1934263 , 0.05712549, 0.01886164, -0.12672797, -0.17843167, -0.05964956, -0.238883 , -0.21325174, 0.11310308, -0.00318795, -0.12962502, -0.16521364, 0.12938736, -0.23181748, 0.21444045, -0.12927116, -0.18740693, 0.05530755, 0.0146782 , 0.21035798, -0.15627733, -0.01847358, -0.08605188, -0.0206164 , 0.20378043, -0.03834918, 0.0639727 , -0.06449054, 0.17925756, -0.14535832, 0.22247057, 0.08074225, 0.19761471, -0.20858642, 0.17465816, -0.12256925, -0.07192959, -0.01034951, -0.2167171 , 0.02262951, -0.2061531 , 0.19094323, -0.0974756 , 0.21508281, -0.01393197, 0.19384028], [-0.02444541, -0.21043453, 0.06121971, -0.18661837, -0.1679871 , 0.17915292, 0.0956945 , -0.03815825, -0.10663904, -0.04658341, -0.18815587, -0.04888278, 0.19361894, -0.13932027, -0.2013808 , -0.2031331 , -0.12357853, 0.15468134, -0.16377276, -0.15836287, -0.03290932, 0.09049819, -0.10049133, -0.1802709 , 0.11397789, -0.22433408, -0.01369557, -0.21804577, 0.13998653, -0.0452639 , -0.10171422, -0.15374628, -0.07929 , 0.08984323, 0.11814152, 0.13589476, 0.05618854, 0.1663635 , -0.01764336, 0.09068643, -0.1157929 , -0.1266903 , -0.07107972, 0.15617536, -0.1517889 , -0.21622056, -0.17632967, 0.14407007, 0.10903122, -0.00500569, 0.05290176, -0.03641239, -0.2377142 , -0.12242448, -0.07954802, 0.09190597, -0.09879458, -0.18804912, -0.14522013, 0.07479332, 0.17024298, 0.0161783 , -0.0524762 , 0.0176069 , -0.08270177, 0.16904478, 0.17900594, 0.15703659, 0.19818316, -0.1625318 , -0.12794688, -0.1563586 , -0.09517953, 0.09158082, 0.23767962, 0.20551957, 0.14481695, 0.2045602 , -0.06479037, 0.05358954, 0.1212578 , -0.02165481, -0.1284295 , -0.08271579, -0.05446866, 0.05413379, 0.00234202, 0.22771172, -0.2224471 , -0.03084002, -0.19375737, 0.0798779 , -0.09207922, 0.13679741, -0.1429534 , 0.0209298 , -0.0841022 , -0.16638935, 0.0903822 , -0.19967408], [ 0.11377819, -0.03955515, 0.02814175, 0.04407446, 0.02015819, -0.01894131, 0.14453827, 0.07663743, -0.2206468 , -0.23865755, -0.23881991, 0.01236854, -0.09480104, 0.20786951, -0.02678156, -0.0305012 , -0.05566147, -0.21860714, -0.1938608 , 0.053019 , -0.05170445, -0.1206295 , -0.22782467, 0.06737016, 0.05737154, 0.01793937, -0.2030854 , -0.14422959, -0.17374498, -0.02698712, -0.13331282, 0.12249409, -0.19247851, 0.14200823, -0.16609323, 0.14399786, 0.21913432, -0.21645993, -0.191912 , 0.0571617 , 0.19024946, 0.08669983, 0.08364411, -0.1892563 , -0.02523425, 0.11180784, 0.00898317, 0.03620596, -0.08056329, 0.19991381, 0.11432077, 0.1168678 , -0.1644195 , 0.00769468, 0.22227935, -0.20849067, 0.15359052, 0.1345963 , -0.21721914, 0.0614645 , 0.12685539, 0.11890687, -0.20878732, -0.15853551, 0.0458544 , -0.15758611, -0.16187118, -0.09367229, -0.16155185, -0.18485507, -0.13647649, -0.12254263, -0.05565156, -0.18738703, -0.06917199, -0.03574945, 0.17475249, -0.17476122, -0.10158296, 0.12375195, 0.18355547, 0.03811152, 0.07888819, 0.09909324, -0.15394625, 0.11169995, -0.09254411, -0.10357954, 0.19252472, 0.02573626, -0.01318276, -0.09475978, -0.1874548 , -0.19183636, -0.18057513, -0.15745679, 0.18442439, 0.08096658, -0.01627833, 0.05583473], [-0.04097484, 0.23634328, -0.1889084 , 0.08590437, 0.17894466, -0.11124423, 0.18041344, -0.21274638, 0.11614217, 0.10249467, 0.21891718, 0.19230996, 0.15266438, -0.10032661, -0.22356763, 0.11601089, -0.08055103, 0.00928256, 0.16465248, -0.04512097, -0.17905587, -0.23013544, -0.00562099, -0.09802979, -0.22574061, 0.02589588, 0.19565006, 0.09272386, -0.13209037, -0.21364078, -0.15901634, 0.21333267, -0.22375406, -0.17148429, 0.15592472, -0.1618546 , 0.20303024, 0.04697676, 0.20634227, -0.1878765 , 0.22583528, -0.12808219, 0.18875875, -0.19559893, 0.15292238, 0.08833222, 0.1192212 , 0.12659721, 0.12049772, -0.21185097, 0.16098978, -0.11107406, -0.13046448, 0.21239029, 0.00350848, 0.15068768, -0.0189786 , 0.1369033 , -0.10414104, 0.16339312, -0.09338254, -0.14816928, -0.2035834 , 0.16379024, 0.01705651, 0.11921181, 0.23129468, 0.18642814, -0.17961605, 0.22902219, 0.2109852 , -0.19536257, 0.06335585, 0.05963777, 0.0976281 , 0.00718886, 0.02180146, 0.16579719, -0.23447831, -0.22135682, -0.15220946, -0.03425349, -0.16059369, -0.17343065, 0.12119611, 0.07790975, -0.07582501, -0.03742242, 0.18471824, 0.20959799, -0.22154935, -0.2013107 , -0.12604958, 0.12774341, -0.01246983, -0.18907636, 0.03709231, -0.02248657, 0.03133444, -0.1615734 ], [-0.16601531, 0.21792419, -0.1103511 , 0.0025705 , -0.05631484, 0.07372896, 0.18572135, -0.07337801, -0.01120584, -0.13398278, -0.04314138, 0.17321984, 0.11909981, -0.15493754, 0.07232957, 0.13085563, -0.2287109 , -0.21197955, 0.1428767 , 0.1137528 , -0.14559013, 0.13985835, 0.12416814, -0.05637537, -0.0046737 , 0.00876671, 0.05863507, -0.03590567, 0.10624601, -0.1412015 , 0.15561827, 0.10837926, -0.1810194 , -0.05347614, 0.03898682, -0.10682511, -0.16920623, -0.18795235, -0.08359696, 0.18185644, -0.19991723, -0.05360089, 0.13864844, 0.1414309 , -0.23352294, 0.21933769, -0.2087497 , 0.02414815, -0.20864718, -0.01974651, -0.12589416, -0.04501775, 0.09451391, 0.01687138, 0.13819186, -0.21920864, 0.22943564, 0.22025959, 0.07460229, -0.11851113, 0.04449643, -0.11150999, 0.18484862, 0.18422444, -0.19684097, 0.125441 , 0.16443445, 0.174614 , 0.21528427, -0.02458197, 0.2311335 , -0.20051023, 0.16148575, 0.03468569, 0.08386306, 0.18408652, -0.09470819, -0.22607385, -0.04776055, 0.17687435, 0.01153742, 0.15740515, 0.22579281, 0.2256033 , 0.23760812, -0.08624862, -0.04818098, -0.09573658, 0.00707476, -0.174594 , 0.17612858, -0.02651523, -0.03352439, -0.0982894 , 0.12405153, 0.1423658 , 0.12438641, -0.22709328, 0.18641399, -0.0159114 ]], dtype=float32)>, <tf.Variable 'dense/bias:0' shape=(100,) dtype=float32, numpy= array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>]
通过结果我们可以看出layer的输出结果是一个常量,而它的参数是两个变量。其中dense/kernel:0就是我们经常说的线性模型Wx+b中的系数W,而dense/bias:0就是其中的截距b。而且在这里它的参数和可训练的参数是一致的。现在我们来实现自定义的Dense_Layer。
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import time import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers from sklearn.datasets import fetch_california_housing import pprint from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler if __name__ == "__main__": housing = fetch_california_housing() # print(housing.DESCR) # print(housing.data.shape) # print(housing.target.shape) # pprint.pprint(housing.data[0:5]) # pprint.pprint(housing.target[0:5]) X_train_all, X_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state=7) X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, random_state=11) # print(X_train.shape, y_train.shape) # print(X_valid.shape, y_valid.shape) # print(X_test.shape, y_test.shape) scaler = StandardScaler() # 归一化 X_train = scaler.fit_transform(X_train) X_valid = scaler.transform(X_valid) X_test = scaler.transform(X_test) def customized_mse(y_true, y_pred): # 自定义损失函数 return tf.reduce_mean(tf.square(y_pred - y_true)) class CustomizedDenseLayer(layers.Layer): # 自定义DenseLayer def __init__(self, units, activation=None, **kwargs): ''' :param units: 输出大小 :param activation: 激活函数 :param kwargs: ''' self.units = units self.activation = layers.Activation(activation=activation) super(CustomizedDenseLayer, self).__init__(**kwargs) def build(self, input_shape): ''' 构建所需要的参数 :param input_shape: 输入的形状 :return: ''' # Wx + b,input_shape:[None, a],W:[a, b],output_shape:[None, b] # shape为W的形状,即变换矩阵 # uniform表示均匀分布的方式初始化 # trainable = True表示参数是可以被训练的 self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.units), initializer='uniform', trainable=True) self.bias = self.add_weight(name='bias', shape=(self.units,), initializer='zeros', trainable=True) super(CustomizedDenseLayer, self).build(input_shape) def call(self, X): # 完成正向计算 return self.activation(X @ self.kernel + self.bias) model = keras.models.Sequential([ CustomizedDenseLayer(30, activation='relu', input_shape=X_train.shape[1:]), CustomizedDenseLayer(1) ]) print(model.summary()) # 使用均方误差损失函数和随机梯度下降法 model.compile(loss=customized_mse, optimizer=optimizers.SGD(learning_rate=0.01), metrics=['mean_squared_error']) callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)] history = model.fit(X_train, y_train, validation_data=(X_valid, y_valid), epochs=100, callbacks=callbacks) print(model.evaluate(X_test, y_test)) def plot_learning_curves(history): # 学习曲线 pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) plt.show() plot_learning_curves(history)
运行结果
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= customized_dense_layer (Cust (None, 30) 270 _________________________________________________________________ customized_dense_layer_1 (Cu (None, 1) 31 ================================================================= Total params: 301 Trainable params: 301 Non-trainable params: 0 _________________________________________________________________ None Train on 11610 samples, validate on 3870 samples Epoch 1/100 11610/11610 [==============================] - 1s 98us/sample - loss: 1.1060 - mean_squared_error: 1.1061 - val_loss: 0.6408 - val_mean_squared_error: 0.6408 Epoch 2/100 11610/11610 [==============================] - 1s 55us/sample - loss: 0.5543 - mean_squared_error: 0.5543 - val_loss: 0.5453 - val_mean_squared_error: 0.5453 Epoch 3/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.4889 - mean_squared_error: 0.4889 - val_loss: 0.4974 - val_mean_squared_error: 0.4974 Epoch 4/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.4619 - mean_squared_error: 0.4619 - val_loss: 0.4884 - val_mean_squared_error: 0.4884 Epoch 5/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.4479 - mean_squared_error: 0.4479 - val_loss: 0.4610 - val_mean_squared_error: 0.4610 Epoch 6/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.4337 - mean_squared_error: 0.4337 - val_loss: 0.4442 - val_mean_squared_error: 0.4442 Epoch 7/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.4234 - mean_squared_error: 0.4234 - val_loss: 0.4362 - val_mean_squared_error: 0.4362 Epoch 8/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.4155 - mean_squared_error: 0.4155 - val_loss: 0.4295 - val_mean_squared_error: 0.4295 Epoch 9/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.4164 - mean_squared_error: 0.4164 - val_loss: 0.4230 - val_mean_squared_error: 0.4230 Epoch 10/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.4067 - mean_squared_error: 0.4067 - val_loss: 0.4183 - val_mean_squared_error: 0.4183 Epoch 11/100 11610/11610 [==============================] - 1s 49us/sample - loss: 0.3986 - mean_squared_error: 0.3986 - val_loss: 0.4144 - val_mean_squared_error: 0.4144 Epoch 12/100 11610/11610 [==============================] - 1s 67us/sample - loss: 0.3946 - mean_squared_error: 0.3946 - val_loss: 0.4088 - val_mean_squared_error: 0.4088 Epoch 13/100 11610/11610 [==============================] - 1s 72us/sample - loss: 0.3923 - mean_squared_error: 0.3923 - val_loss: 0.4127 - val_mean_squared_error: 0.4127 Epoch 14/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3895 - mean_squared_error: 0.3895 - val_loss: 0.4019 - val_mean_squared_error: 0.4019 Epoch 15/100 11610/11610 [==============================] - 1s 59us/sample - loss: 0.3863 - mean_squared_error: 0.3863 - val_loss: 0.4008 - val_mean_squared_error: 0.4008 Epoch 16/100 11610/11610 [==============================] - 1s 50us/sample - loss: 0.3835 - mean_squared_error: 0.3835 - val_loss: 0.3949 - val_mean_squared_error: 0.3949 Epoch 17/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3819 - mean_squared_error: 0.3819 - val_loss: 0.3942 - val_mean_squared_error: 0.3942 Epoch 18/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3813 - mean_squared_error: 0.3813 - val_loss: 0.3909 - val_mean_squared_error: 0.3909 Epoch 19/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3784 - mean_squared_error: 0.3784 - val_loss: 0.3882 - val_mean_squared_error: 0.3882 Epoch 20/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3763 - mean_squared_error: 0.3763 - val_loss: 0.3960 - val_mean_squared_error: 0.3960 Epoch 21/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3760 - mean_squared_error: 0.3760 - val_loss: 0.3876 - val_mean_squared_error: 0.3876 Epoch 22/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3730 - mean_squared_error: 0.3730 - val_loss: 0.3885 - val_mean_squared_error: 0.3885 Epoch 23/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3739 - mean_squared_error: 0.3739 - val_loss: 0.3854 - val_mean_squared_error: 0.3854 Epoch 24/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3701 - mean_squared_error: 0.3701 - val_loss: 0.3812 - val_mean_squared_error: 0.3812 Epoch 25/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3697 - mean_squared_error: 0.3697 - val_loss: 0.3796 - val_mean_squared_error: 0.3796 Epoch 26/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3701 - mean_squared_error: 0.3701 - val_loss: 0.3787 - val_mean_squared_error: 0.3787 Epoch 27/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3670 - mean_squared_error: 0.3670 - val_loss: 0.3777 - val_mean_squared_error: 0.3777 Epoch 28/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3661 - mean_squared_error: 0.3661 - val_loss: 0.3761 - val_mean_squared_error: 0.3761 Epoch 29/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3638 - mean_squared_error: 0.3638 - val_loss: 0.3738 - val_mean_squared_error: 0.3738 Epoch 30/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3677 - mean_squared_error: 0.3677 - val_loss: 0.3726 - val_mean_squared_error: 0.3726 Epoch 31/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3637 - mean_squared_error: 0.3637 - val_loss: 0.3703 - val_mean_squared_error: 0.3703 Epoch 32/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3651 - mean_squared_error: 0.3651 - val_loss: 0.3750 - val_mean_squared_error: 0.3750 Epoch 33/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3627 - mean_squared_error: 0.3627 - val_loss: 0.3714 - val_mean_squared_error: 0.3714 Epoch 34/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3593 - mean_squared_error: 0.3593 - val_loss: 0.3701 - val_mean_squared_error: 0.3701 Epoch 35/100 11610/11610 [==============================] - 1s 48us/sample - loss: 0.3582 - mean_squared_error: 0.3582 - val_loss: 0.3681 - val_mean_squared_error: 0.3681 Epoch 36/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3622 - mean_squared_error: 0.3622 - val_loss: 0.3668 - val_mean_squared_error: 0.3668 Epoch 37/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3556 - mean_squared_error: 0.3556 - val_loss: 0.3789 - val_mean_squared_error: 0.3789 Epoch 38/100 11610/11610 [==============================] - 1s 47us/sample - loss: 0.3618 - mean_squared_error: 0.3618 - val_loss: 0.3651 - val_mean_squared_error: 0.3651 Epoch 39/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.3546 - mean_squared_error: 0.3546 - val_loss: 0.3630 - val_mean_squared_error: 0.3630 Epoch 40/100 11610/11610 [==============================] - 1s 69us/sample - loss: 0.3533 - mean_squared_error: 0.3533 - val_loss: 0.3897 - val_mean_squared_error: 0.3897 Epoch 41/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3589 - mean_squared_error: 0.3589 - val_loss: 0.3621 - val_mean_squared_error: 0.3621 Epoch 42/100 11610/11610 [==============================] - 1s 84us/sample - loss: 0.3540 - mean_squared_error: 0.3540 - val_loss: 0.3648 - val_mean_squared_error: 0.3648 Epoch 43/100 11610/11610 [==============================] - 1s 62us/sample - loss: 0.3554 - mean_squared_error: 0.3554 - val_loss: 0.3638 - val_mean_squared_error: 0.3638 Epoch 44/100 11610/11610 [==============================] - 1s 61us/sample - loss: 0.3512 - mean_squared_error: 0.3512 - val_loss: 0.3575 - val_mean_squared_error: 0.3575 Epoch 45/100 11610/11610 [==============================] - 1s 65us/sample - loss: 0.3549 - mean_squared_error: 0.3549 - val_loss: 0.3566 - val_mean_squared_error: 0.3566 Epoch 46/100 11610/11610 [==============================] - 1s 79us/sample - loss: 0.3497 - mean_squared_error: 0.3497 - val_loss: 0.3561 - val_mean_squared_error: 0.3561 Epoch 47/100 11610/11610 [==============================] - 1s 86us/sample - loss: 0.3470 - mean_squared_error: 0.3470 - val_loss: 0.3584 - val_mean_squared_error: 0.3584 Epoch 48/100 11610/11610 [==============================] - 1s 74us/sample - loss: 0.3470 - mean_squared_error: 0.3470 - val_loss: 0.3526 - val_mean_squared_error: 0.3526 Epoch 49/100 11610/11610 [==============================] - 1s 51us/sample - loss: 0.3469 - mean_squared_error: 0.3469 - val_loss: 0.3529 - val_mean_squared_error: 0.3529 Epoch 50/100 11610/11610 [==============================] - 1s 60us/sample - loss: 0.3492 - mean_squared_error: 0.3492 - val_loss: 0.3531 - val_mean_squared_error: 0.3531 Epoch 51/100 11610/11610 [==============================] - 1s 70us/sample - loss: 0.3428 - mean_squared_error: 0.3428 - val_loss: 0.3601 - val_mean_squared_error: 0.3601 Epoch 52/100 11610/11610 [==============================] - 1s 73us/sample - loss: 0.3448 - mean_squared_error: 0.3448 - val_loss: 0.3517 - val_mean_squared_error: 0.3517 Epoch 53/100 11610/11610 [==============================] - 1s 64us/sample - loss: 0.3423 - mean_squared_error: 0.3423 - val_loss: 0.3618 - val_mean_squared_error: 0.3618 5160/1 [===================================================] - 0s 23us/sample - loss: 0.4712 - mean_squared_error: 0.3614 [0.36136142297308577, 0.3613615]
在这里,我们可以看到使用子类的方式来定义层次是比较繁琐和复杂的,如果我们只是想增加一个激活函数层,这样写就显得比较累赘了,所以我们可以使用lambda表达式来完成这个功能
import tensorflow as tf from tensorflow.keras import layers, models import numpy as np if __name__ == "__main__": # 添加激活函数层sotgplus:log(1+e^x) customized_softplus = layers.Lambda(lambda x: tf.nn.softplus(x)) print(customized_softplus([-10., -5., 0., 5., 10.])) model = models.Sequential([ layers.Dense(30, activation='relu', input_shape=[None, 5]), layers.Dense(1), customized_softplus # 它等同于下面任意一行代码 # layers.Dense(1, activation='softplus'), # layers.Dense(1), layers.Activation('softplus') ]) print(model.summary())
运行结果
tf.Tensor([4.5417706e-05 6.7153489e-03 6.9314718e-01 5.0067153e+00 1.0000046e+01], shape=(5,), dtype=float32) Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, None, 30) 180 _________________________________________________________________ dense_1 (Dense) (None, None, 1) 31 _________________________________________________________________ lambda (Lambda) (None, None, 1) 0 ================================================================= Total params: 211 Trainable params: 211 Non-trainable params: 0 _________________________________________________________________ None
tf.function函数转换图结构
这里我们有一个概念,那就是tensorflow的类型(常量,变量)以及它的函数都是被优化过,更加适合于使用GPU、TPU进行加速,那么对于普通的Python库函数是没有这个功能的。那么对于普通的Python库函数能否使用tensorflow的这种优化呢,答案是肯定的。
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import timeit import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers if __name__ == "__main__": def scaled_elu(z, scale=1.0, alpha=1.0): # z >= 0 ? scale * z : scale * alpha * tf.nn.elu(z) is_positive = tf.greater_equal(z, 0.0) return scale * tf.where(is_positive, z, alpha * tf.nn.elu(z)) t1 = tf.constant(-3.) t2 = tf.constant([-3., -2.5]) print(scaled_elu(t1)) print(scaled_elu(t2)) scaled_elu_tf = tf.function(scaled_elu) print(scaled_elu_tf(t1)) print(scaled_elu_tf(t2)) print(scaled_elu_tf.python_function is scaled_elu) %timeit scaled_elu(tf.random.normal((1000, 1000))) %timeit scaled_elu_tf(tf.random.normal((1000, 1000)))
运行结果
tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) True 10 loops, best of 5: 25.8 ms per loop 10 loops, best of 5: 23.7 ms per loop
这里我们可以把scaled_elu看成是一个普通的Python函数,当我们对这个函数进行了图模型化scaled_elu_tf = tf.function(scaled_elu)后,当我们对其进行大型矩阵计算中,我们可以看到图模型化后的scaled_elu_tf比之前scaled_elu快了一点点。不过这里必须使用TPU环境才有效果,否则是比较慢的。除了这种直接转的方式,我们还可以通过打标签的方式
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import timeit import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers if __name__ == "__main__": def scaled_elu(z, scale=1.0, alpha=1.0): # z >= 0 ? scale * z : scale * alpha * tf.nn.elu(z) is_positive = tf.greater_equal(z, 0.0) return scale * tf.where(is_positive, z, alpha * tf.nn.elu(z)) t1 = tf.constant(-3.) t2 = tf.constant([-3., -2.5]) print(scaled_elu(t1)) print(scaled_elu(t2)) scaled_elu_tf = tf.function(scaled_elu) print(scaled_elu_tf(t1)) print(scaled_elu_tf(t2)) print(scaled_elu_tf.python_function is scaled_elu) %timeit scaled_elu(tf.random.normal((1000, 1000))) %timeit scaled_elu_tf(tf.random.normal((1000, 1000))) @tf.function def converge_to_2(n_iters): # 1 + 1/2 + 1/2^2 + ... + 1/2^n total = tf.constant(0.) increment = tf.constant(1.) for _ in range(n_iters): total += increment increment /= 2.0 return total print(converge_to_2(20))
运行结果
tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) True 10 loops, best of 5: 26 ms per loop 10 loops, best of 5: 24 ms per loop tf.Tensor(1.9999981, shape=(), dtype=float32)
我们可以来看一下这两个函数转成图结构后的代码
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import timeit import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, optimizers from IPython.display import display, Markdown if __name__ == "__main__": def scaled_elu(z, scale=1.0, alpha=1.0): # z >= 0 ? scale * z : scale * alpha * tf.nn.elu(z) is_positive = tf.greater_equal(z, 0.0) return scale * tf.where(is_positive, z, alpha * tf.nn.elu(z)) t1 = tf.constant(-3.) t2 = tf.constant([-3., -2.5]) print(scaled_elu(t1)) print(scaled_elu(t2)) scaled_elu_tf = tf.function(scaled_elu) print(scaled_elu_tf(t1)) print(scaled_elu_tf(t2)) print(scaled_elu_tf.python_function is scaled_elu) %timeit scaled_elu(tf.random.normal((1000, 1000))) %timeit scaled_elu_tf(tf.random.normal((1000, 1000))) # @tf.function def converge_to_2(n_iters): # 1 + 1/2 + 1/2^2 + ... + 1/2^n total = tf.constant(0.) increment = tf.constant(1.) for _ in range(n_iters): total += increment increment /= 2.0 return total print(converge_to_2(20)) def display_tf_code(func): code = tf.autograph.to_code(func) display(Markdown('```python\n{}\n```'.format(code))) display_tf_code(scaled_elu) display_tf_code(converge_to_2)
运行结果
tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) tf.Tensor(-0.95021296, shape=(), dtype=float32) tf.Tensor([-0.95021296 -0.917915 ], shape=(2,), dtype=float32) True 10 loops, best of 5: 25.7 ms per loop 10 loops, best of 5: 23.9 ms per loop tf.Tensor(1.9999981, shape=(), dtype=float32) def tf__scaled_elu(z, scale=None, alpha=None): with ag__.FunctionScope('scaled_elu', 'fscope', ag__.ConversionOptions(recursive=True, user_requested=True, optional_features=(), internal_convert_user_code=True)) as fscope: do_return = False retval_ = ag__.UndefinedReturnValue() is_positive = ag__.converted_call(ag__.ld(tf).greater_equal, (ag__.ld(z), 0.0), None, fscope) try: do_return = True retval_ = (ag__.ld(scale) * ag__.converted_call(ag__.ld(tf).where, (ag__.ld(is_positive), ag__.ld(z), (ag__.ld(alpha) * ag__.converted_call(ag__.ld(tf).nn.elu, (ag__.ld(z),), None, fscope))), None, fscope)) except: do_return = False raise return fscope.ret(retval_, do_return) def tf__converge_to(n_iters): with ag__.FunctionScope('converge_to_2', 'fscope', ag__.ConversionOptions(recursive=True, user_requested=True, optional_features=(), internal_convert_user_code=True)) as fscope: do_return = False retval_ = ag__.UndefinedReturnValue() total = ag__.converted_call(ag__.ld(tf).constant, (0.0,), None, fscope) increment = ag__.converted_call(ag__.ld(tf).constant, (1.0,), None, fscope) def get_state(): return (total, increment) def set_state(vars_): nonlocal increment, total (total, increment) = vars_ def loop_body(itr): nonlocal increment, total _ = itr total = ag__.ld(total) total += increment increment = ag__.ld(increment) increment /= 2.0 _ = ag__.Undefined('_') ag__.for_stmt(ag__.converted_call(ag__.ld(range), (ag__.ld(n_iters),), None, fscope), None, loop_body, get_state, set_state, ('total', 'increment'), {'iterate_names': '_'}) try: do_return = True retval_ = ag__.ld(total) except: do_return = False raise return fscope.ret(retval_, do_return)
之前我们使用的都是常量,现在我们来看看对于变量来说,是什么情况
def add_21(): var = tf.Variable(0.) return var.assign_add(21) # += print(add_21())
运行结果
<tf.Variable 'UnreadVariable' shape=() dtype=float32, numpy=21.0>
现在我们给这段代码加上标签
@tf.function def add_21(): var = tf.Variable(0.) return var.assign_add(21) # += print(add_21())
运行结果
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-8-806807c51c7b> in <module>() 4 return var.assign_add(21) # += 5 ----> 6 print(add_21()) 7 frames /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs) 992 except Exception as e: # pylint:disable=broad-except 993 if hasattr(e, "ag_error_metadata"): --> 994 raise e.ag_error_metadata.to_exception(e) 995 else: 996 raise ValueError: in user code: <ipython-input-8-806807c51c7b>:3 add_21 * var = tf.Variable(0.) /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py:268 __call__ ** return cls._variable_v2_call(*args, **kwargs) /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py:262 _variable_v2_call shape=shape) /usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/variables.py:67 getter return captured_getter(captured_previous, **kwargs) /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py:765 invalid_creator_scope "tf.function-decorated function tried to create " ValueError: tf.function-decorated function tried to create variables on non-first call.
它会直接报错,这个主要是对于tensorflow的图结构来说,它是不能直接在函数内部定义变量的,所以我们需要将变量定义到函数外部。
var = tf.Variable(0.) @tf.function def add_21(): return var.assign_add(21) # += print(add_21())
运行结果
tf.Tensor(21.0, shape=(), dtype=float32)
由于Python是一个弱类型的语言,有的时候它可以输入多种不同的类型,现在我们要给图结构函数限制输入的类型
@tf.function(input_signature=[tf.TensorSpec([None], tf.int32, name='x')]) def cube(z): return tf.pow(z, 3) print(cube(tf.constant([1., 2., 3.]))) print(cube(tf.constant([1, 2, 3])))
运行结果
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-10-53f91d549b69> in <module>() 3 return tf.pow(z, 3) 4 ----> 5 print(cube(tf.constant([1., 2., 3.]))) 6 print(cube(tf.constant([1, 2, 3]))) 3 frames /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in _convert_inputs_to_signature(inputs, input_signature, flat_input_signature) 2890 flatten_inputs)): 2891 raise ValueError("Python inputs incompatible with input_signature:\n%s" % -> 2892 format_error_message(inputs, input_signature)) 2893 2894 if need_packing: ValueError: Python inputs incompatible with input_signature: inputs: ( tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32)) input_signature: ( TensorSpec(shape=(None,), dtype=tf.int32, name='x'))
这里我们给输入的参数限定为int32的整型,当我们输入整型的时候
@tf.function(input_signature=[tf.TensorSpec([None], tf.int32, name='x')]) def cube(z): return tf.pow(z, 3) # print(cube(tf.constant([1., 2., 3.]))) print(cube(tf.constant([1, 2, 3])))
运行结果
tf.Tensor([ 1 8 27], shape=(3,), dtype=int32)
现在我们来看一下这个图的一些信息
# get_concrete_function -> 添加输入签名 ->保存模型 cube_func_int32 = cube.get_concrete_function(tf.TensorSpec([None], tf.int32)) print(cube_func_int32) print(cube_func_int32 is cube.get_concrete_function(tf.TensorSpec([5], tf.int32))) print(cube_func_int32 is cube.get_concrete_function(tf.constant([1, 2, 3])))
运行结果
ConcreteFunction cube(z) Args: z: int32 Tensor, shape=(None,) Returns: int32 Tensor, shape=(None,) True True
在cube_func_int32对象中就有图的信息
print(cube_func_int32.graph) # 查看图中的操作 print(cube_func_int32.graph.get_operations()) # 查看立方操作 pow_op = cube_func_int32.graph.get_operations()[2] print(pow_op) # 查看该操作的输入和输出 print(list(pow_op.inputs)) print(list(pow_op.outputs)) # 通过操作名字获取操作 print(cube_func_int32.graph.get_operation_by_name("x")) # 通过张量名字获取操作 print(cube_func_int32.graph.get_tensor_by_name("x:0")) # 打印图定义 print(cube_func_int32.graph.as_graph_def())
运行结果
FuncGraph(name=cube, id=140354824183312) [<tf.Operation 'x' type=Placeholder>, <tf.Operation 'Pow/y' type=Const>, <tf.Operation 'Pow' type=Pow>, <tf.Operation 'Identity' type=Identity>] name: "Pow" op: "Pow" input: "x" input: "Pow/y" attr { key: "T" value { type: DT_INT32 } } [<tf.Tensor 'x:0' shape=(None,) dtype=int32>, <tf.Tensor 'Pow/y:0' shape=() dtype=int32>] [<tf.Tensor 'Pow:0' shape=(None,) dtype=int32>] name: "x" op: "Placeholder" attr { key: "_user_specified_name" value { s: "x" } } attr { key: "dtype" value { type: DT_INT32 } } attr { key: "shape" value { shape { dim { size: -1 } } } } Tensor("x:0", shape=(None,), dtype=int32) node { name: "x" op: "Placeholder" attr { key: "_user_specified_name" value { s: "x" } } attr { key: "dtype" value { type: DT_INT32 } } attr { key: "shape" value { shape { dim { size: -1 } } } } } node { name: "Pow/y" op: "Const" attr { key: "dtype" value { type: DT_INT32 } } attr { key: "value" value { tensor { dtype: DT_INT32 tensor_shape { } int_val: 3 } } } } node { name: "Pow" op: "Pow" input: "x" input: "Pow/y" attr { key: "T" value { type: DT_INT32 } } } node { name: "Identity" op: "Identity" input: "Pow" attr { key: "T" value { type: DT_INT32 } } } versions { producer: 808 }
我们这里可以看到该图中有4个操作,这里有Placeholder的概念,Placeholder是tensorflow1中经常用到的图,可以显示定义,在2.0中就不需要了,它是用来放输入的,必须要放进去一个输入才能得到一个输出。那么图信息对我们有什么用呢?一般会用在两个地方,第一个地方就是如何去保存模型;第二个地方就是一旦保存了模型之后,如何把一个模型给载入进来,然后我们载入模型去做infos的时候会经常用到上面这些函数。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
万亿流量的转发引擎 BFE 控制平面开源发布!
金秋十月,BFE 的好消息不断。继BFE Ingress Controller开源发布后,BFE 控制平面也正式开源发布,BFE 完整的开源解决方案已经可以供用户选择使用。 本次我们发布了控制平面的 API-Server、Conf-Agent 和 Dashboard三个组件,均采用Apache-2.0 License,现已可以下载源码及安装包。Github地址:https://github.com/bfenetworks 概述 BFE 是一个企业级的七层负载均衡系统,其核心转发引擎于2019年7月开源,并于2020年6月成为 CNCF 的 Sandbox Project。BFE 目前承载了包括百度在内的多个互联网、金融、传媒、交通运输等行业头部客户的在线流量。 完整的 BFE 解决方案可以分为数据平面和控制平面。2019年发布的核心转发引擎属于数据平面,本次我们发布了控制平面的核心组件后,用户已经可以使用 BFE 已开源的各个组件,组成完整的七层负载均衡和流量接入平台,满足组织和企业的流量接入和管理需求。 系统架构 当前已开源的BFE控制平面包括以下三个组件: API-Server:...
- 下一篇
面试必备的线程池知识-线程池的原理
@TOC 前言 上一篇我们介绍了线程池的使用,这一篇我们接着分析下线程池的实现原理。首先从创建线程池的核心类ThreadPoolExecutor类说起。 ThreadPoolExecutor类的常量 //用来存放工作线程数量和线程池状态 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; //32-3=29 private static final int CAPACITY = (1 << COUNT_BITS) - 1; // runState is stored in the high-order bits //运行状态,可以执行任务 private static final int RUNNING = -1 << COUNT_BITS; //不能接受新任务,但是可以执行完正在执行任务 private static final int SHUTDOWN = ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8