CNN没有学习

2024-10-01 09:36:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚创建了自己的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)

我查看了创建的批处理,它们看起来很好。 batch_x是一个数组,其长度为2304个浮点值,代表48x48图像 批处理是一个带有一个热标签的数组:[0 0。。。0 1 0。。。0 0]

这是我的模型:

^{pr2}$

谢谢你的帮助!在

PS:这就是第二个卷积层的一些滤波器的样子(不管过了多少个时代)

conv2filter


Tags: nametfstepwithbatchtrainrandomvariable
1条回答
网友
1楼 · 发布于 2024-10-01 09:36:01

我用cifar-10数据库试过你的网络。在

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

当参数很多时,要注意权重初始化。使用tf.contrib.layers.xavier_initializer()或{}进行更好的初始化。在

在减少参数并对权重进行更好的初始化之后,cifar-10上的损失开始收敛。你可以尝试用你自己的数据库。在

相关问题 更多 >