Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow:CNN根本没有学习_Python_Tensorflow_Conv Neural Network - Fatal编程技术网

Python Tensorflow:CNN根本没有学习

Python Tensorflow:CNN根本没有学习,python,tensorflow,conv-neural-network,Python,Tensorflow,Conv Neural Network,我刚刚创建了自己的CNN,它从磁盘读取数据并尝试学习。 但重量似乎根本没有学习,它们都是随机化的 偏见只改变了一点点。我已经尝试过使用灰度图像,但没有成功。我还试图将我的数据集减少到我认为应该有效的两个类。但测量精度低于50%(可能我计算的精度是错误的) 下面是一些代码: x = tf.placeholder(tf.float32, [None, n_input]) y = tf.placeholder(tf.float32, [None, classes]) weights = { '

我刚刚创建了自己的CNN,它从磁盘读取数据并尝试学习。 但重量似乎根本没有学习,它们都是随机化的

偏见只改变了一点点。我已经尝试过使用灰度图像,但没有成功。我还试图将我的数据集减少到我认为应该有效的两个类。但测量精度低于50%(可能我计算的精度是错误的)

下面是一些代码:

x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, classes])
weights = {
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
    'wd1': tf.Variable(tf.random_normal([12*12*64, 1024])),
    'out': tf.Variable(tf.random_normal([1024, classes]))
}
biases = {
    'bc1': tf.Variable(tf.random_normal([32])),
    'bc2': tf.Variable(tf.random_normal([64])),
    'bd1': tf.Variable(tf.random_normal([1024])),
    'out': tf.Variable(tf.random_normal([classes]))
}

pred = model.conv_net(x, weights, biases, keep_prob, imgSize)

with tf.name_scope("cost"):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
with tf.name_scope("optimizer"):
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
with tf.name_scope("accuracy"):
    correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    while(step < epochs):
         batch_x, batch_y = batch_creator(batch_size, train_x.shape[0], 'train')
         sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})
          if(step % display_step == 0):
                 batchv_x, batchv_y = batch_creator(batch_size, val_x.shape[0], 'val')
                 summary, loss, acc = sess.run([merged, cost,  accuracy], feed_dict={x: batchv_x, y: batchv_y})
                 train_writer.add_summary(summary, step)
谢谢你的帮助

PS:这是第二个卷积层的一些过滤器的样子(不管以后有多少个历元)


我已使用cifar-10数据库尝试了您的网络

恐怕这个问题是由庞大的参数造成的,尤其是在fc1层。您可以尝试减少卷积层中的内核数,比如除以2,并在池层中使用4或6作为k,以减少空间维度。然后你可以减少很多fc1层的权重

当参数很多时,要注意权重初始化。使用
tf.contrib.layers.xavier_初始值设定项()
tf.random_normal_初始值设定项(stddev=np.sqrt(2.0/n))
,以获得更好的初始化效果


在减少参数和更好地初始化权重后,cifar-10上的损失开始收敛。您可以在自己的数据库中尝试此操作。

您没有在会话中运行
init
,以便初始化变量。你没有因此而得到一个错误吗?我正在运行init,我只是忘记了复制和粘贴它。我编辑了我的问题。非常感谢。啊,好的,我明白了。。。不过,您只运行了一次优化器。通常,您需要在整个数据集上进行多次(“历次”)训练,然后才能看到实现目标的任何进展。或者有一些隐式循环?它在一个循环中运行。我只是尽可能多地删除代码来复制这里的代码(我知道这是基本的,但我只是在考虑常见的怀疑),我假设您正在确保
init
操作没有在循环中运行,对吗?当然还有会话创建本身。据我所知,这个模型在我看来很好;当我遇到这种错误时,我发现这通常是一些更简单的控制流错误。非常感谢。现在,我将xavier init添加到权重中,并大大减少了参数(8 filter conv1,16 filter conv2,两次合并4。如果我运行它,我会得到这个acc/成本。对于培训,我使用80 k 48x48灰度图像,70:30分割进行验证。它们被分成43个热门类。对不起,对于我使用cifar-10的培训,我也使用恒定初始化0.01进行偏差。如果你也尝试一下,如果我仍然使用ra呢ndom初始化对于偏差,训练不收敛的可能性很小(1/5)。并且尝试使用学习率和批量大小。在我的例子中,我使用了0.01(与AdamopOptimizer一起)和128次。大约100~500次迭代,损失明显减少。我使用了您的建议,并对它们进行了一些处理,但没有成功。结果如下:。我还在此处上载了完整的代码:。我使用的数据库可以在此处找到:谢谢!您如何拆分培训集和验证集?我想y表示在分割到训练集和验证集之前是否已经对整个数据集进行了洗牌。如果没有,网络在训练过程中看不到验证集中的示例。另一个建议是,你不必训练太久就能得到结果。也许10K~30K迭代就足够了。训练/测试数据的文件列表在使用tensorflow阅读之前已经随机进行了。
def conv2d(x, W, b, strides=1):
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)

def maxpool2d(x, k=2):
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
                          padding='SAME')

def conv_net(x, weights, biases, dropout, imgSize):
    with tf.name_scope("Reshaping_data") as scope:
        x = tf.reshape(x, shape=[-1, imgSize, imgSize, 1], name="inp") #(?, 48, 48, 1)

    with tf.name_scope("Conv1") as scope:
        conv1 = conv2d(x, weights['wc1'], biases['bc1'])
        conv1 = maxpool2d(conv1, k=2) #(?, 24, 24, 32)

    with tf.name_scope("Conv2") as scope:
        conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
        conv2 = maxpool2d(conv2, k=2) #(?, 12, 12, 64)

    with tf.name_scope("FC1") as scope:
        fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) #(?, 9216)
        fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) #(?, 1024)
        fc1 = tf.nn.relu(fc1) #(?, 1024)

    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'], name="out") #(?, 43)
    return out