Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 CNN和Keras进行简单的二元分类,但仅获得50%的acc_Python_Tensorflow_Keras_Jupyter Notebook_Google Colaboratory - Fatal编程技术网

Python CNN和Keras进行简单的二元分类,但仅获得50%的acc

Python CNN和Keras进行简单的二元分类,但仅获得50%的acc,python,tensorflow,keras,jupyter-notebook,google-colaboratory,Python,Tensorflow,Keras,Jupyter Notebook,Google Colaboratory,今天我尝试使用fit_生成器函数对普通黑白图像进行二值分类,但它只给了我50%的准确率 这只是我的编码练习,但我认为准确率应该达到100%。所以我很好奇我的错误是什么 我在Google colaboratory中完成所有代码 这是我的密码 设置 import numpy as np import random from matplotlib import pyplot as plt img_height = 150 img_width = 150 batch_size = 8 class M

今天我尝试使用fit_生成器函数对普通黑白图像进行二值分类,但它只给了我50%的准确率

这只是我的编码练习,但我认为准确率应该达到100%。所以我很好奇我的错误是什么

我在Google colaboratory中完成所有代码

这是我的密码

设置

import numpy as np
import random
from matplotlib import pyplot as plt

img_height = 150
img_width = 150
batch_size = 8

class MyDataset(object):

    def __init__(self):
        placeholder = 0

    def generator(self):
        is_black = True
        X, y = [], []
        while True:
            if is_black:
                img = np.full((img_height, img_width, 3), 255)
            else:
                img = np.zeros((img_height, img_width, 3))
            img = img / 255.
            X.append(img)
            y.append(is_black)
            is_black = not is_black

            if len(X) >= batch_size:
                c = list(zip(X, y))
                random.shuffle(c)
                X, y = zip(*c)
                yield np.asarray(X, dtype=np.float32), np.asarray(y, dtype=np.float32)
                X, y = [], []

dataset = MyDataset()
sample_gen = dataset.generator()
可视化数据

创建模型

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit_generator(
    sample_gen, 
    steps_per_epoch = 100//batch_size , 
    epochs=300)
我创建了一个小尺寸的模型。它只有9个参数

import tensorflow as tf

model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(filters=1, kernel_size=(1,1), padding='same', 
                                 activation='relu', input_shape=(img_height, img_width, 3)))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(img_height//2,img_height//2)))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(1, activation='softmax'))

model.summary()
列车型号

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit_generator(
    sample_gen, 
    steps_per_epoch = 100//batch_size , 
    epochs=300)
结果

200多个时代之后,精度仍然是0.5

Epoch 218/300
12/12 [==============================] - 0s 8ms/step - loss: 7.9712 - acc: 0.5000
Epoch 219/300
12/12 [==============================] - 0s 8ms/step - loss: 7.9712 - acc: 0.5000
Epoch 220/300
12/12 [==============================] - 0s 8ms/step - loss: 7.9712 - acc: 0.5000
Epoch 221/300
12/12 [==============================] - 0s 9ms/step - loss: 7.9712 - acc: 0.5000
Epoch 222/300
12/12 [==============================] - 0s 8ms/step - loss: 7.9712 - acc: 0.5000

我已经学习了一些关于CNN的知识,我是Keras的初学者。

问题在于模型定义的末尾,具体如下:

model.add(tf.keras.layers.Dense(1, activation='softmax'))
通过应用softmax,您——根据定义——强制其输出总和为1。一个值能够符合的唯一方法是将其本身变为1。因此,没有信息通过网络传播

要解决此问题,请将softmax转换为逻辑S形,例如:

model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

这样,您还可以将模型的输出解释为数据来自类
1

的后验概率,即不在输出上应用softmax。它可以。。。softmax,因此无论输入如何,模型的输出始终为1。逻辑乙状结肠是最好的选择。谢谢你的回答。你帮了我很多!!!。为了解决这个问题,我改变了2个激活函数。(从
relu
tanh
softmax
sigmoid