gpt4 book ai didi

python - Tensorflow 中的 CNN - 损失保持不变

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:56 25 4
gpt4 key购买 nike

我刚刚开始从事机器学习职业,想要创建简单的 CNN 来对 2 种不同种类的叶子(属于 2 种不同的树种)进行分类。在收集大量树叶图片之前,我决定在 Tensorflow 中创建非常小、简单的 CNN,并仅在一张图像上对其进行训练,以检查代码是否正常。我将尺寸为 256x256(x 3 个 channel )的照片标准化为 <0,1> 并创建了 4 层(2 个卷积层和 2 个密集层)网络。不幸的是,损失从一开始就几乎总是趋向于某个恒定值(通常是某个整数)。我认为图片有问题,所以我用相同尺寸的随机 numpy 数组替换它。不幸的是,损失仍然持续存在。有时网络似乎在学习,因为损失在减少,但大多数时候从一开始就保持不变。谁能帮忙解释一下,为什么会这样?我读到,用一个示例进行训练是检查代码是否缺少错误的最佳方法,但我与它斗争的时间越长,我看到的就越少。

这是我的代码(基于此 TensorFlow 教程 1 )。我使用指数线性单位,因为我认为我的问题是由初始化错误的 ReLU 中的 0 梯度引起的。

import matplotlib.pyplot as plt
import numpy as np
from numpy import random
from sklearn import utils
import tensorflow as tf

#original dataset of 6 leaves
# input = [ndimage.imread("E:\leaves\dab1.jpg"),
# ndimage.imread("E:\leaves\dab2.jpg"),
# ndimage.imread("E:\leaves\dab3.jpg"),
# ndimage.imread("E:\leaves\klon1.jpg"),
# ndimage.imread("E:\leaves\klon2.jpg"),
# ndimage.imread("E:\leaves\klon3.jpg")]

#normalize each image (originally uint8)
#input=[input/255 for i in range(len(input))

#temporary testing dataset, mimicking 6 images, each 3-channel, of dimension 256x256
input=[random.randn(256,256,3)]
# random.randn(256, 256, 3),
# random.randn(256, 256, 3),
# random.randn(256, 256, 3),
# random.randn(256, 256, 3),
# random.randn(256, 256, 3)]

#each image belong to one of two classes
labels=[[1]]#,[1,0],[1,0],[0,1],[0,1],[0,1]]


def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=.1)
return tf.Variable(initial)

def bias_variable(shape):
initial = tf.truncated_normal(shape, stddev=.1)
return tf.Variable(initial)

def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

x = tf.placeholder(tf.float32, shape=[None, 256,256,3])
y_ = tf.placeholder(tf.float32, shape=[None, 1])

x_image = tf.reshape(x, [-1,256,256,3])

#first conv layer
W_conv1 = weight_variable([5,5, 3,8])
b_conv1 = bias_variable([8])
h_conv1 = tf.nn.elu(conv2d(x_image, W_conv1) + b_conv1)

#second conv layer
W_conv2 = weight_variable([5,5, 8,16])
b_conv2 = bias_variable([16])
h_conv2 = tf.nn.elu(conv2d(h_conv1, W_conv2) + b_conv2)

#first dense layer
W_fc1 = weight_variable([256*256*16, 10])
b_fc1 = bias_variable([10])
out_flat = tf.reshape(h_conv2, [-1, 256*256*16])
h_fc1 = tf.nn.elu(tf.matmul(out_flat, W_fc1) + b_fc1)

#second dense layer
W_fc2 = weight_variable([10, 1])
b_fc2 = bias_variable([1])
h_fc2 = tf.nn.elu(tf.matmul(h_fc1, W_fc2) + b_fc2)

#tried also with softmax with logits
cross_entropy=tf.losses.mean_squared_error(predictions=h_fc2, labels=y_)
train_step = tf.train.AdamOptimizer(1e-3).minimize(cross_entropy)

print("h2", h_fc2.shape)
print("y", y_.shape)

sess=tf.Session()
sess.run(tf.global_variables_initializer())
loss = []
for i in range(10):
sess.run(train_step, feed_dict={x:input, y_:labels})
input, labels = utils.shuffle(input, labels)
loss.append(sess.run(cross_entropy, feed_dict={x:input, y_:labels}))
print(i, " LOSS: ", loss[-1])

np.set_printoptions(precision=3, suppress=True)
for i in range(len(input)):
print(labels[i], sess.run(h_fc2, feed_dict={x:[input[i]], y_:[labels[i]]}))

plt.plot(loss)
plt.show()

这是我尝试过的列表:

  1. 上面的基本代码导致损失几乎总是等于 4.0
  2. 将训练时间延长至 100 个时期。事实证明,实现持续损失的可能性增加了。这很奇怪,因为在我看来,epoch 的数量应该在训练的早期阶段改变任何事情。
  3. 我将 I 层的特征图数量更改为 32 个,II 层的特征图数量更改为 64 个,密集层的特征图数量更改为 100 个神经元
  4. 因为我的输出是二进制的,所以最初我只使用单个输出。我将其更改为排除 2 个输出。将损失更改为 2.5。事实证明,我的输出往往是 [-1,-1],而标签是 [1,0]
  5. 我尝试了各种学习率,从 0.001 到 0.00005
  6. 我初始化了权重和偏差,标准差等于 2 而不是 0.1。损失似乎有所减少,但达到了很高的值,例如 1e10。所以我将 epoch 的数量从 10 改为 100.. 同样,损失从一开始就是 2.5。返回10个epoch后,loss仍为2.5
  7. 我将数据集扩展至 6 个元素。损失与之前相同。

有谁知道为什么会发生这种情况吗?据我所知,如果网络不能泛化,损失不会减少,而是会增加/振荡,但不会保持恒定?

最佳答案

就我而言,我没有标准化图像input(cifar-10)。应该从 [0, 255] 标准化为 [0 ,1]

这是我的代码:

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

x_train = x_train.astype('float32')

x_test = x_test.astype('float32')

x_train /= 255

x_test /= 255 # [0, 255] ---> [0, 1]

希望能帮到你。

关于python - Tensorflow 中的 CNN - 损失保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com