我使用Tensorflow 1.14.0和Keras 2.2.4。以下代码实现了一个简单的神经网络:
import numpy as np
np.random.seed(1)
import random
random.seed(2)
import tensorflow as tf
tf.set_random_seed(3)
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.layers import Input, Dense, Activation
x_train=np.random.normal(0,1,(100,12))
model = Sequential()
model.add(Dense(8, input_shape=(12,)))
# model.add(tf.keras.layers.BatchNormalization())
model.add(Activation('linear'))
model.add(Dense(12))
model.add(Activation('linear'))
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(x_train, x_train,epochs=20, validation_split=0.1, shuffle=False,verbose=2)
Run Code Online (Sandbox Code Playgroud)
20个纪元后的最终val_loss为0.7751。当我取消注释添加批处理规范化层的唯一注释行时,val_loss更改为1.1230。
我的主要问题是方法更复杂,但同样的事情也会发生。由于激活是线性的,因此在激活之后还是之前将批处理归一化都没关系。
问题:为什么批量规范化无济于事?有什么我可以更改的,以便批量标准化可以在不更改激活功能的情况下改善结果吗?
收到评论后更新:
具有一个隐藏层和线性激活的NN类似于PCA。有大量的论文。对我来说,此设置在隐藏层和输出的所有激活功能组合中提供的MSE最小。
声明线性激活的某些资源表示PCA:
https://arxiv.org/pdf/1702.07800.pdf
https://link.springer.com/article/10.1007/BF00275687
https://www.quora.com/How-can-I-make-a-neural-network-to-work-as-a-PCA
我已经在python中使用pandas编写了一个由数字和字符串组成的数据框:
import pandas as pd
import numpy as np
d = {'col1': [1, 5,1,5,1,5,1,5], 'col2': [20,20,40,40,20,20,40,40],\
'col3': np.arange(1,9)*0.1,\
'col4':['Jen','Ross','Chan','Mon','Joe','Phebe','Janice','Gunter']}
df = pd.DataFrame(data=d)
Run Code Online (Sandbox Code Playgroud)
数据框如下所示:
col1 col2 col3 col4
0 1 20 0.1 Jen
1 5 20 0.2 Ross
2 1 40 0.3 Chan
3 5 40 0.4 Mon
4 1 20 0.5 Joe
5 5 20 0.6 Phoebe
6 1 40 0.7 Janice
7 5 40 0.8 Gunther
Run Code Online (Sandbox Code Playgroud)
使用groupby,我想为(x,y)的每个唯一对找到col3的最小值,其中x属于col1,y属于col2。我还需要知道col4中对应的名称是什么,它导致了这样的分钟。我做了:
df2=df.groupby(['col1','col2']).min()
print(df2)
Run Code Online (Sandbox Code Playgroud)
我有:
col1 col2 col3 col4
1 20 0.1 Jen
40 …Run Code Online (Sandbox Code Playgroud)