使用Python的TensorFlow获得相同精度

我只是按照书籍《Hands-On Machine Learning with Scikit-Learn and TensorFlow》中的一个TensorFlow示例操作,但得到了奇怪的结果。

示例代码如下:

import tensorflow as tffrom tensorflow import kerastf.__version__keras.__version__fashion_mnist = keras.datasets.fashion_mnist(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()X_valid, X_train = X_train_full[:5000] / 255.0, X_train_full[5000:] / 255.0y_valid, y_train = y_train_full[:5000] / 255.0, y_train_full[5000:] / 255.0class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",            "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]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")])model.compile(loss="sparse_categorical_crossentropy",              optimizer='sgd',              metrics=['accuracy'])history = model.fit(X_train, y_train, epochs=50, validation_data=(X_valid, y_valid))

根据书中所述,随着epoch的增加,准确率应该有所提高:

Train on 55000 samples, validate on 5000 samplesEpoch 1/3055000/55000 [==========] - 3s 55us/sample - loss: 1.4948 - acc: 0.5757 - val_loss: 1.0042 - val_acc: 0.7166Epoch 2/3055000/55000 [==========] - 3s 55us/sample - loss: 0.8690 - acc: 0.7318 - val_loss: 0.7549 - val_acc: 0.7616[...]Epoch 50/5055000/55000 [==========] - 4s 72us/sample - loss: 0.3607 - acc: 0.8752 - acc: 0.8752 -val_loss: 0.3706 - val_acc: 0.8728

但当我运行时,得到的结果如下:

Epoch 1/301719/1719 [==============================] - 3s 2ms/step - loss: 0.0623 - accuracy: 0.1005 - val_loss: 0.0011 - val_accuracy: 0.0914Epoch 2/301719/1719 [==============================] - 3s 2ms/step - loss: 8.7637e-04 - accuracy: 0.1011 - val_loss: 5.2079e-04 - val_accuracy: 0.0914Epoch 3/301719/1719 [==============================] - 3s 2ms/step - loss: 4.9200e-04 - accuracy: 0.1019 - val_loss: 3.4211e-04 - val_accuracy: 0.0914[...]Epoch 49/501719/1719 [==============================] - 3s 2ms/step - loss: 3.1710e-05 - accuracy: 0.0992 - val_loss: 3.2966e-05 - val_accuracy: 0.0914Epoch 50/501719/1719 [==============================] - 3s 2ms/step - loss: 2.7711e-05 - accuracy: 0.1022 - val_loss: 3.1833e-05 - val_accuracy: 0.0914

如您所见,复现的结果精度明显更低,而且没有提高:验证集准确率停留在0.0914,而不是0.8728

我的TensorFlow安装、设置或者代码中是否有什么问题?


回答:

你不能像y_valid, y_train = y_train_full[:5000] / 255.0, y_train_full[5000:] / 255.0这样对y进行除法操作。完整的代码如下:

import tensorflow as tffrom tensorflow import kerastf.__version__keras.__version__fashion_mnist = keras.datasets.fashion_mnist(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()X_train_full = X_train_full / 255.0X_test = X_test / 255.0class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",            "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]model = keras.models.Sequential([    keras.layers.Flatten(input_shape=(28, 28)),    keras.layers.Dense(128, activation="relu"),    keras.layers.Dense(10, activation="softmax")])model.compile(loss="sparse_categorical_crossentropy",              optimizer='sgd',              metrics=['accuracy'])history = model.fit(X_train_full, y_train_full, epochs=5, validation_data=(X_test, y_test))

它将给出如下准确率:

Epoch 1/51875/1875 [==============================] - 2s 1ms/step - loss: 0.9880 - accuracy: 0.6923 - val_loss: 0.5710 - val_accuracy: 0.8054Epoch 2/51875/1875 [==============================] - 2s 944us/step - loss: 0.5281 - accuracy: 0.8227 - val_loss: 0.5112 - val_accuracy: 0.8228Epoch 3/51875/1875 [==============================] - 2s 913us/step - loss: 0.4720 - accuracy: 0.8391 - val_loss: 0.4782 - val_accuracy: 0.8345Epoch 4/51875/1875 [==============================] - 2s 915us/step - loss: 0.4492 - accuracy: 0.8462 - val_loss: 0.4568 - val_accuracy: 0.8410Epoch 5/51875/1875 [==============================] - 2s 935us/step - loss: 0.4212 - accuracy: 0.8550 - val_loss: 0.4469 - val_accuracy: 0.8444

此外,优化器adam可能会比sgd提供更好的结果。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注