我想尝试使用二维卷积神经网络作为回归器。
这就是我如何做到的,*使用在 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
激活。