Tensorflow模型没有改善

时间:2020-06-18 00:14:12

标签: python tensorflow machine-learning keras deep-learning

我才刚刚开始学习ML / Tensorflow / etc,所以我是新手,仍然真的不知道故障排除方法是什么样的。我的模型目前有问题,因为它似乎从未真正改善过。例如,输出显示为

Epoch 1/10
4/4 [==============================] - 41s 10s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 2/10
4/4 [==============================] - 12s 3s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 3/10
4/4 [==============================] - 10s 3s/step - loss: 0.8833 - accuracy: 0.4300
Epoch 7/1000
4/4 [==============================] - 10s 3s/step - loss: 0.8833 - accuracy: 0.4300

让我担心的主要方面是它根本没有改变,这使我觉得我做的事情完全错了。为了提供更多的上下文和代码,我正在尝试进行一些时间序列分类。基本上,输入是歌曲的标准化时间序列,网络应该对它是否是古典音乐进行分类(输出1表示是,输出0表示不是)。

这是我正在尝试的当前模型。

    model = keras.Sequential([
    keras.layers.Conv1D(filters=100, kernel_size=10000,  strides=5000, input_shape=(1323000, 1), activation='relu'),
    keras.layers.Conv1D(filters=100, kernel_size=10, strides=3, input_shape=(263, 100), activation='relu'),
    keras.layers.LSTM(1000),
    keras.layers.Dense(500, activation='relu'),
    keras.layers.Dense(250, activation='relu'),
    keras.layers.Dense(1, activation='softmax')
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

这就是我获取训练数据的方式(x和y是具有不同歌曲时间序列的字典)。

minute = 1323000
x_train = np.zeros((100, minute, 1))
y_train = np.zeros((100,))
for kk in range(0, 100):
    num = randint(0, 41)
    ts = x[num]
    start = randint(0, len(ts) - minute)
    x_train[kk, :] = np.array([ts[start:(start + minute)]]).T
    y_train[kk] = 1 - y[num]

然后进行培训:

for kk in range(1, 1000):
    x_train, y_train = create_training_set(x, y)
    model.fit(x_train, y_train, epochs=1000)

我查看了一些类似的问题,但是,我已经在做建议的事情,或者该建议对发问者来说太具体了。我还尝试了一些相对不同的模型/激活器,所以我不认为这是因为模型太复杂并且数据已经被规范化了,所以这不应该成为问题。但是,正如我说的那样,我对此非常了解,可能是错误的。

2 个答案:

答案 0 :(得分:1)

所以我不能保证这会成功,因为我不知道您的数据,而且这是一个非常奇怪的体系结构,但是这里有些地方似乎是错误的:

  1. 最后一个密集层应具有sigmoid激活功能
  2. from_logits应该是False

答案 1 :(得分:1)

在单节点的最后一层中使用softmax激活是不正确的。此外,损失定义中的参数from_logits=True意味着该模型将产生对数,而不是概率(通常由softmaxsigmoid最终激活产生)。

因此,您应该将最后一层更改为

keras.layers.Dense(1) # linear activation by default

或者,您可以将最后一层和损失函数分别更改为

keras.layers.Dense(1, activation='sigmoid')

loss=tf.keras.losses.BinaryCrossentropy(from_logits=False)

根据docsfrom_logits=True的使用在数值上可能更稳定,这可能是在标准Tensorflow分类教程中首选使用{here和{{ 3}})。

相关问题