Keras-tensorflow 中 2D 卷积回归的常量输出



我想尝试使用二维卷积神经网络作为回归器。

这就是我如何做到的,*使用在 tensorflow 中可用的 mnist 数据集。

首先,我们加载 mnist 数据集。

from __future__ import absolute_import, division, print_function, unicode_literals
import keras
try:
# %tensorflow_version only exists in Colab.
%tensorflow_version 2.x
except Exception:
pass
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0

现在,我们将所有整数标签替换为浮点数

import numpy as np
test_labels  = np.random.rand(10000,)
train_labels = np.random.rand(60000,)
# train_labels = np.full((60000, ), 3.5) #Another possible choice of labels, to see wether the end result changes

我们可以构建模型

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation
filters = 10
kernel_size = 5 # or tuple for two dimensional
number_of_input_layers = 1
model = Sequential([
Conv2D(filters, kernel_size,
input_shape=(28, 28, number_of_input_layers),
#strides=(1, 1),
#padding='valid',
#data_format="channels_last",
#dilation_rate=(1, 1),
#activation=None,
#use_bias=True,
#kernel_initializer='glorot_uniform',
#bias_initializer='zeros',
#kernel_regularizer=None,
#bias_regularizer=None,
#activity_regularizer=None,
#kernel_constraint=None,
#bias_constraint=None
),
#MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
#Conv2D(64, (5, 5), activation='relu'),
#MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(1000, activation='relu'),
Dense(1, activation='tanh')
])

并编译它。

# For a mean squared error regression problem
model.compile(optimizer='rmsprop',
loss='mse',
metrics=['accuracy']
)

还可以获得有关模型的摘要

model.summary()

我们适合模型

model.fit(train_images,
train_labels,
epochs=1)

并评估其损失

test_loss, test_acc = model.evaluate(test_images,
test_labels)

最后,我们可以预测,test_images

result = model.predict(test_images)

问题是:

无论我如何更改训练标签,结果变量都是一个float32(10000,1)形的numpy数组,由1.0值组成。问题出在哪里?

这个问题已经在这里被问过了,但当时没有人找到答案。



更新: 如果我更改最后一层

Dense(1, activation='tanh')

Dense(1, activation='sigmoid')

输出仍然相同。 只有当我把

Dense(1) or or Dense(1, activation='linear')

在那里,**输出是一个常量值的 numpy 数组 != 1.0 **,为什么?

这就是为什么:

Dense(1, activation='softmax')

softmax激活通过除以神经元数量来归一化,因此它根本不适用于单个神经元,这将产生 1.0 的恒定输出。

如果您正在执行回归,则根本不应该使用softmax,如果目标在[0, 1]范围内,则应将其替换为sigmoid激活,如果目标范围不受限制,则应将其替换为linear激活。

最新更新