tensorflow - 一种带有稀疏分类熵抛出错误的热编码
问题描述
所以我正在为 Keras 做 MNIST 时尚示例。在我为它编写的程序中,我不需要使用“to_categorical”对我的数据进行一次热编码,它仍然有效。当我尝试对其进行热编码时,它不起作用。我很困惑为什么会发生这种情况,因为通常应该对他们的输出进行热编码,对吗?如果有人可以帮助澄清这一点,那就太好了!
from tensorflow.keras.datasets import fashion_mnist
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Activation
from tensorflow.keras import backend as K
from kerastuner import RandomSearch
import time
from tensorflow.keras.utils import to_categorical
from kerastuner.engine.hyperparameters import HyperParameters
LOG_DIR = f"{int(time.time())}"
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
#
#
if K.image_data_format() == 'channels_first':
input_shape = (1, x_train.shape[0], 28, 28)
input_shap2 = (1, x_test.shape[0], 28, 28)
else:
input_shape = (x_train.shape[0], 28, 28, 1)
input_shap2 = (x_test.shape[0], 28, 28, 1)
y_train = to_categorical(y_train)<<<<<<<<<<<<<<<<<<<<<<
y_test = to_categorical(y_test) <<<<<<<<<<<<<<<<<<<<<<<<<<<
# plt.imshow(x_train[0], cmap='gray')
# plt.show()
x_train = x_train.reshape(input_shape)
x_test = x_test.reshape(input_shap2)
def build_model(hp):
model = keras.models.Sequential()
model.add(Conv2D(hp.Int("input_units", min_value=32, max_value=256, step=32), (3, 3), input_shape=(28, 28, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
for i in range(hp.Int("n_layers", 1, 4)):
model.add(Conv2D(hp.Int(f"conv_{i}_units", min_value=32, max_value=256, step=32), (3, 3)))
model.add(Activation('relu'))
# model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
return model
# model=build_model()
# model.fit(x_train, y_train, batch_size=64, epochs=8, validation_data = (x_test, y_test))
tuner = RandomSearch(
build_model,
objective="val_accuracy",
max_trials=1,
executions_per_trial=1,
directory=LOG_DIR
)
tuner.search(
x=x_train,
y=y_train,
epochs=1,
batch_size=64,
validation_data=(x_test,y_test)
)
解决方案
您使用的是稀疏分类交叉熵而不是分类交叉熵。稀疏使用整数编码,而另一种使用一种热编码。您应该使用稀疏而不是一个热标签,或者使用另一个和一个热编码标签
推荐阅读
- android-studio - 在颤振中使用 setState() 的替代方法是什么?
- laravel - 在 laravel 中使用 memcached。这是正常的应用程序行为吗?
- node.js - 如何打印节点js请求响应的HTML响应
- javascript - Classic ASP 中 ipv6 地址的字符串表示
- json - 使用 ASP.NET Core 5 MVC 将 Json 结果转换为 HTML 表单
- build - WebpackError: ReferenceError: Image is not defined(在“gatsby build”期间,“gatsby develop”工作正常)
- laravel - 如何在 laravel 8 中设置一个漂亮的 url?
- reactjs - React 测试使用 mockstore 和自定义存储来测试它
- python - 如何使输出 csv 文件中的值在同一列中分开
- apache-spark - 如何减少 BigQuery 中的临时表过期时间