python - 在 Keras 模型中使用 fit_generator
问题描述
我正在尝试使用 Keras 和 Tensorflow 后端训练神经网络。我X
的是我已经处理并转换成序列的文本描述。现在,我y
是一个稀疏矩阵,因为它是一个多标签分类并且我有很多输出类。
>>> y
<30405x3387 sparse matrix of type '<type 'numpy.int64'>'
with 54971 stored elements in Compressed Sparse Row format>
为了训练模型,我尝试定义一个批处理生成器:
def batch_generator(x, y, batch_size=32):
n_batches_per_epoch = x.shape[0]//batch_size
for i in range(n_batches_per_epoch):
index_batch = range(x.shape[0])[batch_size*i:batch_size*(i+1)]
x_batch = x[index_batch,:]
y_batch = y[index_batch,:].todense()
yield x_batch, np.array(y_batch)
我将我的数据划分为:
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
我将我的模型定义为:
model = Sequential()
# Create architecture, add some layers.
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
我正在将我的模型训练为:
model.fit_generator(generator=batch_generator(x_train, y_train), steps_per_epoch=(x_train[0]/32), epochs=200, callbacks=the_callbacks)
但是我的模型从大约 55% 的准确率开始,很快(在 2 或 3 步内)就变成了 99.95%,这根本没有意义。难道我做错了什么?
解决方案
您需要将损失切换为“categorical_crossentropy”或将指标更改为“crossentropy”以进行多类分类。
在 Keras 的幕后,“准确度”指标实际上是模棱两可的——它根据使用的损失函数选择二元或多类准确度。
https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L375
推荐阅读
- r - 如何在 R 中抑制 download.file()“正在尝试 URL ...”消息?
- mysql - 如果sql查询中的记录相同,如何分配相同的唯一行号?
- reactjs - 在 Ionic/React 中使用“history.push”并将“IonTabs”作为嵌套路由后,页面未呈现
- java - 使用函数返回的值作为新数组的名称
- vba - 如果满足条件,如何删除书签之前的一串文本?
- c# - EF Core - 多对多与另一个外键
- django - 为什么即使路由器不允许迁移,也会创建 django_migrations 表?
- angular - Rxjs:对Typescript的角度可拖动矩形差异鼠标响应
- kubernetes - Permission problem w/ helm3 installation of traefik on port 80 (hostNetwork)
- environment-variables - 如何在 React 应用程序中使用 AWS Amplify 环境变量?