个人感觉tensorflow2更多重点放在了高层API上,尤其是keras。官方例子更多的放在了keras上,下面我们将使用通过介绍两种简单的数据处理方式以配个keras训练。实际上两种方式对应了keras额sequential和models方式。
下面的例子和官网一样使用心脏病数据集分类。这里使用离线的方式训练,假设你已经下载了需要的文件
import tensorflow as tf
import pandas as pd
csv_file = 'heart.csv'
datas = pd.read_csv(csv_file)
# 因为有一列数据thal不是数值类型,需要转换这列为数值类型
datas['thal'] = pd.Categorical(datas['thal'])
datas['thal'] = datas.thal.cat.codes
# 创建数据集
train_x,train_y = datas,datas.pop('target')
dataset = tf.data.Dataset.from_tensor_slices((train_x.values,train_y.values))
train_dataset = dataset.shuffle(buffer_size=len(datas)).batch(1)
# 创建模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(10,activation='relu'),
tf.keras.layers.Dense(1,activation='sigmoid')
])
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(train_dataset,epochs=10)
训练输出:
303/303 [==============================] - 0s 2ms/step - loss: 0.6113 - accuracy: 0.8086
使用Sequential方式传入的训练数据是(numpy,numpy)类型的数据。
常规的模型创建方式,通过一个个layer搭建神经网络然后输入数据进去计算结果。
使用此方式传入的数据为dict{feature_name:feature_values}
。
import tensorflow as tf
import pandas as pd
csv_file = 'heart.csv'
datas = pd.read_csv(csv_file)
# 因为有一列数据thal不是数值类型,需要转换这列为数值类型
datas['thal'] = pd.Categorical(datas['thal'])
datas['thal'] = datas.thal.cat.codes
train_x,train_y = datas,datas.pop('target')
# feature1:Input(),feature2:Input()
inputs = {key:tf.keras.layers.Input(shape=(),name=key) for key in datas.keys()}
x = tf.stack(list(inputs.values()),axis=-1)
x = tf.keras.layers.Dense(10,activation='relu')(x)
output = tf.keras.layers.Dense(1,activation='sigmoid')(x)
model = tf.keras.Model(inputs=inputs,outputs=output)
dict_dataset = tf.data.Dataset.from_tensor_slices((train_x.to_dict('list'),train_y.values)).batch(16)
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(dict_dataset,epochs=20)
结果如下:
19/19 [==============================] - 0s 3ms/step - loss: 2.3420 - accuracy: 0.6271
结构如下:
{feature1:Input(2),'feature2':Input(2)}..-->[input[1],input[2]]-->dense([input[1],input[2])-->output(上层model(x))
通过输入和输出获得模型,然后调用模型训练。
train_x.to_dict('list')
将dataframe转换为map,数据结构为{‘feature_name’;feature_values},其中feature_values为np.array。