Tensorflow relu可以用于神经网络的最后一层吗?

Tensorflow relu可以用于神经网络的最后一层吗?,tensorflow,keras,deep-learning,conv-neural-network,autoencoder,Tensorflow,Keras,Deep Learning,Conv Neural Network,Autoencoder,我希望找到一个答案来澄清我的疑问。我用这种方法创建了一个卷积自动编码器: input_dim = Input((1, 200, 4)) x = Conv2D(64, (1,3), activation='relu', padding='same')(input_dim) x = MaxPooling2D((1,2), padding='same')(x) x = Conv2D(32, (1,3), activation='relu', padding='same'

我希望找到一个答案来澄清我的疑问。我用这种方法创建了一个
卷积自动编码器

    input_dim = Input((1, 200, 4))
    x = Conv2D(64, (1,3), activation='relu', padding='same')(input_dim)
    x = MaxPooling2D((1,2), padding='same')(x)
    x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
    x = MaxPooling2D((1,2), padding='same')(x)
    x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
    encoded = MaxPooling2D((1,2), padding='same')(x)

    #decoder
    x = Conv2D(32, (1,3), activation='relu', padding='same')(encoded)
    x = UpSampling2D((1,2))(x)
    x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
    x = UpSampling2D((1,2))(x)
    x = Conv2D(64, (1,3), activation='relu')(x)
    x = UpSampling2D((1,2))(x)
    decoded = Conv2D(4, (1,3), activation='sigmoid', padding='same')(x)
    
    autoencoder = Model(input_layer, decoded) 

    autoencoder.compile(optimizer='adam', loss='mae', 
                        metrics=['mean_squared_error'])
但是,当我尝试将解码器的最后一次激活设置为
sigmoid
时,模型损耗会略微降低(在以后的时期保持不变),因此
均方误差也会降低。(使用默认的
Adam
设置):

但是当我将解码器的上一次激活更改为
relu
时,
丢失
均方误差
都会迅速减少

Epoch 1/100
97/98 [============================>.] - ETA: 0s - loss: 9.8283 - mean_squared_error: 1267.3282 
Epoch 00001: loss improved from inf to 9.82359, saving model to weights.best.hdf5
98/98 [==============================] - 6s 64ms/step - loss: 9.8236 - mean_squared_error: 1266.0548 - val_loss: 8.4972 - val_mean_squared_error: 971.0208
Epoch 2/100
97/98 [============================>.] - ETA: 0s - loss: 8.1906 - mean_squared_error: 910.6423 
Epoch 00002: loss improved from 9.82359 to 8.19058, saving model to weights.best.hdf5
98/98 [==============================] - 6s 62ms/step - loss: 8.1906 - mean_squared_error: 910.5417 - val_loss: 7.6558 - val_mean_squared_error: 811.6011
Epoch 3/100
97/98 [============================>.] - ETA: 0s - loss: 7.3522 - mean_squared_error: 736.2031
Epoch 00003: loss improved from 8.19058 to 7.35255, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 7.3525 - mean_squared_error: 736.2403 - val_loss: 6.8044 - val_mean_squared_error: 650.5342
Epoch 4/100
97/98 [============================>.] - ETA: 0s - loss: 6.6166 - mean_squared_error: 621.1281
Epoch 00004: loss improved from 7.35255 to 6.61435, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 6.6143 - mean_squared_error: 620.6105 - val_loss: 6.2180 - val_mean_squared_error: 572.2390

我想验证在网络体系结构中使用all
relu
功能是否有效。作为深入学习的新手。

您可以使用
relu
功能作为最后一层的激活

您可以在TensorFlow官方网站的autoencoder示例中看到


当您试图解决标签为类值的分类问题时,请在最终输出层中使用sigmoid/softmax激活功能。

您可以在最终层中使用
relu
功能作为激活

您可以在TensorFlow官方网站的autoencoder示例中看到


当您试图解决标签为类值的分类问题时,请在最终输出层中使用sigmoid/softmax激活功能。

您提出的问题会引发另一个非常基本的问题。扪心自问:“你实际上想要模型做什么?”——预测真实价值?或在一定范围内的值?-你会得到答案的

但在这之前,我觉得我应该给你们一个关于激活函数的简介,以及我们为什么要使用它们

激活函数的主要目标是在模型中引入非线性。由于线性函数的组合也是一个线性函数,因此,没有激活函数,神经网络就是一个巨大的线性函数。因此,作为一个线性函数本身,它根本无法学习任何非线性行为。这是使用激活功能的主要目的

另一个目的是限制神经元的输出范围。下图显示了
Sigmoid
ReLU
激活功能(图像从中采集)

这两个图精确地显示了它们可以对通过它们的值施加何种限制。如果查看
Sigmoid
函数,它允许输出在
0到1之间。因此,我们可以将其视为基于函数输入值的概率映射。那么我们在哪里可以使用它呢?对于二进制分类,如果我们为两个不同的类分配
0
1
,并在输出层中使用
Sigmoid
函数,它可以为示例输入提供属于某个类的概率

现在来看
ReLU
。它是干什么的?它只允许
非负值。正如您所看到的,水平轴中的所有负值都被映射到垂直轴中的0。但是对于正值,45度的直线显示它对它们没有任何作用,让它们保持原样。基本上,它帮助我们去掉负值,使它们为0,并且只允许非负值。数学上:
relu(value)=max(0,value)

现在想象一种情况:假设你想要预测实际值,它可以是正的,零的,甚至是负的!您会仅仅因为输出层看起来很酷而在输出层中使用
ReLU
激活功能吗?不!显然不是。如果这样做,它将永远无法预测任何负值,因为所有负值都将被削减到0

现在来看你的情况,我相信这个模型应该预测不应该被限制在
0到1之间的值。它应该是一个
实值
预测

因此,当您使用
sigmoid
函数时,它基本上强制模型在
0到1之间输出,这在大多数情况下都不是有效的预测,因此模型会产生较大的
损失
MSE
值。因为模型有力地预测了一些与实际正确输出相差甚远的东西

同样,当您使用
ReLU
时,它的性能会更好。因为
ReLU
不会更改任何非负值。因此,该模型可以自由预测任何非负值,现在不必预测接近实际输出的值


但是我认为模型想要预测的强度值可能在0到255之间。因此,您的模型中已经没有负值了。因此从这个意义上讲,技术上不需要在最后一层中使用
ReLU
激活函数,因为它甚至不会得到任何要过滤掉的负值(如果我没有弄错的话)。但您可以将其用作正式的
TensorFlow
文档。但这只是出于安全目的,这样就不会出现任何
负值
值,
ReLU
不会对
非负值
值产生任何影响。

您所问的问题引发了另一个非常基本的问题。扪心自问:“你实际上想要模型做什么?”——预测真实价值?或在一定范围内的值?-你会得到答案的

但在这之前,我觉得我应该给你们一个关于激活函数的简介,以及我们为什么要使用它们

激活函数的主要目标是在模型中引入非线性。由于线性函数的组合也是一个线性函数,因此,没有激活函数,神经网络就是一个巨大的线性函数。因此,作为一个线性函数本身,它根本无法学习任何非线性行为。这是主要的pu
Epoch 1/100
97/98 [============================>.] - ETA: 0s - loss: 9.8283 - mean_squared_error: 1267.3282 
Epoch 00001: loss improved from inf to 9.82359, saving model to weights.best.hdf5
98/98 [==============================] - 6s 64ms/step - loss: 9.8236 - mean_squared_error: 1266.0548 - val_loss: 8.4972 - val_mean_squared_error: 971.0208
Epoch 2/100
97/98 [============================>.] - ETA: 0s - loss: 8.1906 - mean_squared_error: 910.6423 
Epoch 00002: loss improved from 9.82359 to 8.19058, saving model to weights.best.hdf5
98/98 [==============================] - 6s 62ms/step - loss: 8.1906 - mean_squared_error: 910.5417 - val_loss: 7.6558 - val_mean_squared_error: 811.6011
Epoch 3/100
97/98 [============================>.] - ETA: 0s - loss: 7.3522 - mean_squared_error: 736.2031
Epoch 00003: loss improved from 8.19058 to 7.35255, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 7.3525 - mean_squared_error: 736.2403 - val_loss: 6.8044 - val_mean_squared_error: 650.5342
Epoch 4/100
97/98 [============================>.] - ETA: 0s - loss: 6.6166 - mean_squared_error: 621.1281
Epoch 00004: loss improved from 7.35255 to 6.61435, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 6.6143 - mean_squared_error: 620.6105 - val_loss: 6.2180 - val_mean_squared_error: 572.2390