代码之家  ›  专栏  ›  技术社区  ›  zoecarver

模型不学习-keras

  •  0
  • zoecarver  · 技术社区  · 6 年前

    我在数据库中生成40000个数据点 get_data 功能。它创建两个数组;一种输入数组,按一定顺序包含1和0,输出为1或0。

    问题

    当我运行代码时,它似乎没有学习,每次我训练它时,得到的结果都会有很大的不同。

    from keras import models
    from keras import layers
    
    import numpy as np
    
    from random import randint
    
    
    def get_output(a, b): return 0 if a == b else 1
    
    
    def get_data ():
        data = []
        targets = []
    
        for _ in range(40010):
            a, b = randint(0, 1), randint(0, 1)
    
            targets.append(get_output(a, b))
            data.append([a, b])
    
        return data, targets
    
    
    data, targets = get_data()
    
    data = np.array(data).astype("float32")
    targets = np.array(targets).astype("float32")
    
    test_x = data[40000:]
    test_y = targets[40000:]
    
    train_x = data[:40000]
    train_y = targets[:40000]
    
    model = models.Sequential()
    
    # input
    model.add(layers.Dense(2, activation='relu', input_shape=(2,)))
    
    # hidden
    # model.add(layers.Dropout(0.3, noise_shape=None, seed=None))
    model.add(layers.Dense(2, activation='relu'))
    # model.add(layers.Dropout(0.2, noise_shape=None, seed=None))
    model.add(layers.Dense(2, activation='relu'))
    
    # output
    model.add(layers.Dense(1, activation='sigmoid')) # sigmoid puts between 0 and 1
    
    model.summary() # print out summary of model
    
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    
    res = model.fit(train_x, train_y, epochs=2000, batch_size=200, validation_data=(test_x, test_y)) # train
        
    print 'predict: \n', test_x
    print model.predict(test_x)
    

    [[0. 1.]
     [1. 1.]
     [1. 1.]
     [0. 0.]
     [1. 0.]
     [0. 0.]
     [0. 0.]
     [0. 1.]
     [1. 1.]
     [1. 0.]]
    [[0.6629775 ]
     [0.00603844]
     [0.00603844]
     [0.6629775 ]
     [0.6629775 ]
     [0.6629775 ]
     [0.6629775 ]
     [0.6629775 ]
     [0.00603844]
     [0.6629775 ]]
    

    1 回复  |  直到 4 年前
        1
  •  6
  •   desertnaut SKZI    6 年前

    你的问题有几个问题。

    首先,你的进口是相当非正统的(与你的问题无关,没错,但它有助于坚持一些惯例):

    from keras.models import Sequential
    from keras.layers import Dense
    import numpy as np
    

    X = np.array([[0,0],[0,1],[1,0],[1,1]])
    y = np.array([[0],[1],[1],[0]])
    

    第四,你应该从一个简单的一个隐藏层模型开始(略多于2个单元,并且没有退出),然后逐步进行 如果需要的话 :

    model = Sequential()
    model.add(Dense(8, activation="relu", input_dim=2))
    model.add(Dense(1, activation="sigmoid"))
    
    model.compile(loss='binary_crossentropy', optimizer='adam')
    model.fit(X, y, batch_size=1, epochs=1000)
    

    这将使您的损失降到~0.12;它对函数的学习情况如何?

    model.predict(X)
    # result:
    array([[0.31054294],
           [0.9702552 ],
           [0.93392825],
           [0.04611744]], dtype=float32)
    
    y
    # result:
    array([[0],
           [1],
           [1],
           [0]])
    

    这够好吗?嗯,我不知道-正确的答案总是“视情况而定”!但你现在有了一个起点(即一个可以论证的网络) 你可以从中继续进行进一步的实验。。。