我才刚刚开始学习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)
我查看了一些类似的问题,但是,我已经在做建议的事情,或者该建议对发问者来说太具体了。我还尝试了一些相对不同的模型/激活器,所以我不认为这是因为模型太复杂并且数据已经被规范化了,所以这不应该成为问题。但是,正如我说的那样,我对此非常了解,可能是错误的。
答案 0 :(得分:1)
所以我不能保证这会成功,因为我不知道您的数据,而且这是一个非常奇怪的体系结构,但是这里有些地方似乎是错误的:
sigmoid
激活功能from_logits
应该是False
答案 1 :(得分:1)
在单节点的最后一层中使用softmax
激活是不正确的。此外,损失定义中的参数from_logits=True
意味着该模型将产生对数,而不是概率(通常由softmax
和sigmoid
最终激活产生)。
因此,您应该将最后一层更改为
keras.layers.Dense(1) # linear activation by default
或者,您可以将最后一层和损失函数分别更改为
keras.layers.Dense(1, activation='sigmoid')
loss=tf.keras.losses.BinaryCrossentropy(from_logits=False)
根据docs,from_logits=True
的使用在数值上可能更稳定,这可能是在标准Tensorflow分类教程中首选使用{here和{{ 3}})。