我正在尝试按照Tensorflow的教程(我是一个初学者)学习结构化数据模型,并在过程中进行了一些修改。
我的目的是创建一个模型,我可以向其提供数据(以CSV格式),数据看起来像这样(示例只有两个特征,但我希望在弄明白后扩展它):
power_0,power_1,result0.2,0.3,draw0.8,0.1,win0.3,0.1,draw0.7,0.2,win0.0,0.4,lose
我使用以下代码创建了模型:
def get_labels(df, label, mapping): raw_y_true = df.pop(label) y_true = np.zeros((len(raw_y_true))) for i, raw_label in enumerate(raw_y_true): y_true[i] = mapping[raw_label] return y_truetf.compat.v1.enable_eager_execution()mapping_to_numbers = {'win': 0, 'draw': 1, 'lose': 2}data_frame = pd.read_csv('data.csv')data_frame.head()train, test = train_test_split(data_frame, test_size=0.2)train, val = train_test_split(train, test_size=0.2)train_labels = np.array(get_labels(train, label='result', mapping=mapping_to_numbers))val_labels = np.array(get_labels(val, label='result', mapping=mapping_to_numbers))test_labels = np.array(get_labels(test, label='result', mapping=mapping_to_numbers))train_features = np.array(train)val_features = np.array(val)test_features = np.array(test)model = tf.keras.Sequential([ tf.keras.layers.Dense(128, activation='relu', input_shape=(train_features.shape[-1],)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.3), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.3), tf.keras.layers.Dense(3, activation='sigmoid'),])model.compile( optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'], run_eagerly=True)epochs = 10batch_size = 100history = model.fit( train_features, train_labels, epochs=epochs, validation_data=(val_features, val_labels))input_data_frame = pd.read_csv('input.csv')input_data_frame.head()input_data = np.array(input_data_frame)print(model.predict(input_data))
input.csv看起来如下:
power_0,power_10.8,0.10.7,0.2
实际结果是:
[[0.00604381 0.00242573 0.00440606] [0.01321151 0.00634229 0.01041476]]
我期望得到每个标签(’win’, ‘draw’ 和 ‘lose’)的概率,有人能帮我解决这个问题吗?
提前感谢
回答:
使用您的示例,这对我来说效果很好:
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(train_features.shape[-1],)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(16, activation='relu'), tf.keras.layers.Dense(3, activation='softmax'),])model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'], run_eagerly=True)
使用Flatten层