python-3.x - Tensorflow CNN 零精度?
问题描述
我有一个包含 25000 张彩色图片 100*100(*3) 的数据集,我正在尝试用一个卷积层构建一个简单的神经网络。它的细胞图片是否被疟疾感染,所以我的输出是 2。但是对于每批,我得到 0% 的准确度。我的批次大小为 1,但我尝试了其他大小,但准确度仍然为 0%。
我的有线电视新闻网:
def simple_nn(X_training, Y_training, X_test, Y_test):
input = 100*100*3
h1 = 100
batch_size = 1
learning_rate = 0.000001
dropout = 0.2
X = tf.placeholder(tf.float32, [batch_size, 100, 100, 3], name="is_train")
Y_ = tf.placeholder(tf.float32, [None, 2])
#Layers
conv1 = tf.layers.conv2d(X, filters=64, kernel_size=4,
strides=2, padding='SAME',
activation=tf.nn.relu, name="conv1")
conv1 = tf.layers.batch_normalization(conv1)
conv1 = tf.layers.max_pooling2d(conv1, 2, 2)
conv2 = tf.layers.conv2d(conv1, filters=128, kernel_size=3,
strides=2, padding='SAME',
activation=tf.nn.relu, name="conv2")
conv2 = tf.layers.dropout(conv2, rate=dropout)
conv3 = tf.layers.conv2d(conv2, filters=256, kernel_size=3,
strides=2, padding='SAME',
activation=tf.nn.relu, name="conv3")
conv3 = tf.layers.dropout(conv3, rate=dropout)
conv4 = tf.layers.conv2d(conv3, filters=64, kernel_size=3,
strides=2, padding='SAME',
activation=tf.nn.relu, name="conv4")
conv4 = tf.layers.max_pooling2d(conv4, 2, 2)
conv5 = tf.layers.conv2d(conv4, filters=32, kernel_size=3,
strides=2, padding='SAME',
activation=tf.nn.relu, name="conv5")
Y = tf.reshape(conv5, [batch_size,-1])
logits = tf.layers.dense(Y, units=2, activation=tf.nn.relu)
# loss function
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y_, logits=logits)
loss = tf.reduce_mean(tf.cast(cross_entropy, tf.float32))
# % of correct answers found in batch
is_correct = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train_step = optimizer.minimize(cross_entropy)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(math.floor(len(X_training)/batch_size)):
st = batch_size * i
end = st + batch_size
if end >= math.floor(len(X_training)) - batch_size:
break
batch_X, batch_Y = X_training[st:end], Y_training[st:end]
train_data={X: batch_X, Y_: batch_Y}
sess.run(train_step, feed_dict=train_data)
#Get the accuracy and loss
a, l = sess.run([accuracy, cross_entropy], feed_dict=train_data)
print("acc : "+str(a)+" , loss : "+str(l))
我的输出:
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.69436306]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931662]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6925567]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.69259375]
acc : 0.0 , loss : [0.6912933]
acc : 0.0 , loss : [0.6957785]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6990725]
acc : 0.0 , loss : [0.69037354]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6991633]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.700589]
acc : 0.0 , loss : [0.6931472]
我用一个简单的非卷积层得到了 65%(意思是acc=0.65
),但是自从我切换到 conv 之后,acc=0.0
. 首先,由于某种原因,我loss
在使用卷积层时在我的变量中返回了准确性,但我现在不这么认为,我认为我的损失函数有问题。即使我将模型减少到一层,同样的事情也会发生,而且我loss
的模型仍然存在0.69
。
解决方案
您应该最小化减少的向量。更改此行
train_step = optimizer.minimize(cross_entropy)
对此:
train_step = optimizer.minimize(loss)
此外,您不包括logits
在准确性计算中的层。做这个:
is_correct = tf.equal(tf.argmax(logits,1), tf.argmax(Y_,1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
此外,您正在对logits
图层应用两个激活。首先你有tf.nn.relu
然后你使用softmax
(with tf.nn.softmax_cross_entropy_with_logits_v2()
)。不确定你是故意这样做的。
推荐阅读
- mocking - 当组件有多个 useQuery 时,Apollo 的 MockedProvider 不工作?
- dart - 如何从一百万飞镖中取出十万
- python - 用python存储非常大的文件的合适选择是什么?.csv 文件截断某些单元格中的数据
- ffmpeg - 带 Alpha 通道的 HTML5 直播
- oracle - OffsetDateTime java8 ojdbc8 oracle insert cet to cest问题
- maven - Maven代理认证
- python - 在多个子图上跟随鼠标的垂直光标
- https - IBM Watson Assistant Endpoint URL 不再适用于 Alexa Skill。Alexa 无法到达端点
- excel - Powershell export-excel 处理工作表
- python - 熊猫(Excel):如何在开始时读取带有零的完整值?