【发布时间】:2020-01-15 15:10:59
【问题描述】:
我设计了一个简单的合成数据
tempdataset = np.random.normal(0.0,1.0,[20,10])
templabelset = np.random.normal(0.0,1.0,[20,10])
所以会有 20 个训练样例,NN 输入的大小为 10
我已经用 batchnorm、ReLu 激活实现了一个简单的 10 层深度 ResNet
def resnet_block(self, input_data, num_nodes):
temp = tf.keras.layers.Dense(units=num_nodes)(input_data)
temp = tf.keras.layers.BatchNormalization()(temp)
temp2 = tf.keras.layers.Add()([input_data, temp])
temp3 = tf.keras.layers.Activation(activation=tf.keras.activations.relu)(temp2)
return temp3
def create_model(self):
network = tf.keras.layers.Dense(10,tf.keras.activations.relu)(self.input_vec)
network = tf.keras.layers.BatchNormalization()(network)
for i in range(0, 10):
network = self.resnet_block(network, 10)
network = tf.keras.layers.Dense(10, tf.keras.activations.linear)(network)
return network
def optimize(self, dataset, labelset, ln, epoch):
cost = tf.reduce_mean((self.network - self.label_vec)**2)
train_step = tf.train.GradientDescentOptimizer(ln).minimize(cost)
for i in range(epoch):
_, loss = self.session.run([train_step, cost], feed_dict={self.input_vec: dataset, self.label_vec: labelset})
print(' current epoch ', i, ' and loss at ' , loss)
这里 self.input_vec 是一个 tf.placeholder
然后如果我要通过
对其进行优化with tf.Session() as sess:
NN = ResNet(..... constructors initialization.....)
sess.run(tf.global_variables_initializer())
NN.optimize(tempdataset,templabelset,0.01,10000)
我很快就会失去无穷无尽的损失。
我已经尝试过 (BN, ReLU, Add) 的所有排列,例如 (Add -> Batch -> ReLU)
它仍然给我带来爆炸性的损失。
问题在于,有时这很好,并且确实将损失降到最低,但有时,损失会爆炸式增长。
【问题讨论】:
-
你在用什么
initializer?尝试使用不同的初始化程序。 -
你使用哪种学习率?
标签: python tensorflow machine-learning keras neural-network