首页 > 解决方案 > 如何在 python 中使用 keras 训练具有列表数组的神经网络

问题描述

我正在尝试使用 tensorflow.keras 训练神经网络,但我不明白如何使用 numpy 列表数组(在 python3 中)训练它。

我试图改变图层的输入形状,但我真的不明白它是如何工作的。

import tensorflow as tf
from tensorflow import keras
import numpy as np

# Create the array of data

train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_data)

### Build the model

model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3,2)),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])

model.compile(optimizer='sgd',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)

当调用 model.fit 时,错误是“检查输入时出错:预期的 dense_input 具有 3 个维度,但得到的数组的形状为 (2, 3)”。

标签: pythontensorflowkeras

解决方案


在定义 Keras 模型时,您必须为模型的第一层提供输入形状。

例如,如果您的训练数据有n行和m特征,即形状:(n,m),您必须将模型input_shape的第一Dense层设置为,(m, )即模型应该期望m特征进入其中。

现在来到你的玩具数据,

train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_label)

在这里,train_data_np.shape就是(2, 3)23特征,那么你必须像这样定义模型,

model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3, )),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])

现在,您的标签是[[1,2,3],[4,5,6]]. 在正常的3类分类任务中,这将是一个带有10s 的单热向量。但是让我们把它放在一边,因为这是一个检查 Keras 的玩具示例。

如果目标标签 ie y_train是 one-hot 那么你必须使用categorical_crossentropyloss 而不是sparse_categorical_crossentropy.

所以你可以像这样编译和训练模型

model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)


Epoch 1/10
2/2 [==============================] - 0s 61ms/step - loss: 11.5406 - acc: 0.0000e+00
Epoch 2/10
2/2 [==============================] - 0s 0us/step - loss: 11.4970 - acc: 0.5000
Epoch 3/10
2/2 [==============================] - 0s 0us/step - loss: 11.4664 - acc: 0.5000
Epoch 4/10
2/2 [==============================] - 0s 498us/step - loss: 11.4430 - acc: 0.5000
Epoch 5/10
2/2 [==============================] - 0s 496us/step - loss: 11.4243 - acc: 1.0000
Epoch 6/10
2/2 [==============================] - 0s 483us/step - loss: 11.4087 - acc: 1.0000
Epoch 7/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3954 - acc: 1.0000
Epoch 8/10
2/2 [==============================] - 0s 997us/step - loss: 11.3840 - acc: 1.0000
Epoch 9/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3740 - acc: 1.0000
Epoch 10/10
2/2 [==============================] - 0s 995us/step - loss: 11.3653 - acc: 1.0000

推荐阅读