我在YouTube上观看了一个关于神经网络的教程视频,使用的是Keras。训练数据是随机生成的,模拟了一个虚构的临床试验。神经网络的目标是预测某人是否会出现副作用的概率。视频链接在这里: https://www.youtube.com/watch?v=qFJeN9V1ZsI
这是视频中展示的预测结果: https://i.sstatic.net/oPmQx.png
这是我的一次预测结果: https://i.sstatic.net/xfgWK.png 如果第二个数字是1,或接近1,就意味着他们可能会有副作用。看起来无论我输入什么数据到测试数组中,第二个输出总是1。
我不知道自己哪里做错了。我的代码组织方式略有不同,我没有生成大量的测试数据,但这应该无关紧要,对吧?预测就是预测,不应该改变神经网络。除此之外,我的代码几乎完全相同。我认为她使用的是她的显卡,而我使用的是CPU。我不知道为什么我的结果与她的如此不同。
import numpy as npimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Activation, Dense, Dropout, BatchNormalizationfrom tensorflow.keras.optimizers import Adamfrom tensorflow.keras.metrics import sparse_categorical_crossentropy, categorical_crossentropyfrom tensorflow.keras.metrics import binary_crossentropyfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.utils import shufflefrom random import randintdef main(): model = Sequential([ Dense(units = 16, input_shape= (1, ), activation = "relu"), Dense(units = 32, activation = "relu"), Dense(units = 2, activation="softmax") ]) model.compile(Adam(learning_rate=0.0001), loss='sparse_categorical_crossentropy', metrics=['accuracy']) train_x = []; train_y = []; for x in range(50): randyounger = randint(13,64) train_x.append(randyounger) train_y.append(1) randolder = randint(65, 100) train_x.append(randolder) train_y.append(0) for x in range(1000): randyoung = randint(13, 64) train_x.append(randyoung) train_y.append(0) randold = randint(65, 100) train_x.append(randold) train_y.append(1) train_x = np.array(train_x) train_y = np.array(train_y) train_y, train_x = shuffle(train_y, train_x) scaler = MinMaxScaler(feature_range=(0,1)) scaled_train_x = scaler.fit_transform(np.reshape(train_x, (-1, 1))) model.fit(x = scaled_train_x, y = train_y, validation_split=0.1, batch_size=10, epochs=30, verbose=2, shuffle=True) # test network test_x = np.array([20, 25, 40, 10, 80, 89, 95, 84, 68, 30, 16, 68, 56, 32, 95, 95, 95, 95, 95]) scaled_test_x = scaler.fit_transform(np.reshape(test_x, (-1, 1))) predictions = model.predict(x = test_x, batch_size=1, verbose=2) for x in predictions: print(x)if __name__ == '__main__': main()
是的,我知道我的问题很糟糕。我只是不知道该问谁。我不能直接问这个视频的创作者我做错了什么。我不认识任何程序员。我不知道该查什么。对不起。
回答:
您使用的是原始的test_x
,而不是缩放后的版本。只要将predictions = model.predict(x = test_x, batch_size=1, verbose=2)
替换为predictions = model.predict(x = scaled_test_x, batch_size=1, verbose=2)
即可。